PythonとKerasによるディープラーニング 第4章
機械学習における基本的なテクニックを確認する。
ここでの学び:
機械学習モデルの評価
過学習が起きてないか確認するために、validデータをとっておいて汎化性能を評価することが必要。
また、前章で見たK分割交差検証の注意点は以下。
- train, valのデータ比率に気をつける。
- たとえば、trainがラベル0〜7,valが8〜9のデータしか含んでない、みたいな状態にならないようにする。
- そのために、データをシャッフルしておくこと(あとたぶんstratify Kfoldで解決するはず)
- 過去に基づいて未来を予測する時系列データ解析ではデータをシャッフルしてはならない。
- 訓練データと検証データは独立にする
- 重複があると検証の意味がなくなる。
データ前処理
- ベクトル化:ニューラルネットワークモデルに入力するためにベクトル化する。(one-hot化)
- 値の正規化
- データの数値が大きいと勾配を更新するための値が大きくなり、ネットワークが収束しなくなる。
- 0〜1の範囲の、小さな値にする。複数の特徴量は同じ範囲に収める。
- より厳格な正規化として、平均0,標準偏差1にする。
- 欠損値処理
- 一般に、ニューラルネットワークでは欠損値は0にするのが安全。ただし、0がすでに意味のある値として使用されていないことが前提。
- また、欠損値を含まないデータで学習したモデルに、欠損値を含むデータを入力するとうまく予測できないので、欠損値を擬似的につくって学習させる(か、予測に使うデータのほうを欠損値埋めする)
特徴エンジニアリング
特徴量をより単純な方法で表現することで、問題を容易にする。
例:時計の画像そのまま使うよりも、数字や針の角度を使う
ディープラーニングではモデルが勝手に学習してくれるが、良い特徴量があれば学習が楽になる。
(あるいは、ディープラーニングを使わなくても解けるかもしれない)
過学習と学習不足
過学習を抑制して汎化性能を上げたい!(ディープラーニングの本当の課題は、適合ではなく「汎化」!!)
- 最善策:訓練データを増やす
- そうできない場合:「正則化」
- モデルに格納できる情報の量を調整する
- モデルに格納できる情報の種類に制限を課す
具体的方法
- ネットワークのサイズを削減する(学習可能なパラメータの数を減らす)
- 適切な層数やサイズを割り出す魔法の公式はないので、試行錯誤しかない
- 少ない層数・サイズから始めて、validデータセットで損失値を評価して、次の手を考える
- 重みを正則化する
- ドロップアウトを追加する