質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1148閲覧

sklearnのbreast_cancerデータを使って、ディープラーニングを試してみたい

hamberger

総合スコア24

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2021/07/14 15:01

<質問対象者>
ゼロから作るDeep learning -pythonで学ぶディープラーニングの理論と実装-
という本を読んだことのある方に初心者より質問です。

手書き数字認識を行うプログラムがch5にあるのですが、これをskleranにあるbreast_cancerに適用して動かしてみたいです。

まず、データの読み込みなどをするために、train_neuralnet.pyに以下を追加しました。

python

1#以下train_neuralnet.pyのプログラム一部 2 3from sklearn.datasets import load_breast_cancer#load_digits 4from sklearn.model_selection import train_test_split 5 6#データの読み込み 7SampleData = load_breast_cancer() 8#特徴データ 9feature = SampleData.data 10#ラベルデータ 11target = SampleData.target 12# 入力値と目標値を抽出 13x_train, x_test, t_train, t_test = train_test_split(feature, target, test_size=0.2) 14 15network = TwoLayerNet(input_size=input_size, hidden_size=10, output_size=2) 16 17iters_num = 10000 18train_size = x_train.shape[0] 19batch_size = 10 20learning_rate = 0.01 21 22. 23. 24. 25

また、今回の分類問題で正しいaccuracyを算出するために、two_layer_net.py内に記述されているaccuracyメソッドにおいて、if文をコメントアウトしました。

python

1#以下two_layer_net.pyのプログラム一部 2 # 正解率の算出 3 def accuracy(self, x, t): 4 y = self.predict(x) 5 y = np.argmax(y, axis=1) 6 #if t.ndim != 1 : t = np.argmax(t, axis=1) #手書き数字認識では必要 7 8 accuracy = np.sum(y == t) / float(x.shape[0]) 9 return accuracy

以上を踏まえてエポック数に対する正答率をプロットしてみたのですが、正答率が常に一定値になってしまいます。この本を読んだことがある方、他に修正が必要な箇所などあればご教示頂けないでしょうか。
なお、skleranから入手した手書き数字のデータに対してはうまく動作しました。
(もちろん、このときは上のif文はコメントアウトせず残しています)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問者様の状況でうまく学習できないのは、データを正規化(標準化)していないからです。

breast_cancerのデータは、列によって、小数点以下のものから1000を超えるものまで、かなりスケールが異なります。このようなデータを直接ニューラルネットにかけると、誤差がスケールが大きいものに影響されて(スケールの小さい列の影響が無視されて)、正常に学習できません。そうした際に必要な技術は、正規化や標準化と呼ばれています。

具体的には質問者様が修正したtrain_neuralnet.pyに、さらに以下を追記することで、データを標準化可能です。

Python

1# feature = SampleData.data のすぐ下に挿入 2from sklearn.preprocessing import StandardScaler 3feature = StandardScaler().fit_transform(feature)

これで実行してみると、ちゃんと学習できるのがわかると思います。

ゼロから〜の書籍では、こういった前処理についてはカバーが浅いと思いますので、前処理に関する書籍をあわせて読むとよいでしょう。

前処理大全

また、以下の記事が、ゼロから〜のわかりにくい部分を解説しており、正規化・標準化についても言及しています。

ゼロから作るDeep Learningとともに学ぶフレームワーク(学習テクニック編)

ゼロから〜だけで学ぶのであれば、6.3 Batch Normalization を適用すれば、前処理での標準化は必要無くなるかもしれません。しかし前処理しないと1つめの層は役立たないため、2層しかないモデルだと学習がうまくいく可能性は少ないと思います。

投稿2021/07/14 23:23

編集2021/07/14 23:32
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hamberger

2021/07/15 02:42

おっしゃる通り、標準化を行うことでうまく学習が進みました。データを確認しておくことの大切さ、そして標準化がなぜ必要なのかを身を以て学ぶことができました。 有用な文献等のご提供も感謝致します。ぜひ読ませていただきます。 Batch normalizationについても、たしかに2層では最初のAffine1の意味がなくなりそうですね。 追伸) データの標準化をしない場合の他の対処法について アクティベーションの分布(この本でいうRelu1から出力されるデータの分布)をできるだけ一様になるようにパラメータの初期値を設定しさえすれば、学習がうまくいくのではないでしょうか。 実際、6.2.3節では、特にReluの場合の重みの初期値について言及されており、『Heの初期値』を設定することで学習がうまくいくことを確認できました。( two_layer_net.pyのweight_init_stdを0.01からsqrt(2/64)に変更しました)
toast-uz

2021/07/15 11:20

追伸の件、可能性はあると思います。ただし、初期値を変えるという打ち手は、フレームワークを使う場合ではあまり無いですし、複雑なモデルの場合は最適な初期値そのものが発見困難ですので、一般的な手法にはなりにくいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問