Python に基づく信用スコアリング モデルの開発 - データとコードを使用

信用スコアリングモデルは、Aカード(アプリケーションスコアカード、アプリケーションスコアカード)、Bカード(行動スコアカード、行動スコアカード)、Cカード(回収スコアカード、回収スコアカード)の「4枚のカード」で表すことができます。ローン前、ローン中、ローン後に適用される F カード (Anti-Fraud Card、不正防止スコアカード)。

この記事では、主に Python に基づく信用スコアリング モデルの開発について説明し、各部分に関連するコードを添付します。

プロジェクトの流れ

典型的な信用スコアリング モデルを図 1-1 に示します。信用リスク格付けモデルの主な開発プロセスは次のとおりです。

1. データ取得。既存顧客および潜在顧客のデータの取得を含みます。既存顧客とは既に当該取引を行っている顧客を指し、潜在顧客とは今後当該取引を行おうとしている顧客を指します。

2. データ前処理。主なタスクには、データ クリーニング、欠損値処理、外れ値処理が含まれ、主に取得した生データをモデル開発に使用できる形式化されたデータに変換します。

3. 探索的データ分析: このステップは主にサンプルの全体的な状況を取得するためのもので、サンプルの全体的な状況を表す指標には主にヒストグラム、箱ひげ図などが含まれます。

4. 変数の選択。このステップは主に、統計的手法を通じてデフォルトのステータスに最も重大な影響を与える指標を選別することです。主に単変量特徴選択方法と機械学習モデルに基づく方法があります。

5. モデル開発。このステップには主に、変数セグメンテーション、変数 WOE (証拠の重み) 変換、およびロジスティック回帰推定が含まれます。

6. モデルの評価: このステップは主に、モデルの識別、予測、安定性の能力を評価し、モデルが使用できるかどうかに関する結論を引き出すモデル評価レポートを作成することです。

7. 信用スコア、ロジスティック回帰係数や WOE などに基づいて信用スコアを決定する方法。ロジスティック モデルを標準のスコアリング フォームに変換します。

8. スコアリング システムを確立し、信用スコアリング方法に基づいた自動信用スコアリング システムを確立します。

フォーマット_png 1

図 1-1 信用スコアリング モデルの開発プロセス

データ収集

データは Kaggle の Give Me Some Credit: https://www.kaggle.com/c/GiveMeSomeCredit/data から取得したもので、150,000 のサンプル データが含まれています。下の図は、このデータの一般的な状況を示しています。

データは個人消費ローンに属し、信用スコアリングの最終的な実装に使用できるデータのみを考慮する必要があります。データは次の側面から取得する必要があります。

– 基本属性: 当時の借り手の年齢を含む。

– 債務支払い能力: 借り手の月収と負債比率を含みます。

– 信用関係: 2 年以内に 35 ~ 59 日の延滞、2 年以内に 60 ~ 89 日の延滞、2 年以内に 90 日以上の延滞。

– 不動産ステータス: オープンクレジットとローンの数、不動産ローンまたはラインの数が含まれます。

– ローン属性: 今のところなし。

– その他の要素:借入者の扶養親族(本人は含まない)の数が含まれます。

– 時間枠: 独立変数の観測枠は過去 2 年間、従属変数の実績枠は今後 2 年間です。

フォーマット_png 2

図 2-1 生データの変数

#

データの前処理

データ処理の前に、データの欠損値と外れ値を理解する必要があります。Python には、データセットの欠損値、平均値、中央値を理解できる description() 関数があります。

 
 
  1. #载入数据
  2. data = pd.read_csv('cs-training.csv')
  3. #数据集确实和分布情况
  4. data.describe().to_csv('DataDescribe.csv')

データセットの詳細:

フォーマット_png 3

図 3-1 変数の詳細

上の図からわかるように、変数 MonthlyIncome と NumberOfDependents が欠損しており、変数 MonthlyIncome には合計 29731 個の欠損値があり、NumberOfDependents には 3924 個の欠損値があります。

3.1欠損値の処理

