スコアカードプロジェクトの概要

1.分析の目的

クレジットスコアユーザーがデフォルトするかどうかを判断するためにカードが作られます。

第二に、データ処理

このステップには、列名の変更、重複排除、欠損値、外れ値などの従来の処理だけでなく、WOEビニングも含まれます。

2.1、列名フォーマットの規範的な処理

データの「NumberOfTime60-89DaysPastDueNotWorse」や「NumberOfTime30-59DaysPastDueNotWorse」などの一部の列名を変更します。一部のアルゴリズムまたはメソッドにより、列名の一部の記号は問題またはエラーを引き起こす可能性があります。たとえば、ここでの「-」は回帰式ではマイナス記号と見なされるため、「_」に置き換えられます。

train_data.columns=train_data.columns.map(lambda x:x.replace('-','_'))

2.2、繰り返されるデータ処理

重複データを削除します。データが重複すると、回帰係数の標準誤差が減少し、対応するp値が減少します。

train_data.drop_duplicates(inplace=True)

2.3。欠損値の処理

2.3.1。欠損値の分布を表示する

missingnoライブラリーのmatrix()メソッドを使用して、各機能の欠損値を表示します。

import missingno as msno
msno.matrix(train_data)
plt.show()

ここに画像の説明を挿入上の図では、2つの列「MonthlyIncome」と「NumberOfDependents」に欠損値があります。

2.3.2、欠損値処理ロジック

1.欠損値を処理する従来の方法は、欠損値の80%を超えるデータを直接削除することです。クレジットスコアカードの場合、すべての変数をビニングする必要があるため、ここで欠落している値を個別のボックスとして使用できます。
2.「NumberOfDependents」の最後の列では、欠損値の割合はわずか2.56%です。単一のボックスとして、情報は十分ではないため、単一の値が入力されます。中央値を使用して塗りつぶします。

2.3.2。欠損値を単一の値で置き換える

最後の列 'NumberOfDependents'の欠損値を中央値に置き換えます。

NOD_median=train_data['NumberOfDependents'].median()
train_data['NumberOfDependents'].fillna(NOD_median,inplace=True)

2.4。外れ値の処理

外れ値の一般的な処理方法には、外れ値が配置されている行の削除、欠損値による置換(欠損値を処理するため)、またはブロッキングメソッドが含まれます。ビジネスロジックとアルゴリズムの要件を組み合わせて、外れ値を処理するかどうか、およびその処理方法を決定します。一般に、ブロッキング方法を使用できます。つまり、極端な極値は異常の少ない極値に変更されます。省略することもできます。最初にブロッキングメソッド関数を定義し、必要に応じて使用します。

def block(x,lower=True,upper=True):
# x是输入的Series对象,lower表示是否替换1%分位数,upper表示是否替换99%分位数
    ql=x.quantile(0.01)
    qu=x.quantile(0.99)
    if lower:
        out=x.mask(x<ql,ql)
    if upper:
        out=x.mask(x>qu,qu)
    return out

2.4、カスタム関数、データクリーニングプロセスの要約

最初にデータクリーニングプロセスをカプセル化する関数を定義します。この関数は、後で新しいデータを予測するときにデータクリーニングを同期するために使用できます。

def datacleaning(testdata,include_y=False):
    testdata.columns=testdata.columns.map(lambda x:x.replace('-','_'))
    testdata['NumberOfDependents'].fillna(NOD_median,inplace=True)      #新数据的缺失值需要用训练集的填充方式处理
    if include_y:
        testdata["SeriousDlqin2yrs"]=1-testdata.SeriousDlqin2yrs  #好客户用1表示,坏客户用0表示,便于混淆矩阵指标分析提取
    return testdata

3.機能の選択

まず、外部ファイルsmob.pyをカスタマイズします。このファイルは、決定木による特徴関数の選択、WOEの生成とIV値関数の計算、および計算モデル評価インデックス関数をカプセル化します。
注:関連する関数は、記事の最後にある完全なコードにリストされています。

