ここ最近、KaggleのLoan Predictionのコンペに参加していました。結果はTop25%入りでした。(コンペの詳細は、http://www.kaggle.com/c/loan-default-prediction)
このコンペの目的は、名前のとおり債権のデフォルト予測なのですが、多くのデフォルト予測は「デフォルトする・しない」のクラス分類問題です。しかし、このコンペは、デフォルトする・しないの分類だけではなく、デフォルト後の回収率を予測するという数値予測の要素も入っています。
実は、開始当初の数週間は、全てデフォルトしないと予測する「ゼロベンチマーク」を超えられず、かなり苦戦しました。しかし、いくつかブレークスルーがあり、最終的にはTop25%で着地しました。最後の1週間、時間がなくてモデルをアップデートできなかったのが悔やまれますが、まぁ、いろいろと学びがあったので、良しとしましょう!
このコンペの最大の難関は、説明変数約700個の内容が隠されていることです。もし、「利子率」とか「満期までの時間」などがわかればもっと簡単なのでしょうが、データセットの変数のラベルは、f201やf355と付けられているので、どの列が何を意味しているのかわかりません。つまり、Feature Engineeringができないことになります。
また、コンペは、Mean Absolute Error(MAE)で競われることになります。この点も非常に重要なところです。
そして、私がとったアプローチは以下2段階です。
① デフォルトした、しないのフラグを作り、クラス分類のモデルを作る。
② デフォルトしたサブセットのみを対象に、回収率の予測モデルを作る。
①の問題は「どのアルゴリズムを使うか」ということよりも、変数選択です。また、データセット中、デフォルトした債権の本数は約10%なので、かなりアンバランスなデータセットです。
そこで、フォーワードステップワイズ式のロジスティック回帰で、説明変数の絞り込みを行いました。ここで意識したのは、「何」を最大化(最小化)させるようにステップワイズを組むかです。通常のステップワイズでは、新たな変数を加えた時にAICが改善、Devianceが改善するかどうかで行いますが、今回のコンペの目的はクラス分類の精度が重要なわけです。そこで、F1スコア(PrecisonとRecallの調和平均)が最大になる変数を選択するように関数を組みました。この結果、5つの説明変数が選ばれ、F1スコアが約0.85でした。
次に、選ばれた変数を実際にグラフで見てみて、傾向を探り、ある変数と別の変数の差が予測に貢献していそうなことがわかったので、それら2つの変数の差を取ったものを、新たな変数として加えました(元の2変数は削除)。
このうえで、アルゴリズムを変えることでF1スコアが上がるかどうかを試しました。直観的には、ロジスティック回帰で0.85いくのであれば、ランダムフォレスト、ニューラルネットワークでも同等かそれ以上になるだろうということで、この2つを試しました。最終的にはニューラルネットで、F1が0.91にまで上昇しました。これで、①のクラス分類モデルの作成は終了です。
②は、①のモデルを使って、デフォルトする「だろう」と予測されたサブセットを作ります。ここで注意したのは、元データのうち本当にデフォルトしたものだけを抽出するか、①の予測モデルで、デフォルトと予測されるものを抽出するかですが、私は後者を選んでいます。賛否両論あるかと思いますが、①のモデルには誤差があるので、その誤差も含めて、②のステージで予測しようというのが考え方です。
②では、回帰分析で予測モデルを考えました。問題は残差の仮定ですが、最終的にはポアソンで落ち着きました。単純な回帰分析の場合は、被説明変数が0~100と限定されているのに対し、予測値は0以下も100以上も出ますので、予測値を得た後で、丸めなくてはなりません。今回のデータは0~100の整数で、かつ0側に歪んでいる分布だったので、ポアソンにして、残差もチェックしたら悪くない感じでした。ただ、単純に全変数を突っ込んで予測していても、順位が上がらなくなっていたので、2変数の交互作用の全組み合わせを入れて、ステップワイズでMAEを最小化するモデルを選ぶようにしました。
②はえいやー!でやった感は否めず、もう少し時間があれば変数選択をちゃんとできたかもしれませんが、まぁ、結果は悪くないと思っています。
次回も頑張りたいと思います!
30歳からの留学チャレンジ。San Francisco にあるUniversity of San Franciscoでの日々。
2014年3月17日月曜日
2013年10月7日月曜日
Kaggle Hackathon!! ハッカソン!
先日、サンフランシスコのマイクロソフトで行われたKaggle Hackathonに、クラスメートと参戦してきました。
結果は8位。上出来です!
Kaggle Hackathonとは、24時間レースで、機械学習の精度を競い合うコンペです。
今回のテーマは、あるソーシャルネットワークのサイトのView数、コメント数、投票数を予測するというもので、そのサイトは、ある地域住民が地域の不満や改善してほしい点を投稿し、他のユーザーが、コメントしたり投票したりします。
そして、投票数が多いものに関しては解決が図られるというものです。たとえば、「道に落書きがあり、汚いから、なんとかして!」みたいな投稿に対して、投票されます。
うちのチームは人数あ多かったので、24時間の間でもいろいろな手が打てたのも好成績の要因だったと思います。私は、投稿のタイトルをテキストマイニングして、新たなダミー変数を作るということをしてました。表記ゆれ、スペルミスを正規表現で修正していくような感じですね。
残念ながら、作った変数はあまり予測力向上に役立ちませんでした。
オンサイトのコンペで良いのは、優勝者と話ができることです。優勝した方と話したら、テキストデータは最初に分析しないと決めていたといってました。データをざっと見て、あまり相関してなさそうだと見たということです。
さすが、洞察がするどい!自分は、そういう感覚がまだあまり備わっていないなぁと感じてしましました。データをざっと眺めて、最初にplay aroundしたときに、予測する変数と説明変数の間にどんな関係がありそうかを見出すというのが肝心だということです。
できることが増えると、やってみたい分析をやってしまうという陥りやすい罠にはまってしまうということを学習しました。
他のKaggleコンペにも参戦しているので、今回の教訓を活かします!でも、チームで8位とれたので、よしとしましょう!
結果は8位。上出来です!
Kaggle Hackathonとは、24時間レースで、機械学習の精度を競い合うコンペです。
今回のテーマは、あるソーシャルネットワークのサイトのView数、コメント数、投票数を予測するというもので、そのサイトは、ある地域住民が地域の不満や改善してほしい点を投稿し、他のユーザーが、コメントしたり投票したりします。
そして、投票数が多いものに関しては解決が図られるというものです。たとえば、「道に落書きがあり、汚いから、なんとかして!」みたいな投稿に対して、投票されます。
うちのチームは人数あ多かったので、24時間の間でもいろいろな手が打てたのも好成績の要因だったと思います。私は、投稿のタイトルをテキストマイニングして、新たなダミー変数を作るということをしてました。表記ゆれ、スペルミスを正規表現で修正していくような感じですね。
残念ながら、作った変数はあまり予測力向上に役立ちませんでした。
オンサイトのコンペで良いのは、優勝者と話ができることです。優勝した方と話したら、テキストデータは最初に分析しないと決めていたといってました。データをざっと見て、あまり相関してなさそうだと見たということです。
さすが、洞察がするどい!自分は、そういう感覚がまだあまり備わっていないなぁと感じてしましました。データをざっと眺めて、最初にplay aroundしたときに、予測する変数と説明変数の間にどんな関係がありそうかを見出すというのが肝心だということです。
できることが増えると、やってみたい分析をやってしまうという陥りやすい罠にはまってしまうということを学習しました。
他のKaggleコンペにも参戦しているので、今回の教訓を活かします!でも、チームで8位とれたので、よしとしましょう!
2013年8月17日土曜日
KAGGLE
KAGGLEってご存知ですか?
データ分析のコンペを行っている会社で、いろいろな会社がテーマとデータを提供し、それに対して参加者が機械学習のモデルを構築し、その精度を競い合うというものです。
先日、KAGGLEのChief ScientistのJeremy Howard氏がゲストスピーカーで来校して、いろいろとお話しされていたので、ホームページを見てみたところ、面白そう!!ということで、参加してみました。
KAGGLE
http://www.kaggle.com/
私が参加したのは以下の2つのコンペです。
・ Yelp(ぐるなびみたいなもの)のリコメンデーションシステムの精度コンペ
・ タイタニックの生存予測の精度コンペ
実際にやってみると、結構はまってしまいまして(あまりに楽しい・・・)、貴重な夏休みをほとんど使ってしまいました。まるで、テレビゲームにはまった子供状態です。
まだコンペの締切まで時間がありますが、夏休みの宿題をそろそろやり始めないとやばいので、心を鬼にしてRとPythonを閉じました。
このコンペを通じて、いくつか自分の中で考えないといけないことがあるなぁと思いましたので、忘れないようにまとめておきます。
課題その1
参加者平均はいくものの、そこから抜けられない。
両方のコンペでの課題です。この原因は2つあると思っていて、データ作り・特徴量づくりがイケてないのと、手法の習熟度が低いことです。特に前者が大きな問題だと思っています。
両方のコンペで、ランダムフォレスト、ニューラルネットワーク、rpartの決定木、ロジスティック回帰などいろいろ試しましたが、精度はランダムフォレスト、ニューラルネット、rpart概ね同じでした。インプットしているデータが判別に役立っていないからでしょう。
どうやって精度をあげていくか、アメリカにいる間に掴んでいきたいものです。
課題その2
モデルの評価をうまく整理できない。
たくさんモデルを作るなかで、「あれ、さっきのモデル、どの名前だったけ?」ということが起きて、時間をロスしました。
さらに、精度もRの打ちだしだけで見て確認して、終わり!ってやっていたので、あとで振り返ることができないという事態が発生。。。作成したモデルの管理、評価、改善点がどこかについて、うまく回せるようにしないと、効率悪くて仕方ないです。
結果は満足できないですが、いろいろと反省点や問題意識も持てたので、楽しい夏休みでした。
さぁ、マジでリーディングやらないと・・・・
データ分析のコンペを行っている会社で、いろいろな会社がテーマとデータを提供し、それに対して参加者が機械学習のモデルを構築し、その精度を競い合うというものです。
先日、KAGGLEのChief ScientistのJeremy Howard氏がゲストスピーカーで来校して、いろいろとお話しされていたので、ホームページを見てみたところ、面白そう!!ということで、参加してみました。
KAGGLE
http://www.kaggle.com/
私が参加したのは以下の2つのコンペです。
・ Yelp(ぐるなびみたいなもの)のリコメンデーションシステムの精度コンペ
・ タイタニックの生存予測の精度コンペ
実際にやってみると、結構はまってしまいまして(あまりに楽しい・・・)、貴重な夏休みをほとんど使ってしまいました。まるで、テレビゲームにはまった子供状態です。
まだコンペの締切まで時間がありますが、夏休みの宿題をそろそろやり始めないとやばいので、心を鬼にしてRとPythonを閉じました。
このコンペを通じて、いくつか自分の中で考えないといけないことがあるなぁと思いましたので、忘れないようにまとめておきます。
課題その1
参加者平均はいくものの、そこから抜けられない。
両方のコンペでの課題です。この原因は2つあると思っていて、データ作り・特徴量づくりがイケてないのと、手法の習熟度が低いことです。特に前者が大きな問題だと思っています。
両方のコンペで、ランダムフォレスト、ニューラルネットワーク、rpartの決定木、ロジスティック回帰などいろいろ試しましたが、精度はランダムフォレスト、ニューラルネット、rpart概ね同じでした。インプットしているデータが判別に役立っていないからでしょう。
どうやって精度をあげていくか、アメリカにいる間に掴んでいきたいものです。
課題その2
モデルの評価をうまく整理できない。
たくさんモデルを作るなかで、「あれ、さっきのモデル、どの名前だったけ?」ということが起きて、時間をロスしました。
さらに、精度もRの打ちだしだけで見て確認して、終わり!ってやっていたので、あとで振り返ることができないという事態が発生。。。作成したモデルの管理、評価、改善点がどこかについて、うまく回せるようにしないと、効率悪くて仕方ないです。
結果は満足できないですが、いろいろと反省点や問題意識も持てたので、楽しい夏休みでした。
さぁ、マジでリーディングやらないと・・・・
登録:
投稿 (Atom)