このような状況は実際の問題では非常に一般的であり、欠損値に対応できない分析手法を適用できなくなるため、信用リスク格付けモデル開発の最初のステップで欠損値に対処する必要があります。欠損値処理には以下のような方法があります。

**1. 欠損値のあるサンプルは直接削除されます。

2. サンプル間の類似性に基づいて欠損値を埋めます。

3. 変数間の相関関係に基づいて欠損値を埋めます。**

変数 MonthlyIncome の欠損率が比較的大きいため、変数間の相関に従って欠損値を埋め、ランダム フォレスト法を使用します。

 
 
  1. # 用随机森林对缺失值预测填充函数
  2. def set_missing(df):
  3. # 把已有的数值型特征取出来
  4. process_df = df.ix[:,[5,0,1,2,3,4,6,7,8,9]]
  5. # 分成已知该特征和未知该特征两部分
  6. known = process_df[process_df.MonthlyIncome.notnull()].as_matrix()
  7. unknown = process_df[process_df.MonthlyIncome.isnull()].as_matrix()
  8. # X为特征属性值
  9. X = known[:, 1:]
  10. # y为结果标签值
  11. y = known[:, 0]
  12. # fit到RandomForestRegressor之中
  13. rfr = RandomForestRegressor(random_state=0,
  14. n_estimators=200,max_depth=3,n_jobs=-1)
  15. rfr.fit(X,y)
  16. # 用得到的模型进行未知特征值预测
  17. predicted = rfr.predict(unknown[:, 1:]).round(0)
  18. print(predicted)
  19. # 用得到的预测结果填补原缺失数据
  20. df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted
  21. return df

NumberOfDependents 変数には欠損値が比較的少ないため、モデル全体に​​大きな影響を与えることなく直接削除できます。欠損値を処理した後、重複を削除します。

 
 
  1. data=set_missing(data)#用随机森林填补比较多的缺失值
  2. data=data.dropna()#删除比较少的缺失值
  3. data = data.drop_duplicates()#删除重复项
  4. data.to_csv('MissingData.csv',index=False)

3.2外れ値の処理

欠損値が処理された後、外れ値を処理する必要があります。外れ値とは、サンプリングされたデータの大部分から大きく外れる値を指します。たとえば、個々の顧客の年齢が 0 歳の場合、この値は通常、外れ値とみなされます。通常は外れ値検出の方法を使用して、サンプル母集団内の外れ値を見つけます。

まず、変数 age に 0 があることがわかり、これは明らかに外れ値であり、直接除去されます。

 
 
  1. # 年龄等于0的异常值进行剔除
  2. data = data[data['age'] > 0]

変数 NumberOfTime30-59DaysPastDueNotWorse、NumberOfTimes90DaysLate、および NumberOfTime60-89DaysPastDueNotWorse については、次の箱ひげ図図 3-2 から異常値があることがわかり、固有の関数から 2 つの異常値があることがわかります。値が 96 と 98 であるため、削除されました。同時に、変数の 1 つの値 96 と 98 が削除されると、それに応じて他の変数の値 96 と 98 も削除されることがわかります。

フォーマット_png 4

図 3-2 箱ひげ図

変数 NumberOfTime30-59DaysPastDueNotWorse 、 NumberOfTimes90DaysLate 、 NumberOfTime60-89DaysPastDueNotWorse の外れ値を除去します。また、データセットでは優良顧客は0、デフォルト顧客は1となっていますが、通常の理解で考えると、正常に契約を履行して利息を支払うことができる顧客は1なので、これを逆にします。

 
 
  1. #剔除异常值
  2. data = data[data['NumberOfTime30-59DaysPastDueNotWorse'] < 90]
  3. #变量SeriousDlqin2yrs取反
  4. data['SeriousDlqin2yrs']=1-data['SeriousDlqin2yrs']

3.3データのセグメント化

