DeepAnalyticsのコンペやった話
お久しぶりです。私です。
リアルの課題でボコボコにされていました…
今回やるコンペでもかなりボコボコにされたのでまとめます。
あんまりよくない結果だと悔しいじゃないですか
今回は、DeepAnalyticsの練習問題の銀行のやつをやっていきます。
データは以下から
データのこと
まずは、いつも通りこのデータのことについてです。
- ID
id
- 年齢
age
- 仕事
job
- 結婚
marital
- 学歴
education
- 債務不履行
default
- 年間平均残高
balance
- 住宅ローン
housing
- 個人ローン
loan
- 連絡方法
contact
- 最終接触日
day
- 最終接触月
month
- 最終接触時間
duration
- 現キャンペーンにおける接触回数
campaign
- 経過日数:前キャンペーン接触後の日数
pdays
- 接触実績:現キャンペーン以前までに顧客に接触した回数
previous
- 前回のキャンペーンの成果
poutcome
- 定額預金申し込み有無
y
半分くらいが質的変数になっています。
目的変数がわかりやすくて助かります。
データの前処理
欠損値やらの話の前に…month
とday
を1つにまとめて扱うことにしました。
タイタニックでも似たようなことしていたしなぁ…と思いながらやったんですがあまり良いと言えなさそうです。
次に欠損値を
欠損値
NaN
の数を見てみます。
こういうコンペで欠損値ないデータって有るんだ…
とか思ってたんですけどそんなことなかったですね、-1とか"unknown"とかの値に置き換わっていただけでした。
まずはそれをNaN
に置き換えることから初めます。
カテゴリの変数が文字で入っているので若干面倒でした。
ちなみに、カテゴリの変数はdf.Column.value_counts()
で一覧を出して見るほうが手っ取り早そうです。
欠損値がある変数がeducation
、contact
、 pdays
、poutcome
、job
です。
この中で、pdays
とpoutcome
はデータ数の8割くらいが欠損してるので使うのを辞めます。
ちなみに残りはデータ数の1割、2割を下回ったりだったのでこのくらいなら推定していきます。
推定にはカテゴリな変数多いし推定する変数もカテゴリカルだしでランダムフォレスト使っていいかな…という判断で使いました。
偏り
それからこのデータ、変数によっては非常に偏っています。
例をあげると、default
の変数なんか大半のデータがnoになっています。なんか当たり前な気がしますね…
ちなみに偏っていそうな変数を出すとこんな感じです。
偏っている変数を出すのにいちいちNaN
に置き換えていたんですが、pd.query("Column == Element")
を用いることで条件にあった行だけ抽出可能です。あとはそれの個数を数えればでてきます。
この偏った変数も消去していきます。
default
、loan
、previous
の3つが8割以上が一種類に偏っているため削除しようかなと思います。
正直偏った変数の扱いをどうしたらいいのか未だによくわかっていないので消して良いものか迷います。
ここまでやって思ったんですけどこのデータなかなか扱いにくいです。
学習
取り除いたり推定したりしていよいよ学習です。
といってもこれもランダムフォレストに放り込むだけなんですけどね…。
結果
コンペなので送信します。
このスコアが出る瞬間が一番緊張します。
そして結果がこちら
流石に自分でも笑いましたよね…
310人中308位でスコア0.1って…
ランダムフォレスト自体は使ってる人が多い(というか一番使われている)ので、原因があるとしたら欠損値の推定と偏りの消去、月日の統合でしょうね。
benchmarkが0.73353なのですごい悔しいですね。
おわりに
今回はなかなかひどい結果に終わりました。
原因としては、上記のように欠損値やら偏った変数やらの扱いだと思います。
またスコアが上がったらそのときにまとめたいと思います。
++ 次回までの課題 ++
- 偏った変数の扱い
- 推定手法の再検討
- 偏った変数の扱いの再検討
- 月日の統合が正しいのかどうか
以上になります。ありがとうございました。