toyoshiの日記

株式会社トクイテンを有名にするための日記です

scikit-learnとTensorFlowによる実践機械学習の2章の復習

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習の2章をやった。2章はエンドツーエンドの機械学習プロジェクトということでデータの入手から前処理、本番稼働までを体験できる章だ。

機械学習プロジェクトを進めているところを途中の思考も含めて一緒に体験できるような内容になっていてなかなかいいんじゃないかと思う。

なお、私の場合は本書の通りやって動かないところが多かった。公式のカーネルが公開されているのでそちらと見比べて進めると良い。

handson-ml/02_end_to_end_machine_learning_project.ipynb at master · ageron/handson-ml · GitHub

復習のためもう一度読みながら要点を箇条書きに記録する。

データの取得

  • データ入手の方法(早速書籍のURLにデータがないので注意)
  • データスヌーピングバイアスを避けるために20%のテストセットを自力で作る方法とscikit-learnで分割する方法。
  • サンプルの偏りをなくすためのstratified samplingを使ってテストセットを作る方法。

データの可視化

  • データを可視化する方法。corrメソッドを使ったstandard correlation coefficientを求める方法。これはPandasのscatter_matrix関数でも求められる。
  • データの属性を組み合わせて新しい有用な属性を作る方法

機械学習アルゴリズムに渡せるようにデータを準備する

  • データを予測子とラベル(ターゲット)に分ける。それらを何度もできるように関数にする
  • データのクリーニング。データのクリーニングには、特定の値を取り除く、属性全体を取り除く、値を設定する(0、平均、中央値など)がある。DataFrameのdropna(), drop(), fillna()などで簡単にできる。
  • 中央値を入れるのはscikit-learnのImputerを使えば簡単にできる。
  • テキストのデータは数値に変換する必要がある。Pandasのfactorize()関数などを使って数値にマッピングする方法がある。
  • 単純な数値への変換だと値に意味があると判断されると困るので、ワンホットエンコーディングという方法でマッピングする方法がある。これもscikit-learnがいい感じにやってくれる。
  • scikit-learnにない変換器を作りたい時も特定の関数を実装してTransformerMixinを規定クラスに追加すればパイプラインなどでも使える形になる
  • 特徴量のスケーリングもscikit-learnがあれば簡単
  • データの変換のステップはパイプラインでまとめる

ここまでやってみてCategoricalEncoderがscikit-learnに含まれてなかったりしたので公式が提供しているJupyter notebookを本節以降の部分を消して、ここまではうまくいったと仮定して進めることにした。

モデルを選択して訓練する

ここまで長かったけどデータの前処理のパイプラインができたのでモデルを色々簡単に試すことができる。

  • 線形回帰モデルでの訓練と予測
  • mean_squared_error関数でのRMSE測定
  • 過小適合してる時は強力なモデルを選ぶか、訓練アルゴリズムにより良い特徴量を与えるか、モデルの制約を緩めるか
  • 決定木を使った予測
  • scikit-learnを使った交差検証(cross-validation)、K分割交差検証(K-fold cross-validation)をする方法
  • ランダムフォレストを使った予測

モデルの微調整

  • scikit-learnのGridSearchCVを使うとハイパーパラメーターの自動調整ができる。
  • 探索空間が大き時はランダムサーチを使うと良い
  • 最後にテストセットでシステムを評価するが、当然交差検証より性能が低くなるのが普通なので、テストセットで性能が少し下がったからといってハイパーパラメーターをいじるのはよくない

システムを本番稼働、モニタリング、メンテナンスする

  • 一定間隔でシステムの性能をチェックし、モニタリングのコードをかこう
  • 新しいデータを使って定期的にモデルを訓練しないとデータの変化によってモデルが腐るのは普通のこと

やってみての感想

データの準備が9割ぐらいで、お楽しみのモデルの適用やパラメーターの調整などはわずかというのを体感できた。またその過程でどう考えてというのもこのデータの場合だけだけど筆者の思考を追体験できるような感じが楽しかった。

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習