モデルのフィッティング効果を検証するには、データ セットをトレーニング セットとテスト セットに分割する必要があります。

 
 
  1. from sklearn.cross_validation import train_test_splitY = data['SeriousDlqin2yrs']
  2. X = data.ix[:, 1:]
  3. #测试集占比30%
  4. X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
  5. # print(Y_train)
  6. train = pd.concat([Y_train, X_train], axis=1)
  7. test = pd.concat([Y_test, X_test], axis=1)
  8. clasTest = test.groupby('SeriousDlqin2yrs')['SeriousDlqin2yrs'].count()
  9. train.to_csv('TrainData.csv',index=False)
  10. test.to_csv('TestData.csv',index=False)

探索的分析

モデルを構築する前に、通常、既存のデータに対して EDA (Exploratory Data Analysis、探索的データ分析) を実行します。EDA は、先験的な仮定をできるだけ少なくして既存のデータ (特に調査や観察からの生データ) を探索することを指します。一般的に使用される探索的データ分析方法には、ヒストグラム、散布図、箱ひげ図などが含まれます。

顧客の年齢分布は図 4-1 に示されており、年齢変数はほぼ正規分布しており、統計分析の仮定と一致していることがわかります。

フォーマット_png 5

図 4-1 顧客の年齢分布

顧客の年収分布は図 4-2 に示されており、月収はほぼ正規分布となっており、統計分析のニーズを満たしています。

フォーマット_png 6

顧客の年収分布は図 4-2 に示されており、月収はほぼ正規分布となっており、統計分析のニーズを満たしています。

変数の選択

特徴変数の選択 (並べ替え) は、データ分析と機械学習の実践者にとって非常に重要です。特徴を適切に選択すると、モデルのパフォーマンスが向上し、データの特性と基礎となる構造を理解するのに役立ちます。これは、モデルとアルゴリズムをさらに改善する上で重要な役割を果たします。Python 変数選択コードの実装については、Scikit-learn と組み合わせて一般的に使用されるいくつかの機能選択方法の紹介を参照してください: https://www.cnblogs.com/hh5460/p/5186226.html。

この論文では、信用スコアリングモデルの変数選択手法を使用し、  WOE分析手法を使用して、指標ビニングと対応するビニングのデフォルト確率を比較することによって指標が経済的重要性を満たすかどうかを判断しますまず、変数を離散化 (ビン化) します。

5.1ビニング処理

変数ビニングは、連続変数の離散化の名前です。クレジット スコア カードの開発では、等距離セグメント、等深度セグメント、および最適セグメントが一般的に使用されます。

このうち、等長間隔とは、年齢を10歳の区切りとするなど、区切りの間隔が一定であることを意味する。

等周波数間隔では、最初にセグメントの数を決定し、次に各セグメントのデータ量をほぼ等しくします。

最適ビニング は、教師あり離散化とも呼ばれ、再帰的分割 (再帰的分割) を使用して連続変数をセグメントに分割します。その背後には、より適切なグループ化を見つけるための条件付き推論に基づくアルゴリズムがあります。

まず連続変数の最適なセグメンテーションを選択し、次に連続変数の分布が最適なセグメンテーションの要件を満たさない場合は、連続変数の等距離セグメンテーションを検討します。最適なビニングのコードは次のとおりです。

 
 
  1. # 定义自动分箱函数def mono_bin(Y, X, n = 20):
  2. r = 0
  3. good=Y.sum()
  4. bad=Y.count() - good
  5. while np.abs(r) < 1:
  6. d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": pd.qcut(X, n)})
  7. d2 = d1.groupby('Bucket', as_index = True)
  8. r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)
  9. n = n - 1
  10. d3 = pd.DataFrame(d2.X.min(), columns = ['min'])
  11. d3['min']=d2.min().X
  12. d3['max'] = d2.max().X
  13. d3['sum'] = d2.sum().Y
  14. d3['total'] = d2.count().Y
  15. d3['rate'] = d2.mean().Y
  16. d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))
  17. d4 = (d3.sort_index(by = 'min')).reset_index(drop=True)
  18. print("=" * 60)
  19. print(d4)
  20. return d4

データセット内の REVOVUtilizationOfUnsecuredLines 、年齢、DebtRatio、および MonthlyIncome については、最適セグメンテーションを使用します。

