【第39回_Beginner限定コンペ】債務不履行リスクの低減【データコンペ04】

コンペ概要

債務不履行リスクの軽減

コンペ詳細

目標

loan_status:返済状況
ChargedOff:1
FullyPaid:0

データ

  • 学習用データ (train.csv)
  • テスト用データ (test.csv)
  • サンプルファイル (submit.csv)

課題種別:分類
学習データサンプル数: 242150
説明変数の数:9
欠損値:不明

カラム ヘッダ名称 説明
0 id 顧客ID(インデックスとして使用)
1 loan_amnt 借入総額
2 term 返済期間
3 interest_rate 金利
4 grade グレード
5 employment_length 勤続年数
6 purpose 借入の目的
7 credit_score 信用スコア
8 application_type 借入時の申請方式
9 loan_status 返済状況(目的変数)

評価指標

・精度評価は、評価関数「F1Score」を使用します。
・評価値は0~1の値をとり、精度が高いほど大きな値となります。
・今回運営の設定するTier変更の閾値はF1Score=0.3739669とします。

情報公開ポリシー

モデル  : 公開可
分析結果 : 公開可

学習の目的

選択理由

練習問題を3問したので称号限定ではあるが、コンペに挑戦したいと思いました。

目標・目的

  • 閾値を超えてIntermediateに昇格する
  • データの可視化
  • 特徴量の生成
  • データから予測する

分析

データの確認

まずはデータの簡単な確認からやっていきます。

目標値loan_statusヒストグラム。不均衡なデータなので注意が必要そうです。

続いて数値データの相関関係。

loan_statusと相関関係が高いデータはないようです。ただ(interest_rate,term)、(interest_rate,credit_score)の相関係数がぼちぼちあるので一応念頭に置いておきます。

それぞれのデータのヒストグラムは左のグラフのような山が5つあるようなものが多かったです。

  • credit_score:730あたりから目に見えて貸し倒れの数が少なくなっている。おそらく外部機関の数値?だと思われるので信用できそう。
  • term:3のほうが貸し倒れの割合が低いので採用。期間が短いほうが支払い能力の高さや借入額の少なさに少し関係してそう。

相関関係が低いこの2つをベースラインの説明変数として進めていきたいと思います。

ベースライン作成

  • モデル:DecisionTreeClassifier (max_depth=6, class_weight=balanced)
  • 説明変数:[term,credit_score]
  • スコア:0.3337082

モデルはいつも通りLightGBMを使おうと思いましたが、評価スコアにf1がないとのことで断念。おそらく自分で評価関数を作成することで行けるとは思いますが、うまくいかなかったので諦めました。

なので今回は決定木を使って進めていきます。決定木のパラメータ(class_weight=balanced)を設定することで不均衡なデータに対応できるようにしました。
目標である0.37までいい感じに近い値が出たので決定木を軸に進めていきます。

col imp imp_std
credit_score 0.48684 0.005574
term 0.51316 0.005574

特徴量生成

  • モデル:DecisionTreeClassifier(max_depth=7, class_weight=balanced)
  • パラメータ:[credit_score,interest_rate,employment_length,loan_amnt_div_term]
    +grade_dummies_col]
  • スコア:0.3764720

使っていない説明変数の追加と新しい特徴量の生成をやっていきます。

interest_rateの追加

金利が低いことで貸し倒れのリスクが減るのではと予想しました。 グラフでも金利の差によってリスクの割合が増えていることがわかります。過学習の可能性もありましたが重要度次第で入れ替えてみてもいいなと思いました。

employment_lengthの追加

勤続年数によって給料の安定などで貸し倒れのリスクに違いがあると予想しました。
グラフでは割合はわかりにくさはありますが、追加してみるとスコアは僅かながらですがよくなったので採用しました。

grade_dummies_colの追加

グレードが何かは不明。
AからEにかけて貸し倒れのリスクが高まっていると判断しダミー変数として追加しました。おそらく銀行の預金額?などに応じてランク付けされたものと予想しています。銀行から見ていいお客さんかどうかみたいなというグレードですかねぇ。

loan_amnt_div_termの追加

一年当たりの返済額が少ないほど貸し倒れのリスクが小さくなるのではと思い特徴量を生成しました。実際にはその個人・企業の規模、返済能力によって違いそうではありますがそういうデータがないので作りました。

termの削除

特徴量を追加していくとだんだんとtermの重要度が下がっていくのが顕著に現れました。
他の特徴量(loan_amnt_div_termあたり?)が包含しているのかもしれません。削除することでスコアの改善が見れたので削除しました。

col imp imp_std
credit_score 0.019611 0.002656
employment_length 0.010781 0.003674
interest_rate 0.869820 0.003179
loan_amnt_div_term 0.011294 0.003444
他ダミー変数 ~ ~

振り返り

特徴量

特に目新しいものはなし。

可視化

混同行列

f1という評価指標だったので混同行列の表を適宜可視化するのが良いなと思いました。人に伝えるときにf1のスコアだけでなく表で見せることが大事だなと思います。

これはf1だけでなく評価指数を出すときに1度だけでも可視化をしていって練習していきたいと思います。

それぞれのデータの可視化

それぞれに対する可視化が素晴らしい記事を見つけました。次回以降これをマネしたいですね。記事の形さえ真似していきたいくらいです。いい人のまねをしていきましょう。

モデル

ロジスティック回帰

ロジスティック回帰は試してみたが、正直あまりうまくいかなかったのでベースライン段階であきらめてました。不均衡に対する処理がわからなかったのです。

それに対する回答のひとつがダウンサンプリングというもの。少数のデータに合わせて多数のデータを削減するというもの。データの損失こそあれど均等な学習ができそうです。

ランダムフォレスト

今回は決定木を使ったがランダムフォレストにしてみてもおもしろいかもしれないと思いました。

決定木はデータをいろいろ使うのに対してランダムフォレストは木をたくさん作るので、併用してアンサンブルするのもよいと思いました。

LightGBM

ベースライン作成時に評価指標にf1がないということで諦めましたが他の評価指標でモデリングすると良いというのを本で見つけました。最終的にf1で評価することでよくなるそうです。

また閾値に関しても0.01~0.99の間で最良のスコアが出るように探索することで不均衡なデータにも対応できるとのことでした。

反省点

データの確認

さすがに記事途中のリンクをみて自分のできていなさに驚きです。変数に対しての理解する姿勢が足りないと感じました。
そこが今後の道では重要になってくると感じたので参考にして次回以降アプローチしてみたいと思います。

時間不足

時間不足で試行錯誤できず。
次回以降はデータの確認や予測など変数の理解に対して大いに時間を割いてみたいと考えています。

最後に

コンペを重ねるにつれていろいろなむずかしさが出てきています。一番わからないのがグラフの使い方
今回の記事を参考に一度すべてのデータに対してグラフや要約統計量などを使い方、注意する個所などを理解して次回へのステップアップにつなげていきたいです。