と。

Github: https://github.com/8-u8

ELO Merchant Category Recommendationで銅メダル圏でした

よくわからないですがExpertになってました

あまりいいExpertのなりかたではない*1こともあり,kaggle masterにならないと人権はないらしいので,地べたを這いつくばりながら行きていこうと思います.

今回のELO Merchant Category Recommendationでは,Rがメインの言語である私がPython縛りでいろいろ試行錯誤しながら進めたこともあり,いろいろと学ぶことが多かったのでまとめておきたいと思います.

ELO全体の振り返り等は以下の記事で詳しくまとめられています.

amalog.hateblo.jp

使ったソースコードは以下にぶっこんどきます.

github.com

やったこと

データの前処理,機械学習モデルの実装を全部Pythonでやろうという縛りを最初は設けていたのですが,

最終的にはこれまでに出したsubmissionやKernelにあったsubmissionをblendするなどする際にRのほうが慣れていたのでそれを使ったり,

targetの挙動を見るためにExcelを使ったりするなど何でもアリになっていきました.

結果

Public Scoreで最も良かった3.689(LGBM同士のBlending)と,直前で一番良かったPublic Score3.695をFinal Submissionとして,

前者がPrivate Score3.613で全体371位(上位9%)でした.

今回いろいろなモデルを実装して組み合わせるなどしましたが,LightGBMだけのモデリングが予測値が割と良かったです.

前処理

以下のKernelでの前処理プロセスをベースに,aggregateしたデータで加減乗除の許す限りnew/histの関係性を 特徴量として追加したものを最終submissionの第二候補にしました.

www.kaggle.com

www.kaggle.com

モデリング

当初はあまりメダルを意識していなかったので,Pythonでの実装とKFoldによるCVの実装の練習だと思いながら,コードを書くことを意識していました. 最終的にはKernelを参考にLightGBMを実装しつつ,さらにそこでのコーディングをベースにXGBoost,CatBoostを実装して,それらのtrainデータに対する予測値をさらにXGBoostにかけて予測値を出すモデルを構築しています.そのうち,LightGBMとXGBoostのハイパーパラメータをOptunaでチューニングしています.Optunaの実装は公式のドキュメントを参考に行いました.

出力についてはそれぞれのモデルでsubmission用データを出力できるようにしました.

交差検証ではK-FoldをつかったCVを実装しています.今回のコンペではtargetに外れ値があったのですが,外れ値フラグを設けて制御することを試しました*2

よくわかっていないこと

Optunaによるハイパーパラメータのチューニングは結論あまりいい方向には動かないことが多かったので,最終的に手で微調整しました.KFoldをしないでTrainデータを全部使ってチューニングしてしまったのが悪かったんだろうなぁ,とは思っていますが,この辺は少し調べなければならないなあと思いつつそのうちkaggler各位に聞きたいところです.

今回身になったこと

Kernelの力を大きく借りながら,Pythonで前処理,モデル実装,出力までを一通り構築することができました.

自分で組んだ特徴量はあまりいい効果をもたらさなかったり,モデルの精度があまり良くなかったりと,実力不足を痛感しながらも,どうにか銅に滑り込めたのは幸運でした.

副産物として,コマンドプロンプトから.pyファイルを実行して寝て起きたらsubmitという形式の楽さを実感しました.

if __name__ == "__main__":...という呪文の意味が少しだけわかったという点,関数で一つ一つの動作を定義してつなげていく点は,Rだけ使っているとなかなか得られない体験だったので,新鮮でした.

今も別のコンペをやっています.しばらくコンペはPythonで頑張ってみようと思います.

Expertではありますが実質Contributorなので別にイキることなく(ただし肩書としては活用しつつ)精進します.

*1:大炎上したRコンペで手抜きsubmissionしたら銀圏になってしまいました.たたかないでください

*2:この辺はどんな動きをしているかよくわからず,参考にしたkernelから大きく変更することなく実装しています