フォーマット_png 7

図 5-1 REVOLUTIONUtilizationOfUnsecuredLines のビニング

フォーマット_png 8

図 5-2 年齢ビニングの状況

フォーマット_png 9

図 5-3 DebtRatio のビニング状況

フォーマット_png 10

図 5-4 MonthlyIncome のビニング状況

最適にビニングできない変数の場合、ビニングは次のようになります。

 
 
  1. # 连续变量离散化
  2. cutx3 = [ninf, 0, 1, 3, 5, pinf]
  3. cutx6 = [ninf, 1, 2, 3, 5, pinf]
  4. cutx7 = [ninf, 0, 1, 3, 5, pinf]
  5. cutx8 = [ninf, 0,1,2, 3, pinf]
  6. cutx9 = [ninf, 0, 1, 3, pinf]
  7. cutx10 = [ninf, 0, 1, 2, 3, 5, pinf]

5.2問題点

WOE 分析は、指標をビン化し、各ギアの WOE 値を計算し、指標によって変化する WOE 値の傾向を観察することです。WOE の数学的定義は次のとおりです。

woe=ln(良い属性/悪い属性)

分析するときは、各インデックスを小さいものから大きいものまで並べて、対応する bin の WOE 値を計算する必要があります正の指数が大きいほど WOE 値は小さくなり、負の指数が大きいほど WOE 値は大きくなります。正の指数のWOE値の負の傾きが大きいほど、また応答指数の正の傾きが大きいほど、その指数が識別能力に優れていることを意味する。WOE値が直線に近い場合、インジケーターの判断力が弱いことを意味します。正の指数と WOE の間に正の相関傾向があり、負の指数と WOE の間に負の相関傾向がある場合、この指数は経済的重要性を満たしていないため、削除する必要があることを意味します。

WOE 関数の実装は前のセクションの mono_bin() 関数に含まれているため、ここでは繰り返しません。

5.3相関分析とIVスクリーニング

次に、クリーン化されたデータを使用して、変数間の相関関係を調べます。ここでの相関分析は単なる予備チェックであり、変数スクリーニングの基礎としてモデルの VI (証拠の重み) がさらにチェックされることに注意してください。

Python の seaborn パッケージを使用し、heatmap() 描画関数を呼び出して相関グラフを描画します。実装コードは次のとおりです。

 
 
  1. corr = data.corr()
  2. #计算各变量的相关性系数
  3. xticks = ['x0','x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']#x轴标签
  4. yticks = list(corr.index)
  5. #y轴标签
  6. fig = plt.figure()ax1 = fig.add_subplot(1, 1, 1)sns.heatmap(corr, annot=True, cmap='rainbow', ax=ax1, annot_kws={'size': 9, 'weight': 'bold', 'color': 'blue'})
  7. #绘制相关性系数热力图
  8. ax1.set_xticklabels(xticks, rotation=0, fontsize=10)ax1.set_yticklabels(yticks, rotation=0, fontsize=10)plt.show()

フォーマット_png 11

図 5-5 データセット内の変数の相関関係

上の図からわかるように、変数間の相関は非常に小さいです。NumberOfOpenCreditLinesAndLoans と NumberRealEstateLoansOrLines の相関係数は 0.43 です。

次に、各変数の Infomation Value(IV) をさらに計算します。IV インジケーターは通常、独立変数の予測力を決定するために使用されます。その式は次のとおりです。

IV=sum((良い属性-悪い属性)*ln(良い属性/悪い属性))

IV 値によって変数の予測能力を判断する基準は次のとおりです。

< 0.02: 予測不能

0.02~0.1:弱

0.1~0.3:中程度

0.3~0.5:強い

0.5: 疑わしい

