機械学習を勉強し始めて1年が経ちました。そろぞろ何か一つ目に見える実績を上げたいと思いたち、5月から8月までHomeCreditというKaggleのコンペをやっていました。Kaggle最終的に、7198人中62位で終わることができました!Kaggleをやってみようかなと思っている人向けに、自分の体験記を残しておこうと思います。Beginnerを参考にしてください。―Pythonで学ぶディープラーニングの理論と実装この本を読んでから、機械学習に興味を持ちました。クラスタリング」あたりのライブラリの使い方と簡単な理論を勉強できました。前準備コンペを始める前に(一部は始めてから)、Kaggleのノウハウを探りました。いろいろな記事を読み*1、以下が大事なのかなと思いました。時間を費やすべきなのは特徴量*2作成。(特徴作成8:チューニング2くらい)Discussion/Kernelはvoteが最低限沢山付いているものだけでも読む。ドメイン知識(データ自身に対する専門知識)を入れる。最後まであきらめない。コンペ内容と基本的な内容の確認Kaggleの公式ページ詳しいコンペの内容は割愛しますが、データから「ユーザーが契約したローンを、遅延なく返せるかどうか」を当てるコンペでした。すごくざっくり説明すると下の図のような感じです。赤枠を当てるコンペです。Titanicのように1ファイルではなく、複数ファイル(テーブル)でデータが与えられています。実際には、たくさんの特徴量があります。1ユーザーに対して複数行の情報があるため、機械学習にかける前にデータの集計が必要でした。EDAKaggleには各コンペごとにフォーラムがあり、コンペ参加者がコードを公開する場(Kernel)、議論する場(Discussion)があります。Analysis)です。EDAのKernelでは、投稿者が行ったデータ分析の内容を投稿してくれています。いろいろな投稿者がEDAを投稿しており、人によってデータの分析の角度や可視化のやり方が違います。これらの記事を見ることで、HomeCreditに留まらずデータ分析のハウツーや可視化の引き出しを増やすことができました(デキる人からすれば常識的なスキルかもしれませんが)今回は幸運なことに、人気のEDAの日本語訳が投稿されており、この記事*3にはお世話になりました。公開されているEDA以外にも、自分自身でEDAをやる必要があったなと反省しています。コンペ参加コンペの活動履歴を綴っていきます。()内は、その時点のだいたいの最終順位です。7200)Kaggleに限らず新しいことを始めるにあたって一番しんどいのは、最初の一歩を踏むことだと思います。完璧主義を目指して挫折するよりも、まずはどんな手法でもいいから、「1サブミット」をすることを目標にしました。Kernelをざっと見ると、明らかに大事そうな特徴「EXT_SOURCE_1,2,3」があることに気づきました。この3特徴量を抽出して、RandomForest(自分が最近よく使ってた手法)で分類するモデルを作りました。LightGBMは使ったことがなく理論もわからなかったのですが、Kernelを見ながらプログラムを書いていきました。パラメータもKernelのものを使いました。思いついたものは片っ端から作って、最後に絞り込む方針でやりました。7200)次は、使っている全ファイルを機械的に集計することにしました。LightGBM(に限らずほとんどの機械学習アルゴリズム)を使うとき、特徴量の数は固定でないといけません。ユーザー1は購買履歴が3行、ユーザー2は購買履歴が10行・・・のように、各ユーザーごとにデータの特徴量が違うと都合が悪いので、図のような集計を全部の数値項目に対して行いました。この発想は独自のものではなく、Kernelの丸パクリ*4です。)次は、項目同士の突き合わせです。木のアルゴリズムはif文の集まりであるため、項目同士の関係を捉えにくいようです。元の特徴量をもとに新しく特徴量を生成しました。図にあるように、年収と子供の数の比を見れば、その家族が支払える金額の指標になりえます。項目の意味を考えて、様々な特徴量を作成しました。特徴量を作成するには、その業界特有の知識(=ドメイン知識)が必要とされます。私はドメイン知識がなかったので、特徴量の重要度(LightGBMが出力してくれる)を参照し、重要な特徴量同士を四則演算して特徴量を作成しました。これも、基本的な発想はKernelの丸パクリ*5で、そこから自分のアイデアを肉付けしていく形にしました。)項目同士の突き合わせですが、カテゴリ変数は割り算ができません。以下2つのアプローチで行いました。Encodingドメイン知識による数値変換TargetEncodingとは、カテゴリ変数をTargetの平均で埋めることです。(今回であれば支払遅延有無:1を「あり」とする)また、ドメイン(もしくは常識的な)知識によりカテゴリ変数を数値に変換しました。これらの処理を行うことで、数値特徴量とカテゴリ特徴量の四則演算が可能になります。)また、時系列的な考え方も取り入れました。普通に考えると、直近3ヶ月の履歴はそれより前の履歴よりその人の特性を表すと思ったからです。例として、図のような特徴量を取り入れました。過去30日金額÷過去90日金額など、直近の金額が過去と比べてどうであるか、のような特徴量も作りました。このアプローチはこのdiscussion*6から自分で考えました。7200)ここまでで作成した特徴量は、およそ1800個となりました。「LightGBMは冗長な特徴量があっても大丈夫」という意見もありましたが、特徴量が多いとメモリが足りないという都合と、やっぱり特徴量絞ったほうがいい結果が出る実感があったので*7、特徴量を絞りました。特徴量選択は、Kernelでも様々な手法が紹介されていましたが*8、自分が試したのは以下です。Importances*9SHAP*10結局、1で相関係数>0.95のものは片方削除→4で重要度ベスト400,500,600をそれぞれ選び、モデルに学習させました。)LightGBMのパラメータの意味がわからなくとも自動的にパラメータチューニングしてくれるすごいライブラリの使い方がKernelに公開されていたので、試しました。*12ただ、これらを使うには調整するパラメータの範囲や種類を指定しなければなりません。範囲や種類が多いほど時間がかかる。特徴量の数によっても、最適なパラメタは違う(らしい)。試していたのですが、上記のような理由もあり、やっぱりある程度LightGBM、GBDTの簡単な理屈を知ったうえで手でチューニングしたほうがいいかなと思い、使うのをやめました。実際、過去の似たようなコンペの上位解法を見ると、「パラメタチューニングは勘で決めました」であったり、「我々が時間を割くべきはパラメタチューニングではない」といった記述もありました。7200)パラメタの意味を知るため、簡単にLightGBMの勉強をしました。LightGBMを知るためにはxgboostを知ってる必要があり、xgboostを知るには勾配ブースティング木(GBDT)を知る必要があり、GBDTを知るには決定木を知る必要があるということがわかりました。参考になった資料のリンクを貼っておきます。Seguroとか見ました。結局いろいろ見て、(結局半分も理解できませんでしたが)以下の方針を立てました。アンサンブル考えると(後述)、以下がよかった。0.01※この方針はあまりよくなかった気もしています。)最後にアンサンブルをしました。「◯×クイズに60%正解する人が3人。正解率は一人の時より上がります!!つまり、いろんなモデルを作って多数決をさせることで、それぞれのモデルよりよい性能が出る可能性があります。重要なのは、「モデル同士の予想の相関が低いこと」です。モデル同士の予想の相関を低くするために、以下を行いました。LightGBMのdart,gbdtを組み合わせることで精度が良くなった。単一モデルより精度が良くなった低すぎるlearning_rateを使わない(単一モデルの精度はよいが、異なるseedを使っても多様性がなく、アンサンブルの効果が薄くなった)相関と精度を見て、最終的に、dart(500特徴量)・dart(400特徴量)・gbdt(500特徴量)のアンサンブルを組みました。)「スタッキング」とは、「複数のモデルが出した予想値」を入力にしてもう一度学習させ、最終的な予想を行うことです。キングもやったのですが、アンサンブル以上に精度が出なかったので断念しました。CV*14の精神で耐えました。LB0.802でした。感想とても勉強になりましたし、楽しかったです。データの分析の仕方もLightGBMもわからない状態でスタートしましたが、ほとんどKernelに助けられながら、最後までできました。実際、Kernelを全く見ないでやったら、半分より上にも行けなかったと思います。scikit-learnあたりの使い方が少しわかってきたけど次何すればよいか・・・という人には、Kaggleを強くおすすめします!また、コンペ参加中は、データ分析をみんなで一緒にやってる気持ちでした。discussionを読みながら、時々参加したり。リーダーボード(ランキング)をみて、「自分はこのスコアが限界だと思ってたけど、もっと伸びるのか」と、分析を投げずに最後までがんばれたり。中だるみもありましたが、充実した3ヶ月でした。自分自身が、Kaggleに参加する前とした後で変わったことは以下かなと思っています。特徴量作成が超大事だと分かった。(データを入れたら答えが帰ってくるわけじゃない)「テーブルデータの分類モデルの構築をどこから始めたらよいか」が分かった。特徴量作成の定石を少し覚えた。LightGBMの分類が使えるようになった。(@kurupical)です。進捗とメモいいところまで来ました。債務不履行になる人を予想するタスクです。Classification上位解法を読んだのでまとめる<実践>はじめてのKaggle体験記<メモ>tensorflowのimport時のエラー(libcublas.so.9.0が見つからない)月別アーカイブはてなブログをはじめよう!kurupicalさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。