Menu
CoddyTech

与信審査

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 56/58。

協同組合銀行がストアカードを運営しています。cards.csvでは、320人のカード保有者のうち79人が、初年度に支払いを滞納しました。

支払いを滞納しなかった241人と滞納した79人の負債比率の密度ヒストグラム。滞納しなかった人は主に0.1から0.35の範囲に分布し、滞納した人は右側の0.3から0.8の範囲にずれており、広い範囲で重なっている

負債は役立ちますが、グループは重複しています。銀行は各申請者のリスクを評価し、しきい値を超えた人を審査担当者に回します。

そのルールは、将来の支払い遅延者の一定の割合を捉えることです。検証データの行でしきい値を選び、その後テストデータの行で一度だけ評価します。

challenge icon

チャレンジ

難しい

プログラムは、銀行が求める再現率である target を読み取ります。用意されたコードには、列と降順の thresholds が一覧されています。

  1. 層化抽出でテスト用に4分の1を分け、残りからさらに層化抽出で検証用に4分の1を分けます。どちらも random_state=0 を指定します。
  2. 残った訓練用の行でパイプラインを学習させます。数値は中央値で補完してスケーリングし、home はワンホットエンコーディングし、ロジスティック回帰を行います。
  3. 検証データで、再現率が target に達する最初のしきい値を選びます。
  4. そのしきい値を出力し、続けてそのしきい値でのテストデータの結果を、以下のように出力します(小数点以下3桁)。

別の銀行で 0.7 の場合:

Threshold: 0.3 (validation recall 0.733)
Test: caught 15 of 21 late payers, 12 false alarms
Precision: 0.556

自分で試してみよう

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import recall_score, precision_score, confusion_matrix

cards = pd.read_csv("cards.csv")
numbers = ["age", "income_k", "debt_ratio", "years_at_job", "late_payments", "card_limit_k"]
text = ["home"]
X = cards[numbers + text]
y = cards["fell_behind"]

target = float(input())
thresholds = [0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1]

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