IV の実装は mono_bin() 関数に配置され、コードは次のように実装されます。

 
 
  1. # 定义自动分箱函数def mono_bin(Y, X, n = 20):
  2. r = 0
  3. good=Y.sum()
  4. bad=Y.count()-good
  5. while np.abs(r) < 1:
  6. d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": pd.qcut(X, n)})
  7. d2 = d1.groupby('Bucket', as_index = True)
  8. r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)
  9. n = n - 1
  10. d3 = pd.DataFrame(d2.X.min(), columns = ['min'])
  11. d3['min']=d2.min().X
  12. d3['max'] = d2.max().X
  13. d3['sum'] = d2.sum().Y
  14. d3['total'] = d2.count().Y
  15. d3['rate'] = d2.mean().Y
  16. d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))
  17. d3['goodattribute']=d3['sum']/good
  18. d3['badattribute']=(d3['total']-d3['sum'])/bad
  19. iv=((d3['goodattribute']-d3['badattribute'])*d3['woe']).sum()
  20. d4 = (d3.sort_index(by = 'min')).reset_index(drop=True)
  21. print("=" * 60)
  22. print(d4)
  23. cut=[]
  24. cut.append(float('-inf'))
  25. for i in range(1,n+1):
  26. qua=X.quantile(i/(n+1))
  27. cut.append(round(qua,4))
  28. cut.append(float('inf'))
  29. woe=list(d4['woe'].round(3))
  30. return d4,iv,cut,woe

生成された IV ダイアグラム コード:

 
 
  1. ivlist=[ivx1,ivx2,ivx3,ivx4,ivx5,ivx6,ivx7,ivx8,ivx9,ivx10]
  2. #各变量
  3. IVindex=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']
  4. #x轴的标签
  5. fig1 = plt.figure(1)ax1 = fig1.add_subplot(1, 1, 1)x = np.arange(len(index))+1ax1.bar(x, ivlist, width=0.4)
  6. #生成柱状图
  7. ax1.set_xticks(x)ax1.set_xticklabels(index, rotation=0, fontsize=12)ax1.set_ylabel('IV(Information Value)', fontsize=14)
  8. #在柱状图上添加数字标签
  9. for a, b in zip(x, ivlist):
  10. plt.text(a, b + 0.01, '%.4f' % b, ha='center', va='bottom', fontsize=10)plt.show()

出力画像:

フォーマット_png 12

図 5-6 各変数の出力 IV ダイアグラム

見てわかるように、DebtRatio、MonthlyIncome、NumberOfOpenCreditLinesAndLoans、NumberRealEstateLoansOrLines、および NumberOfDependents 変数の IV 値は大幅に低いため、削除されます。

モデル分析

証拠の重み (WOE) 変換は、ロジスティック回帰モデルを標準のスコアカード形式に変換できます。WOE 変換を導入する目的はモデルの品質を向上させることではありませんが、一部の変数はモデルの値を増やすことができないため、またはモデルの相関係数に関連する誤差が大きいため、モデルに含めるべきではありません。 、標準クレジットスコアカードの制定 WOE変換を使用しないことも可能です。

この場合、ロジスティック回帰モデルはより多くの独立変数を扱う必要があります。これによりモデリング手順は複雑になりますが、結果として得られるスコアカードは常に同じになります。

モデルを構築する前に、フィルタリングされた変数を信用スコアリング用の WOE 値に変換する必要があります。

6.1 WOE変換

各変数のビニングデータとWOEデータは取得済みなので、各変数のデータに合わせて置き換えるだけで実装できます。

 
 
  1. #替换成woe函数def replace_woe(series, cut, woe):
  2. list = []
  3. I = 0
  4. while i<len(series):
  5. value=series[i]
  6. j=len(cut) - 2
  7. m=len(cut) - 2
  8. while j >= 0:
  9. if value>=cut[j]:
  10. j = -1
  11. else:
  12. j -= 1
  13. m -= 1
  14. list.append(woe[m])
  15. i += 1
  16. return list

