2019/06/25 追記:
MS製のLightGBMでも簡単に予測ができそうです。
https://www.kaggle.com/shep312/applying-lightgbm-to-titanic-dataset
以前社内コンペで同僚がLightGBMを使って開始30分でハイスコアを叩き出していました(そのコンペは評価関数が Log Loss だったのもあったのか、私はあまり良い結果は出せませんでした)。
追記終わり
auto-sklearnという機械学習の自動化ツールがあるらしいです。これを使うことで、時間・スキルがなくてもそこそこの精度でKaggleの問題がとけないかやってみました。下記チュートリアルを試してみました。
Notebook
auto-sklearnを使ってみたNotebookは下記です:
- Titanic生存予測
- House Price予測
自分の環境だと、それぞれ1時間程度の実行時間となりました。
準備
今回は、下記を参考にしてDocker for Mac上にコンテナを立てました。
$ docker run -it -v $PWD:/opt/nb -p 8888:8888 felixleung/auto-sklearn /bin/bash -c "mkdir -p /opt/nb && jupyter notebook --notebook-dir=/opt/nb --ip='0.0.0.0' --port=8888 --no-browser --allow-root"
コンテナが立ち上がったら、いくつかライブラリをインストールしました(コンテナ内のTerminal等から)。
$ pip install arff matplotlib seaborn # in docker container
データの確認、整形
Notebookではまずデータの確認をして、その後に簡単な整形をしています。
auto-sklearnに食わせるデータは、NA値を補完したりLabelEncoderを使ってCategoricalな文字列を数値に直したりする必要があるようです(ソースコードに書かれていたのを後から気づきました...)。
ユーティリティ
Notebookではいくつかユーティリティを用意しています。
-
fillna()
関数: NA値を補完- 数値であれば平均値を、それ以外は前後の行の値で埋めるようにしています
-
categoricalize()
関数: Categoricalなデータを数値に変換
ローカルでモデル精度の確認
House Price予測では、まずは train.csv
のデータをトレーニング用とテスト用に分割して精度を確認しました。その後テスト用に使ったデータも使って refit()
し、提出用予測の精度向上を図ります。
refit()
のエラー回避
使用したバージョンではrefit()
でエラーが発生したため、とりあえず回避策として下記のように置換しました:
#`refit` raises an error, so modified
!sed -i -e 's/if self.max_leaf_nodes == "None":/if self.max_leaf_nodes == "None" or not self.max_leaf_nodes:/' \
/usr/local/lib/python3.5/dist-packages/autosklearn/pipeline/components/regression/gradient_boosting.py
結果
予測して結果を提出した結果、下記のようになりました。
問題 | Score |
---|---|
Titanicの生存予測 | 0.78468 |
House Price予測 | 0.15161 |
例えばTitanicの方はLeaderboardによると下記のようになるので、まずまずの精度ではないでしょうか? (2017-11-09 19:30時点 20989投稿)
【参考】Titanicの回答の統計量
統計量 | Score |
---|---|
平均 | 0.74271 |
最頻値(個数) | 0.76555 |
中央値 | 0.77033 |
まとめ
一度auto-sklearnの環境を作ってしまえば人手が必要な作業は下記だけで済み、精度もそれなりに出るので良いと思いました(ただ機械学習モデルの生成に時間がかかるのと試行ごとに生成されるモデルがばらつくのが...)。
- 何を予測するのか(regressionなのかclassificationなのか)
-
AutoSklearnClassifier
を使うのかAutoSklearnRegressor
を使うのか
-
- 各カラムのデータはCategoricalなのかNumericalなのか