3.1。各Xのビニングオブジェクトを生成する

まず、説明として「RevolvingUtilizationOfUnsecuredLines」機能を使用しますが、他の機能は同じです。
1.最初にデータを初期化します

y='SeriousDlqin2yrs' #初始化一个标签名变量
iv_all=pd.Series()   #初始化一个空序列变量,用于存放各特征IV值

2. smbin関数を呼び出して、機能のwoeデータとIV値を見つけます。

RUO=smbin(train_data,y,'RevolvingUtilizationOfUnsecuredLines')

ここに画像の説明を挿入

3.2、すべての特性IV値を表示する

IV値は、重要な機能をスクリーニングするために使用される指標の1つです。IV値によれば、0.02未満のフィーチャは削除されます。一般に、IV <0.02、ほとんど予測の助けがない; 0.02≤IV <0.1、ある程度の助けがある; 0.1≤IV <0.3、予測の大きな助けがある; IV≥0.3、大きな助けがある。

iv_all.sort_values(ascending=False)

ここに画像の説明を挿入結果から、これらの機能は多かれ少なかれ重要です。次に、効果を確認するための予備的なモデルを作成します。

3.3、WOEデータを生成する

ビニングの原則:ビニングの数は中程度であり、多すぎたり少なすぎたりはしません;各ビニングのレコード数は妥当です;ビニングは明らかな傾向特性を反映する必要があります; 教師付きビニング法を選択し、アルゴリズムはCARTツリーを選択しました。
1.リストを初期化する
以前にsmbinおよびsmbin_cuによって取得されたオブジェクトは、IV値に従ってフィルタリングされ、リストに配置されます。

x_list = [RUO,age,NO3059,DebtRatio,MonthlyIncome,NOO,NO90,NRE,NO6089,NOD]

2. WOEデータ
生成するsmgen関数を使用して、取得したリストに基づいて新しいデータを生成します

data_woe=smgen(train_data,x_list)
data_woe.head()

ここに画像の説明を挿入

第四に、モデリング

4.1、予備モデリング

ロジスティック回帰モデルを確立し、データを適合させ、回帰結果を表示します。

glmodel=sm.GLM(Y_train,X_train,family=sm.families.Binomial()).fit()
glmodel.summary()    
#可以查看系数(coef)、系数标准误(std err)
#P>|z|,就是P检验,小于0.05说明显著,说明变量是重要变量

ここに画像の説明を挿入
モデルから返された結果から、IV値は重要な機能のスクリーニングに役立ちますが、正確な方法ではありません。データの高いIV値は必ずしも重要な特徴ではないようです。次に、仮説検定を行う必要があり、P検定を選択します(0.05未満が重要な機能です)。「NumberOfOpenCreditLinesAndLoans_woe」フィーチャーのP値が0.05より大きいことがわかったため、フィーチャーを削除することにしました。

4.2、共線性を表示

各予測変数のvif値を計算して、変数間に共線性があるかどうかを確認します。VIF値が大きいほど、係数の標準誤差は大きくなり、信頼区間は特に小さくなります。VIFが[1,3)の場合、変数を直接使用できます。[3,7)の場合、データを使用する前に少し処理する必要があります。[7,10)の場合、データを使用して処理する必要があります。現象、変数を変更する必要があります。

vif=[variance_inflation_factor(X_train.iloc[:,1:].values,i
                              ) for i in range(X_train.shape[1]-1)]
print(pd.Series(dict(zip(X_train.columns[1:],vif))))

ここに画像の説明を挿入結果から、変数間に共線現象がないことがわかります。次に、スコアカードを作ります。

V.スコアカードを生成する

5.1。クレジットスコアモデルを生成する原理