各変数を置き換えて、WoeData.csv ファイルに保存します。

 
 
  1. # 替换成
  2. woedata['RevolvingUtilizationOfUnsecuredLines'] = Series(replace_woe(data['RevolvingUtilizationOfUnsecuredLines'], cutx1, woex1))
  3. data['age'] = Series(replace_woe(data['age'], cutx2, woex2))
  4. data['NumberOfTime30-59DaysPastDueNotWorse'] = Series(replace_woe(data['NumberOfTime30-59DaysPastDueNotWorse'], cutx3, woex3))
  5. data['DebtRatio'] = Series(replace_woe(data['DebtRatio'], cutx4, woex4))
  6. data['MonthlyIncome'] = Series(replace_woe(data['MonthlyIncome'], cutx5, woex5))
  7. data['NumberOfOpenCreditLinesAndLoans'] = Series(replace_woe(data['NumberOfOpenCreditLinesAndLoans'], cutx6, woex6))
  8. data['NumberOfTimes90DaysLate'] = Series(replace_woe(data['NumberOfTimes90DaysLate'], cutx7, woex7))
  9. data['NumberRealEstateLoansOrLines'] = Series(replace_woe(data['NumberRealEstateLoansOrLines'], cutx8, woex8))
  10. data['NumberOfTime60-89DaysPastDueNotWorse'] = Series(replace_woe(data['NumberOfTime60-89DaysPastDueNotWorse'], cutx9, woex9))
  11. data['NumberOfDependents'] = Series(replace_woe(data['NumberOfDependents'], cutx10, woex10))
  12. data.to_csv('WoeData.csv', index=False)

6.2論理モデルの確立

statsmodels パッケージを直接呼び出して、ロジスティック回帰を実装します。

 
 
  1. 导入数据data = pd.read_csv('WoeData.csv')
  2. #应变量
  3. Y=data['SeriousDlqin2yrs']
  4. #自变量,剔除对因变量影响不明显的变量
  5. X=data.drop(['SeriousDlqin2yrs','DebtRatio','MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines','NumberOfDependents'],axis=1)
  6. X1=sm.add_constant(X)
  7. logit=sm.Logit(Y,X1)
  8. result=logit.fit()
  9. print(result.summary())

出力結果:

フォーマット_png 13

図 6-1 ロジスティック回帰モデルの結果

図 6-1 から、ロジスティック回帰のすべての変数が有意性テストに合格し、要件を満たしていることがわかります。

6.3モデルのチェック

この時点で、モデリング部分は基本的に終了です。モデルがどの程度予測可能であるかを検証する必要があります。モデリング段階の最初に確保したテストデータを検査用に使用します。モデルのフィッティング能力は ROC 曲線と AUC によって評価されました。

Python では、2 つの分類子を簡単に比較し、ROC と AUC を自動的に計算できる sklearn.metrics を使用できます。

実装コード:

 
 
  1. #应变量
  2. Y_test = test['SeriousDlqin2yrs']
  3. #自变量,剔除对因变量影响不明显的变量,与模型变量对应
  4. X_test = test.drop(['SeriousDlqin2yrs', 'DebtRatio', 'MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines', 'NumberOfDependents'], axis=1)
  5. X3 = sm.add_constant(X_test)
  6. resu = result.predict(X3)
  7. #进行预测
  8. fpr, tpr, threshold = roc_curve(Y_test, resu)
  9. rocauc = auc(fpr, tpr)
  10. #计算
  11. AUCplt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % rocauc)
  12. #生成ROC曲线
  13. plt.legend(loc='lower right')
  14. plt.plot([0, 1], [0, 1], 'r--')
  15. plt.xlim([0, 1])
  16. plt.ylim([0, 1])
  17. plt.ylabel('真正率')
  18. plt.xlabel('假正率')
  19. plt.show()

出力結果:

フォーマット_png 14

図 6-2 ROC 曲線

上図からわかるように、AUC 値は 0.85 であり、モデルの予測効果が依然として良好であり、精度が高いことを示しています。

クレジットスコア

モデリングに関する作業はほぼ完了し、ROC 曲線によるモデルの予測能力を検証しました。次のステップは、ロジスティック モデルを標準スコアカードの形式に変換することです。

7.1採点基準

フォーマット_png 15

上記の論文によれば、次のようになります。

a=log(p_good/P_bad)

スコア = オフセット + 係数 * log(オッズ)

