トレーニングデータが小さい ><

kaggle の Restaurant Revenue Predicton  に参加していますが、このコンテストのデータセットは、トレーニングデータが非常に小さく(n=137)、テストデータが大きい(n=10,000)のが特徴です。

 以前にもこのような傾向のコンテストがあったらしいです。そのときに優勝された方の手法 で特徴的に思えたのが、「サポートベクトルマシンで cost の値を非常に大きくしている」ところです。実際にこのコンテストでも、使用されている方は見受けられます(Forum を見ている感じで)。

 また、トレーニングデータが小さい場合に気を付けるポイントは、交差検定の部分にもあります

交差検定の k の値はどれくらいにすればいいのか - ほくそ笑む

こちらにもありますように普通の場合には、k=サンプル数 のときが最も良い評価が出ると考えられます。ところが、トレーニングデータが小さい場合に、同様のことをすると過適合してしまいます。kaggle の Forum でもこのことが話題に上がっていました。

How to correct cross-validate? - Restaurant Revenue Prediction | Kaggle

そこでまず、k=10 (gbm のデフォルト値でもある) を試す、あるいは先ほどのサイトにもあったように k=lg( データ数 ) とするのが良さそうです。(lg は底が2の対数)

Forum で参考文献が挙げらていたのは、小規模のデータセットに対するSVMのパラメータのチューニングについては

 http://robotics.stanford.edu/~ang/papers/cv-final.pdf 

があるらしいです。また過適合の際のモデル選択については

http://jmlr.csail.mit.edu/papers/volume11/cawley10a/cawley10a.pdf 

が参考に挙げられていました。

 

追記(2016/01/31): このデータセットのやり直しをしました!

今回のモデルは、randomForest の10 回平均(10 個のsingle model の平均) で行いました。score は

Public LB score: 1713786.67770, Private LB score: 1753006.78906

です。

f:id:puyokw:20160131160711p:plain

randomForest の10 回平均についてですが、このデータセットではシード値による予測値のブレが非常に大きかったため、10 回平均を取ることにしました。こうすることで、実際にcv score が安定して手元でモデルの比較を行うことが以前よりはできました。

randomForest を行う前に、前処理として欠損値補完を行っております。

P14 ~ P18, P24 ~ P27, P30 ~ P37 が同時にゼロになるところがあり、そこを欠損値とみなしてmice package で補完しました。ここはwining solution を参考にしました。

blog.kaggle.com

ただし、wining solution では、Time / Age related information を抽出して、これを欠損値補完に役立てたらしいのですが、いまいち意味が分からなくてそこの実装ができませんでした。また、wininng solution では、gbm のsingle model を使用している点も異なっています。

 

 

最近、流行のxgboost

 kaggle で

Description - Otto Group Product Classification Challenge | Kaggle 

に参加していますが、こちらのフォーラムで

Achieve 0.50776 on the leaderboard in a minute with XGBoost - Otto Group Product Classification Challenge | Kaggle 

というタイトルのものがありました。xgboost についてはこちらが参考になると思います。

ブースティング決定木の概念:

http://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf 

概念と使い方: Gradient Boosting Decision Treeでの特徴選択 in R | 分析のおはなし。

変数のこと: xgboostとgbmのパラメータ対応一覧をつくる - 盆栽日記 

実際の使い方は本家の

github.com

を見るのが良いかなと思います。

  xgboost は CRAN のサイトから消えてしまったため、 windowsでは (自分がwindows 環境なので)、Rtools よりRtools31をインストールしてから、R のコンソールから

devtools::install_github('dmlc/xgboost',subdir='R-package')

をすれば、xgboost のパッケージをインストールできました。

(2015/08/07 追記) 2015/08/02 の更新で、CRAN に復帰したため、

install.packages("xgboost")

で、インストールできます。

変数の説明は

Parameters · dmlc/xgboost Wiki · GitHub

が参考になります。gbm と xgboost の変数対応表を先ほどのサイトなどを参考にしてもう少し書き足してみます。[=default値] としています。

gbmxgboost備考(使用用途など)
n.trees[=100]nrounds 
interaction.depth[=1]max_depth[=6] 
bag.fraction[=0.5]subsample[=1]過学習の抑制
distributionobjectivermse など 
n.coresnthreadどちらも使用可能なスレッドの最大数がデフォルト
n.minobsinnode[=10]min_child_weight[=1]

gamma も関与?

shrinkage[=0.001]eta[=0.3] 

再現性を確保したい場合には、固定シード値推奨です。(set.seed(0) など)

変数の調整は、gbm と似たような感じになると思いながら奮闘しています。

追記:ハイパーパラメータの調整には、グリッドサーチや手動での探索よりも、ランダムサーチの方が良いらしいです。

http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf 

ちなみに、scikit-learn ではこれが実装されています。

sklearn.grid_search.RandomizedSearchCV — scikit-learn 0.16.0 documentation 

RandomForest でグリッドサーチとランダムサーチを比較したものがありました。

Comparing randomized search and grid search for hyperparameter estimation — scikit-learn 0.16.0 documentation 

自分は最近 python を勉強し始めたところなのでまだ試していませんが、どこかで1 度試してみたいと思います。

 追記(7/11):python でのインストール方法

自分はWindows user のため、python はWinPython (32bit)を使用しています。そのためWinPython 上での環境構築を紹介します。

(1) githubリポジトリをコピーする

git clone https://github.com/dmlc/xgboost/ 

とします。

(2) ビルド

windows でなければ、bash build.sh (もしくは make build.sh) で環境構築できるみたいです。WinPython では、

xgboost/windows/ にあるxgboost. sln をVisualStudio Express 2010 でRelease モードでリビルドします。このとき、openmp を有効化すると並列処理に対応します。

(WinPython (64bit) では、Visual Studio Community 2013 でRelease モード、x64 でビルドすればOK です。)

(3) インストール

xgboost/wrapper (追記2015/08/07:最新版(ver 0.4)では xgboost/python-package  )にディレクトリを移動して、

python setup.py install

とすれば、インストール完了です。

import xgboost

としてインポートの確認ができます。

 

kaggle に参加してみた感想

 今までに参加したデータ分析の大会は、データサイエンス・カップとDataLeague の2つだけで、もっとデータ分析の経験をもっと積みたいと思っています。まずデータ分析の大会を開催しているのは、国内では

サイエンティスト ビッグデータ活用ならオプトDSL 

CrowdSolving | クラソル | データ分析・予測モデル作成のコンペサイト 

の2つぐらいかなと思います。これだけでは、開催していない期間が多いため、なかなか実力が付かないと思い、

Kaggle: The Home of Data Science 

に参加してみようと思いました。

 さすがに、参加者は多くレベルも高いです。kaggle の良いところですが、Forum があることだと思います。大会開催中でもForum で、様々な議論が交わされていたり、ベンチマークを超えるコードを公開している方もいるのが面白い特徴だと思います。初めはこのコードを参考に勉強できるので、経験が少なくてもやる気がある人には良いと思います。またチームでの参加もできるみたいです。

 自分自身も夏休みに興味を持ち勉強し始めた程度にしか経験がありませんでしたが、kaggle に参加したことで、R のコードのより簡単な書き方(便利な package を知ることができる) や自分が考えた以外の手法も試せるので、とても面白いです。

 データ分析に興味がある方は、 kaggle の Forum を覗いてみるのも良いかもしれません。