problem
オークションサイトの活動状況を見て、ユーザーが人間かボットかを判定する。
ユーザーが参加したオークション、入札時間、ユーザーが使用したデバイス、ユーザーのIPアドレス、リファレンス元URL、ユーザーの国コードなどの情報が与えられる。
challenge
ユーザーと入札という2つのデータが与えられるが、1:Nの関係にあるため、ユーザーが行った入札活動の総合的な情報を何らかの特徴量として抽出しなければならない。
approach
大まかには以下の流れで処理を行った。
- 特徴量抽出
- 特徴選択
- モデルの選択
- モデルの評価、パラメータ調整
2. ではRandom Forestのfeature_importances_を使って明らかに重要度の低い特徴を削除した。
3. ではRandom Forest、Logistic Regression、AdaBoost、Ensemble SVMの比較を行い、最終的にRandom Forestを使うことにした。
3. の時点でローカル環境とサーバー上のAUCスコアに乖離が見られたため、overfittingが発生していると考えた。overfittingを軽減するために、特徴量のさらなる絞り込みを行うことにした。
ただし単純にfeature_importances_の高いものをgreedyに選ぶだけでは良い結果が得られなかった。そこで最適な特徴量の”組み合わせパターンを選ぶ”という問題に帰着させ、simulated annealingを行うことにした。特徴量数を[6, 9, 12, 15, 18]とし、特徴量はwith replacementで選べるようにした。
これにより異なるサブセット特徴量に基づく複数のモデルが出来るため、性能のよいものを50~100個程度選び平均をとったものを最終結果とした。
抽出した主な特徴量は以下のとおり。
- 入札回数
- 入札時間間隔の中央値
- 入札時間間隔の分散
- 1回しか入札を行なっていないIPアドレスの割合
- IPアドレスのGini Impurity
- 携帯モデルのGini Impurity
- 参照元アドレスのGini Impurity
- 参加オークション数
- ブラックリスト国コードの割合(※)
- ブラックリスト携帯モデルの割合(※)
result
59th / 985, AUC Score 0.93196.ということで初参加にしては上出来かと。
時間をかければTop 10%に入れることが分かった。
暫くは常にTop 25%キープでなるべく多くのコンテストに参加することを目標にしようと思う。
future tasks
- パラメータチューニング作業の完全自動化
- データのビジュアライズ化(入札時刻がマスクされていて昼夜などの判定ができなかったが、グラフ化すると1周期=1日としてunmask出来たらしい)