めるぱんブログ

とある医大生の勉強の記録です

PythonとKerasによるディープラーニング 第3章③

最後は回帰の問題をやっていきます。

回帰は今までの分類問題とは異なり、連続値を予想する問題です。

 

今回はBoston Housingデータセットを使用します。これは1970年代のボストン近郊に関する犯罪発生率や平均部屋数など住宅価格の予想に使う13種類の様々なデータが入っています。

データのサンプル数は訓練サンプル404、テストサンプル102の合計506と少なめです。この少なさを解消するために後でいろいろ頑張ります。

また、入力データの特徴量の尺度もそれぞれ異なり、犯罪発生率であれば%、部屋の数であれば何部屋…と単位が異なっています。ここも後で頑張る必要が出てきます。

 

では、実際にデータセットを読み込んだらいつものようにデータの下準備をします。

今回は先ほど言ったようにデータの特徴量の尺度が異なります。

そのため、データごとにデータの正規化を行います。具体的には

((特徴量) - (平均値)) / (標準偏差

という計算を行ことで特徴量の中心が0になり、標準偏差が1になります。

 

ニューラルネットワークの構築では隠れ層が2層のニューラルネットワークを作ります。サンプル数が少ない場合は過学習が起きやすいので、その対策として小さいニューラルネットワークを使うのがよいみたいです。

今回は回帰であるため、最後に活性化関数を適用しないで1つのユニットに出力します。ここでシグモイドやソフトマックス関数を使ってしまうと出力が0から1に収まってしまうためです。

またコンパイルするときに損失関数は平均二乗誤差(MSE)、監視には平均絶対誤差(MAE)を用います。これは回帰問題のときに広く使われるそうなので覚えておきたいです。

 

前回まではサンプルを検証データと訓練データに分けて学習させていましたが、今回はサンプル数が少ないため、分けるとさらに少ない数となってしまい、過学習が起きてしまいます。

そのため今回はk分割交差検証という方法を使います。

これはデータをk個のフォールドに分け、そのうちの一つを検証データとし、残りのk - 1個のデータを訓練します。これをk回行い、それぞれの検証結果を平均することで最終的な結果とする方法です。

正直自分も最初は何を言っているのか全く分かりませんでしたが、実際に手を動かしてみると納得できると思います。

 

これを実際にやってみたわけなのですが、めちゃくちゃ処理に時間かかりました。

エポック数を最初は100で、二回目は500でやってみようと書いてあるのですが、500にしたときに20分くらい処理にかかってしまいました。

また、結果をプロットしてみたのですが、本のようにうまくいかず、何か別の方法を勉強しないといけないと感じました。

 

この回帰の問題が第3章の中では一番難しく、大変でした。

まず本自体にいくつか誤植があり、そしてしっかりその部分を直してもエラーが出ることがあったりして結局かなり調べながらやることになりました。

またk分割交差検証もなかなか理解するのが大変で時間がかかってしまいました。

 

この問題を通して大切だった点は

・特徴量に複数の尺度がある場合は正規化を行う

・回帰では出力は1ユニットで活性化関数は不要

・回帰のコンパイルには損失関数はMSE、監視はMAEを用いる

・サンプル数が少ない場合はk分割交差検証が有効

だと思います。

 

次の章では機械学習に入るみたいです。また頑張ろうと思います。