はじめに
初めまして!onigilarです!
初心者ながらSIGNATEコンペで9位を取ることができたので、体験談を投稿したいと思います。(記事の投稿も初めてです、お試しで書いてみてます。)
よろしくお願いします。
Agenda
1.参加の動機
2.参加前のレベル感
3.学習方法
4.コンペ
5.解法
6.まとめ
1. 参加の動機
元々コンペに参加したいと考えていて、たまたまMUFG主催の初心者向けのコンペを見つけたため参加を決意しました。
とりあえず登録してみると、e-learningが提供されており、Pythonの基礎から学習できる環境が整っていました。
これなら自分でもできそうだと思えたことが一番大きいと思います。
2. 参加前のレベル感
どのくらい初心者なのか、これが気になるところだと思います。
結論としては、大学の授業や研究でちょっとやったことがあるレベルです。そのため、レベル感は以下の通りになります。
- Pythonの基礎を習得している
- Pandasなどのライブラリの扱いには慣れていない
- コンペ未経験
- AtCoder灰(超初心者)
- 機械学習に関する知識はあるが、実装はほとんどしたことない
勉強すれば20時間程度で追いつくレベルです。学部生なので研究といえども高いレベルではありません。化学系(非情報系)の学部で、簡易的な分析を行うためのツールとして使っているという程度でした。
これらの事前知識はe-learningに含まれていたので、なくてもほとんど同じように進められたのではないかと思います。完全な初心者でも大丈夫だと思いました。
3. 学習方法
さすがにこのレベルではコンペの提出まで至らないので、SIGNATE(MUFGの提供)のe-learningを活用しました。
非常に説明が丁寧で、難しいところはなかったです。一通りのチュートリアルを終えたころには、簡易的に実装できるようになりました。
4. コンペ
題目は住宅ローンの返済可否を予測するというものでした。
テーブルデータでやや不均衡でしたが、かなり簡単な部類なのかなと思いました。データ数も40000程度で少なめです。(Basicですね!)
評価指標はAUCというものでした。
入賞は5位までです。入賞した人はMUFG各社(6社)からインターンシップ参加や面談確約などの特典を得ることができます。賞金などはありませんでした。
5. 解法
-
前処理
とりあえずデータを観察し、データの概観を掴むまでひたすらEDAをしました。結果として、以下の処理を施しました。
1. 外れ値処理
外れ値と外れ値以外の集合をS、Tに分けるとします。Sの各要素をTの要素の中で最も距離(値)が近いものに合わせました。
ただし、削除した方が良かったと思います。
2.欠損値補完
簡易的な補完を行っただけです。
数値変数は欠損が10個程度だったので、modeやmedianで補完して、精度が高い方にしました。
カテゴリ変数には欠損が700ほどあったため無視できませんでした。色々試しましたが、結局「その他」として分類しました。良い案は思いつきませんでした。
追記:
勾配ブースティング系のモデルでは欠損があっても問題ないようです。試してみれば良かったです。
-
特徴量の処理
特徴量の生成や選択は行っていません。独自の特徴量を生成しても精度が下がったためです。そのため、こちらも簡易的な処理となっています。
1.エンコーディング
文字列にはターゲットエンコーディングを施しました。
追記:
ターゲットエンコーディングでリークを起こしていました。自身のレコードの目的変数を用いずに平均をとるために、K-foldを行う必要があるようです。
2.特徴量の整形
logで変換して、正規分布様にしました。後述のモデル(XGBoost)に対して、数学的に精度に寄与するのかは分からないのですが、変換したら少し精度が上がりました。
追記:
tree系のアルゴリズムでは値の大小のみが関係します。そのため、基本的には大小関係の変化がない変換は行う必要がありません。
しかしながら、今回は精度が上がりました。なぜかは自分にはよく分かりません。
-
モデル
勾配ブースティング系のモデルである XGBoost ( eXtreme Gradient Boosting ) を用いました。
上位層は勾配ブースティング系のモデルを使用していたようです。
1.ハイパーパラメータチューニング
グリッドサーチやランダムサーチで良いものを選びました。
しかし、最終的には手動で動かしながら、地道に確認しました。
優勝者の方は、OptunaでCV scoreが最大になるようにチューニングしていたようです。
次回、試してみようと思いました。
2.クロスバリデーション
Stratified K-fold (n = 5) でCVを行い、5つのモデルを作成しました。
平均を取って住宅ローンの返済確率を算出しました。これはAUCで評価するために必要だっただけで特に意味はありません。
例えば、Accuracyでの評価であれば、返済可否(0 or 1)を複数のモデルの多数決で決めるという方法になるかと思います。
追記:
クロスバリデーションで平均をとることをアンサンブルと勘違いしてました。
アンサンブル実装してみます!
6. まとめ
いかがだったでしょうか?
本当に初心者向けの内容だったと思います。おそらく、すごい方々からしたら「なんだこれ」って感じだと思います。
入賞もしていませんし、解法などはあまり参考にならないかなとは思います。ですが、本当に初心者でも、参加してアウトプットが出せるんだということが伝わればいいなと思っています。
これからデータ分析を始めたいと思っている方に読んでいただけたら幸いです。
実際のところ、今回書いた内容に関しても一部正しくないものがあるかもしれません。何かございましたらご指摘をよろしくお願いいたします。
次回、何かしらのコンペに参加するときには、過去の解法や現在のトレンドなどを調べつつやってみたいです。(欠損値補完方法を変えた複数のファイルをアンサンブルするなど、気になる解法を沢山知ることができました!)
今後ともよろしくお願いいたします!