標準スコアカードを作成する前に、ベース ポイント、PDO (パーセント ダブリング ポイント)、および良好/不良比率といったいくつかのスコアカード パラメータを選択する必要があります。ここでは、基本スコアとして 600 を採用し、PDO は 20 (良い対悪い比率の 2 倍より 20 ポイントごとに高くなります)、良い対悪い比率は 20 です。

 
 
  1. # 我们取600分为基础分值,PDO为20(每高20分好坏比翻一倍),好坏比取20。
  2. z = 20 / math.log(2)
  3. q = 600 - 20 * math.log(20) / math.log(2)
  4. baseScore = round(q + p * coe[0], 0)

個人総合点=基礎点+パート別得点

7.2 パートのスコアリング

各変数セクションのスコアは以下のように計算されます。各パートのスコア機能:

 
 
  1. #计算分数函数 def get_score(coe,woe,factor):
  2. scores=[]
  3. for w in woe:
  4. score=round(coe*w*factor,0)
  5. scores.append(score)
  6. return scores

各変数のスコアを計算します。

 
 
  1. # 各项部分分数
  2. x1 = get_score(coe[1], woex1, p)
  3. x2 = get_score(coe[2], woex2, p)
  4. x3 = get_score(coe[3], woex3, p)
  5. x7 = get_score(coe[4], woex7, p)
  6. x9 = get_score(coe[5], woex9, p)

図 7-1 に示すように、各パートのスコア カードを取得できます。

フォーマット_png 16

図 7-1 各変数のスコア基準

#

自動採点システム

変数に従ってスコアを計算するための実装は次のようになります。

 
 
  1. #根据变量计算分数
  2. def compute_score(series,cut,score):
  3. list = []
  4. i = 0
  5. while i < len(series):
  6. value = series[i]
  7. j = len(cut) - 2
  8. m = len(cut) - 2
  9. while j >= 0:
  10. if value >= cut[j]:
  11. j = -1
  12. else:
  13. j -= 1
  14. m -= 1
  15. list.append(score[m])
  16. i += 1
  17. return list

テストのスコアを計算してみましょう。

 
 
  1. test1 = pd.read_csv('TestData.csv')
  2. test1['BaseScore']=Series(np.zeros(len(test1)))+baseScore
  3. test1['x1'] = Series(compute_score(test1['RevolvingUtilizationOfUnsecuredLines'], cutx1, x1))
  4. test1['x2'] = Series(compute_score(test1['age'], cutx2, x2))
  5. test1['x3'] = Series(compute_score(test1['NumberOfTime30-59DaysPastDueNotWorse'], cutx3, x3))
  6. test1['x7'] = Series(compute_score(test1['NumberOfTimes90DaysLate'], cutx7, x7)
  7. test1['x9'] = Series(compute_score(test1['NumberOfTime60-89DaysPastDueNotWorse'], cutx9, x9))
  8. test1['Score'] = test1['x1'] + test1['x2'] + test1['x3'] + test1['x7'] +test1['x9'] + baseScore
  9. test1.to_csv('ScoreData.csv', index=False)

バッチ計算の部分的な結果:

フォーマット_png 17

図 8-1 バッチ計算の部分的な結果

概要と展望

この論文では、kaggle 上の Give Me Some Credit データのマイニングと分析を通じて、クレジット スコア カードの確立原理と組み合わせて、データの前処理、変数の選択、モデリング分析からクレジット スコアの作成までのシンプルな信用スコアリング システムを作成します。 。

AI ベースの機械学習スコアカード システムは、自動モデリング、モデル評価、および特徴変数の継続的な最適化を実行する前に古いデータを (2 年などの特定の時点以降) 削除することで、システムをより強力にすることができます。

記事リンク | https://zhuanlan.zhihu.com/p/35284849

[Python] ここでは、Python を使用したクレジット スコア カードの開発について紹介します。「Python 財務リスク管理スコア カード モデルとデータ分析 (拡張版)」のより関連性の高い実際の事例は、銀行トレーニングや論文参照用に定期的に更新されます。コース。

おすすめ

転載: blog.csdn.net/fulk6667g78o8/article/details/132305977