手寫Psi模型穩定性

2021-09-26 15:09:21 字數 3777 閱讀 6650

psi為群體穩定性指標(p

opulation stability index)。

計算公式為:p

si = sum((實際佔比-預期佔比)* ln(實際佔比/預期佔比)) ​

​    ​在金融行業的評分卡製作中,我們通常使用psi來判斷乙個模型穩定是否穩定(

一般認為psi小於0.1時候模型穩定性很高,0.1-0.2穩定性較一般,需要進一步觀察,大於0.25模型穩定性差,建議重新建模。

),並使用scorecardpy包

()來進行woe,iv,psi等數值的計算,但scorecardpy包對psi的計算輸入引數必須為模型**概率所轉化的分數,在其他行業適用性較差,所以自己閒來無事,手寫了乙個計算psi的函式,希望對大家有所幫助。

注:下面**中分箱方式為對概率等分為10.份,在具體業務場景中需要大家根據自身業務情況修改分箱方式​。

def psi(train_x,test_x,model):

psi_train_list = model.predict_proba(train_x)

psi_test_list = model.predict_proba(test_x)

psi_train_df = pd.dataframe(columns=['proba','level'])

psi_test_df = pd.dataframe(columns=['proba','level'])

for i in range(len(psi_train_list)):

pb = psi_train_list[i][0]

psi_train_df.loc[i,'proba'] = pb

if pb <= 0.1:

psi_train_df.loc[i,'level'] = 1

elif (pb>0.1) & (pb <= 0.2):

psi_train_df.loc[i,'level'] = 2

elif (pb>0.2) & (pb <= 0.3):

psi_train_df.loc[i,'level'] = 3

elif (pb>0.3) & ( pb <= 0.4):

psi_train_df.loc[i,'level'] = 4

elif (pb>0.4) & ( pb <= 0.5):

psi_train_df.loc[i,'level'] = 5

elif (pb>0.5) & ( pb <= 0.6):

psi_train_df.loc[i,'level'] = 6

elif (pb>0.6) & ( pb <= 0.7):

psi_train_df.loc[i,'level'] = 7

elif (pb>0.7) & ( pb <= 0.8):

psi_train_df.loc[i,'level'] = 8

elif (pb>0.8) & ( pb <= 0.9):

psi_train_df.loc[i,'level'] = 9

elif (pb>0.9) & ( pb <= 1):

psi_train_df.loc[i,'level'] = 10

for i in range(len(psi_test_list)):

pb = psi_test_list[i][0]

psi_test_df.loc[i,'proba'] = pb

if pb <= 0.1:

psi_test_df.loc[i,'level'] = 1

elif (pb>0.1) & (pb <= 0.2):

psi_test_df.loc[i,'level'] = 2

elif (pb>0.2) & (pb <= 0.3):

psi_test_df.loc[i,'level'] = 3

elif (pb>0.3) & ( pb <= 0.4):

psi_test_df.loc[i,'level'] = 4

elif (pb>0.4) & ( pb <= 0.5):

psi_test_df.loc[i,'level'] = 5

elif (pb>0.5) & ( pb <= 0.6):

psi_test_df.loc[i,'level'] = 6

elif (pb>0.6) & ( pb <= 0.7):

psi_test_df.loc[i,'level'] = 7

elif (pb>0.7) & ( pb <= 0.8):

psi_test_df.loc[i,'level'] = 8

elif (pb>0.8) & ( pb <= 0.9):

psi_test_df.loc[i,'level'] = 9

elif (pb>0.9) & ( pb <= 1):

psi_test_df.loc[i,'level'] = 10

train_d = pd.dataframe(psi_train_df.level.value_counts())

test_d = pd.dataframe(psi_test_df.level.value_counts())

train_d['sort'] = train_d.index

test_d['sort'] = test_d.index

train_d = train_d.sort_values(by='sort',ascending= true)

test_d = test_d.sort_values(by='sort',ascending= true)

train_d_t = pd.dataframe(columns=['level','box'])

test_d_t = pd.dataframe(columns=['level','box'])

for i in range(1,11):

train_d_t.loc[i,'box'] = i

for z in range(1,11):

test_d_t.loc[z,'box'] = z

train_d_t.level = 0

test_d_t.level = 0

for i in train_d_t.box.values:

train_d_t.level[train_d_t.box == i] = train_d.level[train_d.sort ==i]

train_d_t = train_d_t.fillna(0)

for i in test_d_t.box.values:

test_d_t.level[test_d_t.box == i] = test_d.level[test_d.sort ==i]

test_d_t = test_d_t.fillna(0)

psi_score = 0

for i in train_d.sort:

k_1 = int(train_d_t.level[train_d_t.box == i].values)/(sum(train_d_t.level.values))

k_2 = int(test_d_t.level[test_d_t.box == i].values)/(sum(test_d_t.level.values))

if (k_1 == 0) | (k_2 == 0):

psi_score = psi_score + 0

else:

psi_s = (k_1 - k_2)*np.log(k_1/k_2)

psi_score = psi_score + psi_s

return psi_score

模型穩定性指標 PSI

由於模型是以特定時期的樣本所開發的,此模型是否適用於開發樣本之外的族群,必須經過穩定性測試才能得知。穩定度指標 population stability index psi 可衡量測試樣本及模型開發樣本評分的的分布差異,為最常見的模型穩定度評估指標。其實psi表示的就是按分數分檔後,針對不同樣本,或...

風控模型穩定性指標PSI

群體穩定性指標 是衡量樣本變化所產生的偏移量的一種重要指標,通常用來衡量樣本的穩定程度,比如樣本在兩個月份之間的變化是否穩定。也可以用來衡量模型穩定度。通常用作模型效果監測。由於模型是以特定時期的樣本所開發的,此模型是否適用於開發樣本之外的樣本,可以用穩定性測試。psi可以衡量測試樣本及模型開發樣本...

mysql穩定性 MySQL的穩定性

isam表處理器 穩定 它管理所有在mysql 3.22和早期版本中的資料的儲存和檢索。在所有mysql版本中,中已經沒有乙個單獨 報告的 錯誤。得到乙個損壞的資料庫表的唯一已知方法是在乙個更新中途殺死伺服器,即使這樣也不大可能破壞任何資料而不能挽救,因為所有資料在每個查詢之間被倒入 flush 到...