1.特定のスコアについて、優良顧客と不良顧客には一定の比例関係があります。つまり、オッズ(奇数)、オッズ= xPctGood / xPctBadです。
2.特定のスコア値を上げると、オッズ比は2倍になります。たとえば、45ポイント、オッズは2倍になります(50:1から100:1まで)
。3.式(5.1):スコア=オフセット+ファクター×ln(奇数);式(5.2):スコア+ pdo =オフセット+係数×ln(2×オッズ)
4.この時点で、カスタム関数smscale(モデル、機能リスト、pdo、スコア、オッズ)を使用する必要があります。値の範囲は、上記の2つの式を組み合わせて、3つのパラメーターpdo、score、およびoddsの値を調整します。
ここでのビジネス改善の範囲は[300、843]で、最後にパラメーター値を取得します:pdo = 43、スコア= 1151、オッズ= 10。

5.2。各カテゴリのスコアを計算する

ロジスティックロジスティック回帰によって得られた回帰方程式の左側は、前のステップのクレジットスコア式(5.1)に代入されます。
ここに画像の説明を挿入カスタム関数ScoreCardは各カテゴリのスコア結果を保存し、scorecard.ScoreCardはデータを取得できます。

ここに画像の説明を挿入

6.評価モデル

KS曲線を描いて評価します。
1.前のスコアカードオブジェクトに従って、テストセットスコアを取得します。

testscore=smscoregen(scorecard,X_test)

2.テストセットの真のyと予測スコアを通るks曲線を描き、同時に対応する最適なしきい値と関連するメトリックを取得します。

evaluate1=evaluate01(Y_test,testscore['Score'],index='ks',plot='ks')

ここに画像の説明を挿入

7、新しいデータ予測

1.最初にデータを読み取ります。

test_data=pd.read_csv('data/CreditScore_data/give-me-some-credit-dataset/cs-test.csv',index_col=0)

2.データに対してトレーニングデータと同じクリーニングを実行します。つまり、以前に定義されたクリーニング関数を使用します。

test0=datacleaning(test_data)

3.以前に取得したビニングオブジェクトからwoe列を含むデータを生成します。

test_woe=smgennew(test0,x_list)
test_woe.head()

4. WOEデータを抽出して予測データを生成し、定数項目列を追加します。

T=test_woe.iloc[:,-len(x_list):]
T=sm.add_constant(T)

5.データの各行のスコアを予測して、各フィーチャの合計スコアとスコアを生成します。

Tscore=smscoregen(scorecard,T)

6.トレーニングから得られたスコアとしきい値に基づいて顧客の質を判断します。良い顧客は1、悪い顧客は0です。

test0[y]=(Tscore.Score>evaluate1.cutoff)*1
test0.head()

ここに画像の説明を挿入
AUC値を表示します:evaluate1。AUC = 0.8609421718165055。これは、モデルの汎化能力が優れていることを示しています。

8.まとめ

1.このプロジェクトの焦点は、重要な機能をビニングして特定することであり、データのクリーニングを減らすことです。
2.このプロジェクトの難しさは、パラメーターを調整することです。最初にスコアパラメーターを修正してから、他の2つのパラメーターを調整して、データの変化傾向を観察する必要があります。スコアパラメータは天びんの中心線に相当します。他の2つのパラメータpdoとオッズは、左側と右側の重みであり、データは、左側と右側の重みを加算または減算することによって到達できます。
3.回帰アルゴリズムは、繰り返し値、欠損値、変数間の共線性に特に敏感であることに注意してください。モデリングする前に、それを分析して処理する必要があります。
4.注意が必要なもう1つの詳細は、欠損値を処理する前にデータセットを分割してから、データ処理を実行する必要があることです。トレーニングセットを処理するときは、テストセットのデータも同期的に処理する必要があります(必ず最初にトレーニングセットのロジックに従ってください)。

完全なコードを添付

12件のオリジナル記事を公開 Like9 訪問者20,000以上

おすすめ

転載: blog.csdn.net/sun91019718/article/details/101755562