唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

CrowdSolving第1回コンペに参加しました 5/43位

CrowdSolving | データ分析・予測モデル作成のコンペサイトのコンペが終わったので、結果とかアプローチとか書いときます

以前書いた記事↓

タスク

タスクはユーザーの退会予測となっています。
ユーザーの一週間の行動(イベントタイプと日時のペア)が与えられた時に、一か月後ユーザーが退会するかどうかを予測します。

順位

最終結果は5位でした。
ちなみに最終日の暫定順位が3位で、一番よかった時が2位でした。

結構順位が下がってるので過学習っぽいですね。

アプローチ

基本的に10分割交差検定の結果を見ながらモデルや特徴量を改善していきました。

モデル

Pythonで書いて、機械学習の部分はscikit-learnを使いました。
予測モデルはExtremely randomized treesとロジスティック回帰です。
この2つのモデルの出力の加重平均をとっています。

Extremely randomized treesに対してロジスティック回帰を組み合わせることで、AUCで0.003ぐらい上がっています。
微々たる差なので、実際のスコアにどの程度差を与えているのかはよくわかりません。

識別器は他にSVM,、ランダムフォレスト、Gradient boostingを試しました。

特徴量

以下に使用した特徴量を列挙しました。
ちなみにモデルが一番重要だとした特徴量は課金関連のイベントでした、さもありなん。

  • イベントのunigram(イベントごとの発生回数)
  • 発生したイベントの種類数
  • イベント総発生数
  • 初日からn日後に発生したイベント数
  • 最後にイベントが発生したのは初日から何日後か
  • イベントが発生した日付の種類数
  • イベントが発生した時刻の種類数

以下はイベント総発生数の合計で割って、割合にしています。

  • イベントの発生間隔が1時間より多くあった回数
  • イベントの発生間隔が1時間未満だったときの時間の合計
  • n年にイベントが発生した回数
  • n月にイベントが発生した回数
    • ただし、n月にイベントが発生した時はn月に+2/3して、更に15日より前ならn-1月に+1/3後ならn+1月に+1/3している
  • n / 3(切り捨て)時にイベントが発生した回数

有効でなかったアプローチ

bigramやHMM

あまり連続したイベントの情報は有効そうではなかった。
ただし、Twitter上ではbigramが効いたといっている人がいたので、調査が足りないのかも。

次元削減

データ数のほうが次元数よりも非常に多いので効果は無さそうなのですが、一応やってみたらやはりダメでした。

曜日、休日かどうか

曜日の情報が効くかと思ったらそんなことはなかったです。

スケーリング

SVMを利用しているときはスケーリングによって意外と大きく結果が変わったのですが、その他の識別器ではあまり効果がありませんでした。

まとめ

smly(baseline_XD)さんが序盤から圧倒的な強さを発揮していたのが印象的でした。
結局そこから余りスコアが伸びず、一位でもAUCが0.65代だったのは意外でした。
本質的に難しいタスクだったんでしょうね。

初めてランダムフォレストなどの、決定木のアンサンブル系の識別器を使って、思っていたよりも使いやすくてびっくりしました。
特徴のスケーリングやバイナリ化があまり必要ないというのは手軽でいいです。

Pythonのライブラリのscikit-learnを初めて使ったのですが、色々と便利で良かったです。

感想

色々と楽しめました。
他の方々のアプローチも公開されたりしないかなーと楽しみにしています。
第2回コンペも始まっているみたいですが、こちらはちょっと形式が違うみたいですね。