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

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 を使用している点も異なっています。