不器用貧乏

広く浅く手を出したり出さなかったりする.

kaggleを始めてみて提出してみた話

はじめに


データを分析に関する知識も経験もないんですが,前々からkaggleに手出してみたいと思っていたので,始めてみました.
基本,「Kaggle事始め」を参考に進めました.
 
 

コンペのデータセット等をダウンロード


データセットダウンロードを,コマンドラインからできるっぽくて,「Kaggle をコマンドラインで操作する - CUBE SUGAR CONTAINER」を参考にやってみました.
始めるならやっぱりtitanicからだろうと思って, 

kaggle competitions download -c titanic

したんですが,以下のエラー.

...
(略)
...
HTTP response body: b'{"code":403,"message":"You must accept this competition\\u0027s rules before you can continue"}'

多分,コンペが終了してるのが原因じゃないかと思ってます.
おとなしくDownloadボタンでダウンロードしました.
 
 

データセットの処理


処理に使ったコードはGistに.ipynb形式で置きました(kaggle_titanic.ipynb). データセットの処理は,流れの大枠を「Titanic日本語チュートリアル koji | Kaggle」を参考にしながら,自分なりにコードや処理を書き換えて行いました. また,コードを書くのと並列して「前処理大全[データ分析のためのSQL/R/Python実践テクニック]」を読み進めました.


流石にこのまま提出するのはマズいので,ちょっとだけ処理に手を加えました.



リストワイズ除去

与えられたデータには欠損値があり,参考にしたコードでは,Embarkedの欠損値を最頻値の「S」で埋めていました.
前処理大全によると,そもそも欠損値は大きく次の3つに分けられるようです.

  • MCAR (Missing Completely At Random):偶然起きているランダムな欠損.
  • MAR (Missing At Random):他の項目データに依存した欠損.
  • MNAR (Missing Not At Random):欠損している項目データに依存した欠損.

MARやMNARにおいては,ある特定の傾向があるデータを削除することになるため,全体の傾向を把握できなくなる恐れがあります. 今回のEmbarkedはMCARに当たり,2件くらいなら削除してもいいのではないかと考え,除去しました.

※当初,テストデータのFareもリストワイズ除去を行ったんですが,提出したときにデータ数が合わなくなったため,参考したコード通り平均値で埋めました.

グリッドサーチ

参考にしたコードでは,K近傍法,決定木,SVC,AdaBoost,GBMのトレーニングデータによるAccuracyを比較し,最も高い精度を出したモデルで予測を行っていました.
この内,最も高いAccuracyだったGBMに対して,「Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python」を参考にグリッドサーチすることにしました.
グリッドサーチするまでの流れは,参照サイトと同じように進めたのですが,いくつか手を加えました.

from sklearn.grid_search import GridSearchCV

でインポートしようとしたところ,以下のように出てきました.

/usr/local/lib/python3.6/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
/usr/local/lib/python3.6/site-packages/sklearn/grid_search.py:43: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. This module will be removed in 0.20.
  DeprecationWarning)

多分,「sklearn.grid_searchsklearn.model_selectionに移したから,0.20で削除されるよ」と言ってるものだと解釈し,

from sklearn.model_selection import GridSearchCV  

のように書き直しました.(これでいいのか...?)

パラメータ

参照サイトでチューニングしていたパラメータのうち,max_features,subsampleに関しては,グリッドサーチした結果roc_aucが下がってしまうため(なぜ?),チューニングしませんでした.
 
 

提出


グリッドサーチする度に結果が変わることに困惑しつつ(こういうものなのか?),roc_aucが1.3%程上昇したため,結果を提出しました.1日5回ほど提出できるようだったので,コロコロ変わる結果を5回提出しました.
結果は,0.78947で3454位/11236人中でした. f:id:satory074:20180602201402p:plain

 
 

おわりに


今回かねてよりやってみたかったkaggleに手を出して,ひとまず提出するところまでできたのでよかったです.
特にグリッドサーチなんかは,謎な部分(グリッドサーチしたらroc_auc下がるとか,値がコロコロ変わるとか)を謎のまま放置しているので,そのうちちゃんと原因考えようと思います.
それと,思ったより精度が上がらなかったので,kernel読むのを筆頭に,「How to Win a Data Science Competition: Learn from Top Kagglers | Coursera」等で,やり方を勉強していきたいと思います.
あとは,今回はコードを改変する形で進めたので,早くコピペすることなく自分で書けるようになるといいなあ.
 

おわり.

 
 

リンク集


Kaggle事始め

kaggleを始めるところから提出するまでの大まかな流れを参考にした

Kaggle をコマンドラインで操作する - CUBE SUGAR CONTAINER

コマンドラインからコンペのデータをダウンロードする際に参考にし(ようと)た

Titanic日本語チュートリアル koji | Kaggle

入力データを処理して提出データを出力するまでのコードを参考にした.

前処理大全[データ分析のためのSQL/R/Python実践テクニック]

前処理の仕方を読んだり参考にしたりした.

Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python

グリッドサーチでパラメータをチューニングする流れを参考にした.

How to Win a Data Science Competition: Learn from Top Kagglers | Coursera

やり方勉強するならこれかなと思ってリンクを貼った.