一. ROC和AUC
ROC(受试者工作特征曲线)
AUC(ROC曲线下的面积)
在诸如逻辑回归或者神经网络的分类器中,模型给出的结果并不是直接的分类结果,而是对样本属于某类的概率。此时可以选择某一个概率阈值,当预测概率超过此阈值时,认为样本属于欺诈,否则属于正常样本,进而形成混淆矩阵。由于阈值有很多种可能,于是我们有很多个混淆矩阵。如何综合判断多个混淆矩阵的结果呢?
ROC曲线(Receiver operating characteristic curve)是多个混淆矩阵的结果组合,如果在上述模型中我们没有定好阈值,而是将模型预测概率从高到低排序,将每个概率值依次作为阈值,那么就有多个混淆矩阵。
对于每个混淆矩阵,我们计算两个指标
TPR(True positive rate)= TPR=TP/(TP+FN)=Recall
FPR(False positive rate)=FP/(FP+TN)
TPR就是召回率,FPR即为实际为正常样本中,预测为欺诈占比。我们以FPR为x轴,TPR为y轴画图,就得到了ROC曲线。
image.pngAUC(Area Under Curve)的值为ROC曲线下面的面积,若如上所述模型十分准确,则AUC为1。但现实工作中不会有如此完美的模型,一般AUC均在0.5到1之间,AUC越高,模型的区分能力越好,上图AUC为0.81。若AUC=0.5,即与上图中红线重合,表示模型的区分能力与随机猜测没有差别。若AUC真的小于0.5,表明模型很差。
KS(Kolmogorov-Smirnov)值:KS=max(TPR-FPR),即为TPR与FPR的差的最大值,KS可以反映模型的最优区分效果。KS也是评分卡模型的常用度量指标。
特别地,反欺诈领域的欺诈预测模型,由于模型结果会对识别的坏人进行一定的处置措施,FPR过高会对好人有一定干扰,造成误杀,影响客户体验,因此模型需保证在低于一定FPR的基础上尽量增加TPR。
二. 读取数据
2.1 导入基本模块
# 导入基本处理模块
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import os
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import seaborn as sns
2.2 显示可用列表
# 显示可用列表
print(os.listdir("E:/home_credit_default_risk"))
image.png
2.3 训练dataframe
# 导入基本处理模块
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import os
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import seaborn as sns
# 显示可用列表
# print(os.listdir("E:/home_credit_default_risk"))
# 训练dataframe
app_train = pd.read_csv('E:/home_credit_default_risk/application_train.csv')
print('Training data shape: ', app_train.shape)
print(app_train.head())
image.png
训练数据有307511个观察数据(每一个单独的贷款)和122个特征(变量),包括目标(我们想预测的标签)
2.4 测试dafaframe特征
# 导入基本处理模块
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import os
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import seaborn as sns
# 显示可用列表
# print(os.listdir("E:/home_credit_default_risk"))
# 训练dataframe
#app_train = pd.read_csv('E:/home_credit_default_risk/application_train.csv')
#print('Training data shape: ', app_train.shape)
#print(app_train.head())
# 测试dafaframe特征
app_test = pd.read_csv('E:/home_credit_default_risk//application_test.csv')
print('Testing data shape: ', app_test.shape)
print(app_test.head())
image.png
由此可见测试集比训练集小很多,而且缺少目标列
网友评论