這是本次大賽第一次經(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),但是不適合樣本不均衡的情況。
3、精確率(Precision) 又稱查準(zhǔn)率,正確預(yù)測為正樣本(TP)占預(yù)測為正樣本(TP+FP)的百分比。
4、召回率(Recall) 又稱為查全率,正確預(yù)測為正樣本(TP)占正樣本(TP+FN)的百分比。
5、F1 Score 精確率和召回率是相互影響的,精確率升高則召回率下降,召回率升高則精確率下降,如果需要兼顧二者,就需要精確率、召回率的結(jié)合F1 Score。
6、P-R曲線(Precision-Recall Curve) P-R曲線是描述精確率和召回率變化的曲線

7、ROC(Receiver Operating Characteristic)

ROC空間將假正例率(FPR)定義為 X 軸,真正例率(TPR)定義為 Y 軸。
TPR:在所有實(shí)際為正例的樣本中,被正確地判斷為正例之比率。 FPR:在所有實(shí)際為負(fù)例的樣本中,被錯(cuò)誤地判斷為正例之比率。
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不同代表的不同情況,一般情況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()
可以看出還是有些缺失值需要調(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)
輸出:
## 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')
輸出:
## 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)目地址