初kaggleで銀メダル取ったけど、これ全然イキれなくない?
みなさん、こんにちは。
データラーニングギルド代表の村上(通称みどりの人)です。今回は、kaggleに初参加したので、その振り返りをしようと思います。
今回は、私が立ち上げたデータラーニングギルドの活動の一環として、最初から5名でチームを組んで参加しました。
普段データ分析コンサルタントとしてデータ分析の仕事をしているのですが、なかなかkaggleには手を付けられなかったので、ちょうどいい機会だと思って参加してみました。
銀メダルを取ったものの、基本的にはほぼMTGに参加するだけのオブザーバー参加的な感じでした。なので、銀メダルといっても棚ぼた的な感じで取れたって感じですね。
普段実務でやっている分析と全然違い、kaggleならではな点に躊躇ったりしたので、今回の記事に関しては、主にkaggleと実務の違いといった点にポイントを絞って記事を書いてみようと思います。
細かな解法やどんな風に取り組んだのかに関しては、一緒にチームで参加したメンバーのブログなどを読んで頂ければと思います。
kaggleでの取り組み概要
今回参加したコンペは、IEEE-CIS Fraud Detectionという、テーブル形式のコンペでした。
他の方がガリガリモデルを作る感じで、自分はあんまり時間が取れそうになかったので、役に立ちそうな特徴量を作るという関わり方でチームに参加しました。
特徴量としてはNULL値が多く、発生の傾向に関しても関連性がある程度ありそうだったので、以下のような形で特徴量を作成しました。
・NULL値の傾向をコレスポンデンス分析で次元圧縮
・次元圧縮した物を元にクラスタリング
・クラスタ中心からの距離を計算してクラスタごとに正規化(微妙だったので採用せず)
クラスタ間で明確にfraud率に差が出ていたので、ある程度意味のある特徴量は作れたのかなと思います。ただ、最終的に作成したモデルには組み込んで貰えなかったようですw
最終的には一緒に参加した学生の子が終盤にめちゃくちゃ頑張ってくれて、銀メダルを取ることができました。
以下、初kaggleで感じた違和感や凄い所、感想を書いていこうと思います。
違和感その1 何の変数なのか分からない
基本的には特徴量のカラム名に関しては「idxx」とか、「Vxxx」とか、難読化がされていました。外部にデータを出すという性質上仕方無い部分かと思うのですが、何の特徴量が何を意味しているか待ったく分からないという前提で進めなければなりません。
「え、そもそもユーザー識別するためのIDないの!?」
という感じで驚きました。テキストで入力されているものに感してはなんとか類推できるかなという感じでしたが、時系列と関連しているデータが何なのかとか、いちいち関連性を見ないといけないの、めんどくさいですね。
特に自分の得意領域としては、「ユーザー単位の一般的な行動」、「セグメント毎の一般的な行動」といった部分など、データ定義と特徴量設計なので、データの意味的な方向からアプローチができず、かなり苦戦しました。。。
実際に実務でもデータの定義が分からない状況があったり、仕様書に書いてある定義と違ったり、データ取得の定義が途中で変わってたりとかはあるけど、カラム名はそれっぽい名前がついてるので、大体予想がつくことが多いです。
そういうのをクライアントに確認しながら進めて行くので、意味不明なデータ羅列からモデルを作る所だけにフォーカスするというのは慣れませんでしたね。
違和感その2 testデータの分布に合わせてカスタマイズ
testとtrainのデータがあって、以下のような内容でした。
train・・・時系列的にtestデータの前に発生したデータ
public・・・testデータを時系列で区切った前20%
private・・・testデータを時系列で区切った後20%
データとしてはtestデータが準備されているので、testデータに関しては、privateのものでも目的変数以外は既知という状況が発生しています。
そのため、testデータの分布がprivateのもと大幅に違っている特徴量を予測モデルに活用しないというアプローチを採用しました。
確かにその方が汎化性能が上がるのは分かりますが、そういったアプローチを取る場合、実際に予測モデルを作成する場合に、毎回モデルを作り直す必要が出てきます。
例えば、年に1回程度まとめて予測するような場合だと、使用できる可能性ありますが、デイリー、マンスリーで使用するようなモデルを使用する想定をした場合そのようなアプローチで出した解法を運用に乗せるというのは難しいと思います。
コンペに勝つためには適切なアプローチかもしれませんが、不正検知というリアルタイム性が必要な性質上、「それでいいの?」という違和感はぬぐえませんでした。
違和感その3 データからユーザーとアルゴリズムを推測する
上記に今回のコンペの解法がまとまっているのですが、上位陣に共通しているポイントとしては以下のような感じらしいです。
・ユーザーIDを特定する
・学習データ中のユーザーIDとテストデータ中のユーザーIDの被り率は低いことを見つける
・ユーザーIDはそのまま用いず、集計値に変換して用いる。ユーザーIDの特定に寄与するような特徴量も直接用いない
・あるユーザーIDが一度 Fraud とされると、その後も Fraud とされるパターンを見つけて後処理を行う
この例を見た時に、「え、結局ユーザーID特定するの!?」という感じでした。
なんというか、普通に分析プロジェクトやる場合はユーザーID特定する情報を貰えますし、一度Farudとされた後にその後もFraudとみなされるような生成ルールや判定基準などは教えて貰えますよね。。。
その傾向とかを見つけた時の達成感は凄いでしょうけど、データマイニング的なアプローチで、その傾向を見つけないといけないような状況でプロジェクトが進んだ時点でデータ分析プロジェクトとしては失敗だと思うんですよね。。。
と、色々違和感はあった訳ですが、凄いと思った事もあったので、そちらも記載して行きます。
凄い所その1 Top kagglerが凄い
Top kagglerの方たちに関しては、上記解法以外に、以下のような共通の傾向があります。
・データマイニング的なアプローチでユーザーIDをしっかりと見つけられている
・有用な特徴量をいくつも作成している
・特徴量選択の方法であったり、validationの方法であったりを多岐に渡って試し最適なものを選択している
・しっかりと複数のモデルを作成してスタッキング(11位のチームはなんと900個もモデルを作成)
今回はテーブルコンペということもあって、コンペの性質上特に新しいテクノロジーを使っているという訳ではないですが、やるべきことをしっかりと、かなり高い精度でやっている印象を受けました。
やはり、kagglerで上位入賞するような方はレベル高いですね。
凄い所その2 集合知が凄い
kaggleをやってみて凄いと思った所は、公開されているnotebookやディスカッションがそれを活用しながらモデルを改善して行く点でした。
コンペの最中に、しい発見をしたりするとコンペ内のスレッドでその情報が共有されます。他の人と知見をシェアしながらスコアを上げて行くというのが、コンペ中にも関わらずワークしているのは素晴らしいですね。
しかも、かなりコアなやり取りやディスカッションが交わされているので、そのディスカッションを読むだけでかなり勉強になります。コンペ中に集合知が溜まって行き、それを上手く組み合わせることで上位入賞できたりするので、完全に共有情報なしでスタートするよりも取り組みやすく、データ分析の勉強という意味合いでも得るものが多いように感じます。
先述のリンクのように上位解法のまとめなども公開されるので、コンペ参加→ディスカッションを見ながらモデルを作ってみる→コンペ参加後に解法チェック
ということを数回ループすると、かなりデータサイエンティストとしてレベルアップできるような気がします。
感想その1 Expert、そんなに凄くなくない?
完全にイメージですが、「kaggle Expertって凄いんだろうな~」と思っていました。
始めてのコンペでチームを組んで棚ぼたで銀メダルが取れたように、銅メダルまでなら案外難しくないというのが個人的な印象です。
というのも、公開されているnotebookにある程度レベルが高いものがあり、それをベースに少し内容を変えたり、なんならそのまま提出するだけでメダルが取れてしまう可能性もありそうです。
また、個人的にレベルが足りていなくても優秀なkagglerの方とチームが組めてしまえばメダルをゲットできるので、kaggle Expertは割とライトな目標として気軽に目指して良いのでは?とい印象を受けました。
温度感で言うと、将棋の初段のような、「基本的な定跡を知っていて、実力がそこそこある」くらいなのかなーという感じです。
金メダルを取るのはかなり大変そうなので、masterは結構凄いと思います。また、チームが強ければメダル取れちゃうので、soloで何かしらメダルを取ってるっていうのは大事そうですね。
感想その2 初学者の方は、kaggleはほどほどに
初学者の方で、kaggleを頑張る!といってkaggleにフォーカスしようとしている人が見受けられますが、そもそも、「データ分析でどんな問題を解決するか?」ということが大事だったり、上記で自分が違和感を多く感じたように、実務からはかけ離れた所も多くあります。
実際に実務をやった上でモデリングのスキルを上げるために取り組むのには素晴らしい環境だと思いますが、最初からそこにコミットしすぎると、kaggleに過学習しすぎたスキルセットになっちゃうんじゃないかなぁと心配です。
なので、kaggleを頑張ろうと思っている方は、まずはExpertくらいまでを目標として、後はより実践的な課題に取り組むと良いのではないでしょうか?
最後に
データ分析のモデリングを学ぶに当たって、kaggleはめちゃくちゃいいサービスだと思います。今回の機会があって参加できて良かったです。
銀メダル取ったのでkaggler引退します!!
この記事が気に入ったらサポートをしてみませんか?