DataWhale 第17期組隊(duì)學(xué)習(xí)經(jīng)驗(yàn)分享(I)2020-09-14

這是本次大賽第一次經(jīng)驗(yàn)分享:任務(wù)理解部分

任務(wù)介紹

整體學(xué)習(xí)內(nèi)容

本次組隊(duì)學(xué)習(xí)的內(nèi)容為:數(shù)據(jù)挖掘?qū)嵺`(金融風(fēng)控),該內(nèi)容來自 Datawhale與天池聯(lián)合發(fā)起的 零基礎(chǔ)入門數(shù)據(jù)挖掘 - 貸款違約預(yù)測 學(xué)習(xí)賽的第一場。
項(xiàng)目地址為:https://github.com/datawhalechina/team-learning-data-mining/tree/master/FinancialRiskControl

整體賽題要求

  • 比賽要求參賽選手根據(jù)給定的數(shù)據(jù)集,建立模型,預(yù)測金融風(fēng)險(xiǎn)。
  • 賽題以預(yù)測金融風(fēng)險(xiǎn)為任務(wù),數(shù)據(jù)集報(bào)名后可見并可下載,該數(shù)據(jù)來自某信貸平臺(tái)的貸款記錄,總數(shù)據(jù)量超過120w,包含47列變量信息,其中15列為匿名變量。為了保證比賽的公平性,將會(huì)從中抽取80萬條作為訓(xùn)練集,20萬條作為測試集A,20萬條作為測試集B,同時(shí)會(huì)對employmentTitle、purpose、postCode和title等信息進(jìn)行脫敏。
  • 通過這道賽題來引導(dǎo)大家走進(jìn)金融風(fēng)控?cái)?shù)據(jù)競賽的世界,主要針對于于競賽新人進(jìn)行自我練習(xí)、自我提高。

本次學(xué)習(xí)內(nèi)容

  • 理解賽題數(shù)據(jù)和目標(biāo),清楚評分體系。
  • 完成相應(yīng)報(bào)名,下載數(shù)據(jù)和結(jié)果提交打卡(可提交示例結(jié)果),熟悉比賽流程

語言與開發(fā)環(huán)境

  • 語言: Python
  • 開發(fā)環(huán)境: Juputer Notebook
  • 第三方庫
  • Numpy
  • Pandas
  • Scipy
  • Matplotlib
  • csv
  • sklearn
  • os
  • 其他第三方庫

數(shù)據(jù)概況

一般而言,對于數(shù)據(jù)在比賽界面都有對應(yīng)的數(shù)據(jù)概況介紹(匿名特征除外),說明列的性質(zhì)特征。了解列的性質(zhì)會(huì)有助于我們對于數(shù)據(jù)的理解和后續(xù)分析。 Tip:匿名特征,就是未告知數(shù)據(jù)列所屬的性質(zhì)的特征列。

如:本次大賽介紹了train.csv中的數(shù)據(jù)的情況

train.csv

  • id 為貸款清單分配的唯一信用證標(biāo)識(shí)
  • loanAmnt 貸款金額
  • term 貸款期限(year)
  • interestRate 貸款利率
  • installment 分期付款金額
  • grade 貸款等級
  • subGrade 貸款等級之子級
  • employmentTitle 就業(yè)職稱
  • employmentLength 就業(yè)年限(年)
  • homeOwnership 借款人在登記時(shí)提供的房屋所有權(quán)狀況
  • annualIncome 年收入
  • verificationStatus 驗(yàn)證狀態(tài)
  • issueDate 貸款發(fā)放的月份
  • purpose 借款人在貸款申請時(shí)的貸款用途類別
  • postCode 借款人在貸款申請中提供的郵政編碼的前3位數(shù)字
  • regionCode 地區(qū)編碼
  • dti 債務(wù)收入比
  • delinquency_2years 借款人過去2年信用檔案中逾期30天以上的違約事件數(shù)
  • ficoRangeLow 借款人在貸款發(fā)放時(shí)的fico所屬的下限范圍
  • ficoRangeHigh 借款人在貸款發(fā)放時(shí)的fico所屬的上限范圍
  • openAcc 借款人信用檔案中未結(jié)信用額度的數(shù)量
  • pubRec 貶損公共記錄的數(shù)量
  • pubRecBankruptcies 公開記錄清除的數(shù)量
  • revolBal 信貸周轉(zhuǎn)余額合計(jì)
  • revolUtil 循環(huán)額度利用率,或借款人使用的相對于所有可用循環(huán)信貸的信貸金額
  • totalAcc 借款人信用檔案中當(dāng)前的信用額度總數(shù)
  • initialListStatus 貸款的初始列表狀態(tài)
  • applicationType 表明貸款是個(gè)人申請還是與兩個(gè)共同借款人的聯(lián)合申請
  • earliesCreditLine 借款人最早報(bào)告的信用額度開立的月份
  • title 借款人提供的貸款名稱
  • policyCode 公開可用的策略代碼=1新產(chǎn)品不公開可用的策略代碼=2
  • n系列匿名特征 匿名特征n0-n14,為一些貸款人行為計(jì)數(shù)特征的處理

評價(jià)指標(biāo)

競賽采用AUC作為評價(jià)指標(biāo)。AUC(Area Under Curve)被定義為 ROC曲線 下與坐標(biāo)軸圍成的面積。
AUC(Area Under Curve) AUC(Area Under Curve)被定義為 ROC曲線 下與坐標(biāo)軸圍成的面積,顯然這個(gè)面積的數(shù)值不會(huì)大于1。又由于ROC曲線一般都處于y=x這條直線的上方,所以AUC的取值范圍在0.5和1之間。AUC越接近1.0,檢測方法真實(shí)性越高;等于0.5時(shí),則真實(shí)性最低,無應(yīng)用價(jià)值。

附:分類算法系常見評價(jià)指標(biāo)

1、混淆矩陣(Confuse Matrix)

(1)若一個(gè)實(shí)例是正類,并且被預(yù)測為正類,即為真正類TP(True Positive )
(2)若一個(gè)實(shí)例是正類,但是被預(yù)測為負(fù)類,即為假負(fù)類FN(False Negative )
(3)若一個(gè)實(shí)例是負(fù)類,但是被預(yù)測為正類,即為假正類FP(False Positive )
(4)若一個(gè)實(shí)例是負(fù)類,并且被預(yù)測為負(fù)類,即為真負(fù)類TN(True Negative )

2、準(zhǔn)確率(Accuracy) 準(zhǔn)確率是常用的一個(gè)評價(jià)指標(biāo),但是不適合樣本不均衡的情況。 Accuracy = \frac{TP + TN}{TP + TN + FP + FN}

3、精確率(Precision) 又稱查準(zhǔn)率,正確預(yù)測為正樣本(TP)占預(yù)測為正樣本(TP+FP)的百分比。 Precision = \frac{TP}{TP + FP}

4、召回率(Recall) 又稱為查全率,正確預(yù)測為正樣本(TP)占正樣本(TP+FN)的百分比。 Recall = \frac{TP}{TP + FN}

5、F1 Score 精確率和召回率是相互影響的,精確率升高則召回率下降,召回率升高則精確率下降,如果需要兼顧二者,就需要精確率、召回率的結(jié)合F1 Score。 F1-Score = \frac{2}{\frac{1}{Precision} + \frac{1}{Recall}}

6、P-R曲線(Precision-Recall Curve) P-R曲線是描述精確率和召回率變化的曲線


圖片.png

7、ROC(Receiver Operating Characteristic)


圖片.png

ROC空間將假正例率(FPR)定義為 X 軸,真正例率(TPR)定義為 Y 軸。

TPR:在所有實(shí)際為正例的樣本中,被正確地判斷為正例之比率。 TPR = \frac{TP}{TP + FN} FPR:在所有實(shí)際為負(fù)例的樣本中,被錯(cuò)誤地判斷為正例之比率。 FPR = \frac{FP}{FP + TN}

8、AUC(Area Under Curve) AUC(Area Under Curve)被定義為 ROC曲線 下與坐標(biāo)軸圍成的面積,顯然這個(gè)面積的數(shù)值不會(huì)大于1。又由于ROC曲線一般都處于y=x這條直線的上方,所以AUC的取值范圍在0.5和1之間。AUC越接近1.0,檢測方法真實(shí)性越高;等于0.5時(shí),則真實(shí)性最低,無應(yīng)用價(jià)值。

對于金融風(fēng)控預(yù)測類常見的評估指標(biāo)如下:

  • KS(Kolmogorov-Smirnov) KS統(tǒng)計(jì)量由兩位蘇聯(lián)數(shù)學(xué)家A.N. Kolmogorov和N.V. Smirnov提出。在風(fēng)控中,KS常用于評估模型區(qū)分度。區(qū)分度越大,說明模型的風(fēng)險(xiǎn)排序能力(ranking ability)越強(qiáng)。 K-S曲線與ROC曲線類似,不同在于

  • ROC曲線將真正例率和假正例率作為橫縱軸

  • K-S曲線將真正例率和假正例率都作為縱軸,橫軸則由選定的閾值來充當(dāng)。 公式如下: KS=max(TPR-FPR) KS不同代表的不同情況,一般情況KS值越大,模型的區(qū)分能力越強(qiáng),但是也不是越大模型效果就越好,如果KS過大,模型可能存在異常,所以當(dāng)KS值過高可能需要檢查模型是否過擬合。以下為KS值對應(yīng)的模型情況,但此對應(yīng)不是唯一的,只代表大致趨勢。

KS(%) 好壞區(qū)分能力
20以下 不建議采用
20-40 較好
41-50 良好
51-60 很強(qiáng)
61-75 非常好
75以上 過于高,疑似存在問題
  • ROC
  • AUC

代碼和一些觀察

import numpy as np
import pandas as pd
import scipy
import matplotlib.pyplot as plt
import csv

input_path = './'
maxrows = 1000 #試讀數(shù)據(jù)的行數(shù)

這個(gè)代碼塊就比較套路,試讀數(shù)據(jù)1000行是為了在大數(shù)據(jù)處理的時(shí)候搞清楚數(shù)據(jù)的結(jié)構(gòu),如果數(shù)據(jù)量不太大也可以不定義這個(gè)量,一般賦給pd.read_csv()的參數(shù)nrow.

train_data_head = pd.read_csv('train.csv',nrows = maxrows)
test_data_head = pd.read_csv('testA.csv',nrows = maxrows)
sample_data_head = pd.read_csv('sample_submit.csv',nrows = maxrows)

這里數(shù)據(jù)量尚可接受,就直接上全數(shù)據(jù)

train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('testA.csv')
sample_data = pd.read_csv('sample_submit.csv')

個(gè)人習(xí)慣在接下來head,info,describe三部曲初步查看數(shù)據(jù)

 train_data.head()
train_data.info()
train_data.describe()
head.PNG
info.PNG
describe.PNG

可以看出還是有些缺失值需要調(diào)整,部分float64的數(shù)據(jù)可以在內(nèi)存上進(jìn)行優(yōu)化,還能夠注意到中位數(shù),方差,標(biāo)準(zhǔn)差,四分位數(shù)等信息.

附:分類指標(biāo)評價(jià)示例

## 混淆矩陣
import numpy as np
from sklearn.metrics import confusion_matrix
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('混淆矩陣:\n',confusion_matrix(y_true, y_pred))

輸出:
混淆矩陣:
[[1 1]
[1 1]]

## accuracy
from sklearn.metrics import accuracy_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('ACC:',accuracy_score(y_true, y_pred))

輸出:
ACC:0.5

## Precision,Recall,F1-score
from sklearn import metrics
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('Precision',metrics.precision_score(y_true, y_pred))
print('Recall',metrics.recall_score(y_true, y_pred))
print('F1-score:',metrics.f1_score(y_true, y_pred))

輸出:
Precision 0.5
Recall 0.5
F1-score: 0.5

## P-R曲線
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
precision, recall, thresholds = precision_recall_curve(y_true, y_pred)
plt.plot(precision, recall)

輸出:


圖片.png
## ROC曲線 本質(zhì)上是FP-TP曲線
from sklearn.metrics import roc_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
FPR,TPR,thresholds=roc_curve(y_true, y_pred)
plt.title('ROC')
plt.plot(FPR, TPR,'b')
plt.plot([0,1],[0,1],'r--')
plt.ylabel('TPR')
plt.xlabel('FPR')

輸出:


圖片.png
## AUC
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('AUC socre:',roc_auc_score(y_true, y_scores))

輸出:
AUC socre: 0.75

## KS值 在實(shí)際操作時(shí)往往使用ROC曲線配合求出KS值
from sklearn.metrics import roc_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 1, 1]
FPR,TPR,thresholds=roc_curve(y_true, y_pred)
KS=abs(FPR-TPR).max()
print('KS值:',KS)

輸出:
KS值: 0.5238095238095237


Reference:
數(shù)據(jù)挖掘?qū)嵺`(金融風(fēng)控)
零基礎(chǔ)入門數(shù)據(jù)挖掘 - 貸款違約預(yù)測 學(xué)習(xí)
項(xiàng)目地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容