本学习笔记为阿里云天池金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampdocker
采用AUC作为评价指标,AUC(Area Under Curve)被定义为 ROC曲线 下与坐标轴围成的面积。
在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆(也就是一个class被预测成另一个class)。1
混淆矩阵是评判模型结果的指标,属于模型评估的一部分。此外,混淆矩阵多用于判断分类器(Classifier)的优劣,适用于分类型的数据模型,如分类树(Classification Tree)、逻辑回归(Logistic Regression)、线性判别分析(Linear Discriminant Analysis)等方法。2
在分类型模型评判的指标中,常见的方法有如下三种:
1.混淆矩阵(也称误差矩阵,Confusion Matrix)
2.ROC曲线
3.AUC面积
举一个生动形象的例子:假设有一个用来对猫(cats)、狗(dogs)、兔子(rabbits)进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。假设总共有 27 只动物:8只猫, 6条狗, 13只兔子。结果的混淆矩阵如下图:
由图中可知,在这个混淆矩阵中,实际有 8只猫,但是算法实现过程中将其中3只预测成了狗;对于 6条狗,其中有 1条被预测成了兔子,2条被预测成了猫。从混淆矩阵中我们可以看出系统对于区分猫和狗存在一些问题,但是区分兔子和其他动物的效果还是不错的。所有正确的预测结果都在对角线上,所以从混淆矩阵中可以很方便直观的看出哪里有错误,因为他们呈现在对角线外面。
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
y_true:是样本真实分类结果
y_pred 是样本预测分类结果
labels是所给出的类别,通过这个可对类别进行选择
sample_weight 是样本权重
用confusion_matrix生成矩阵数据,然后用seaborn的热度图绘制出混淆矩阵数据:
import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
sns.set()
y_true = ["cat", "dog", "cat", "cat", "dog", "rebit"]
y_pred = ["dog", "dog", "rebit", "cat", "dog", "cat"]
C2= confusion_matrix(y_true, y_pred, labels=["dog", "rebit", "cat"])
sns.heatmap(C2,annot=True)
(1)若一个实例是正类,并且被预测为正类,即为真正类TP(True Positive )
(2)若一个实例是正类,但是被预测为负类,即为假负类FN(False Negative )
(3)若一个实例是负类,但是被预测为正类,即为假正类FP(False Positive )
(4)若一个实例是负类,并且被预测为负类,即为真负类TN(True Negative )
混淆矩阵图示:
解释 | 公式 |
---|---|
准确率是常用的一个评价指标,但是不适合样本不均衡的情况。 |
解释 | 公式 |
---|---|
又称查准率,正确预测为正样本(TP)占预测为正样本(TP+FP)的百分比 |
解释 | 公式 |
---|---|
又称为查全率,正确预测为正样本(TP)占正样本(TP+FN)的百分比 |
解释 | 公式 |
---|---|
F1 Score 精确率和召回率是相互影响的,精确率升高则召回率下降,召回率升高则精确率下降,如果需要兼顾二者,就需要精确率、召回率的结合F1 Score |
P-R曲线是描述精确率和召回率变化的曲线
## 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空间将假正例率(FPR)定义为 X 轴,真正例率(TPR)定义为 Y 轴。
TPR | FPR |
---|---|
在所有实际为正例的样本中,被正确地判断为正例之比率 | 在所有实际为负例的样本中,被错误地判断为正例之比率 |
## ROC曲线
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(Area Under Curve)定义为 ROC曲线 下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。
对于金融风控预测类常见的评估指标如下:
1、KS(Kolmogorov-Smirnov) KS统计量由两位苏联数学家A.N. Kolmogorov和N.V. Smirnov提出。在风控中,KS常用于评估模型区分度。区分度越大,说明模型的风险排序能力(ranking ability)越强。 K-S曲线与ROC曲线类似,不同在于
1.ROC曲线将真正例率和假正例率作为横纵轴
2.K-S曲线将真正例率和假正例率都作为纵轴,横轴则由选定的阈值来充当。 公式如下:
## 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值 在实际操作时往往使用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
1. python语法不熟,需要看着代码来亲自敲才有可能记住
2. 对DSW环境不熟,以往都是集成开发的软件,这次是网站,需要网络保持畅通
遇到上面这种问题一般是正在运行状态,需要保持网络畅通
3. DSW与jupyter Notebook类似,可用相同的快捷键
Enter : 转入编辑模式
Shift-Enter : 运行本单元,选中下个单元
Ctrl-Enter : 运行本单元
Alt-Enter : 运行本单元,在其下插入新单元
Y : 单元转入代码状态
M :单元转入markdown状态
R : 单元转入raw状态
1 : 设定 1 级标题
2 : 设定 2 级标题
3 : 设定 3 级标题
编辑模式 ( Enter 键启动)
Tab : 代码补全或缩进
Shift-Tab : 提示
Ctrl-] : 缩进
Ctrl-[ : 解除缩进
Ctrl-A : 全选
Ctrl-Z : 复原
Ctrl-Shift-Z : 再做
Ctrl-Y : 再做
Ctrl-Home : 跳到单元开头
Ctrl-Up : 跳到单元开头
Ctrl-End : 跳到单元末尾
Ctrl-Down : 跳到单元末尾
4. 数据量大时运行速度慢
可能跟电脑cpu有关,但只要耐心等待一定有你想要看到的结果
5. 运行出现问题时不要急
一、 首先python代码语法的简洁,其次是DSW平台已经做的非常好,相比较与anaconda的jupyte notebook有像pycharm一样的目录的界面,这在管理数据的时候更加方便,并且容易查找数据,和加载数据
其次是运行界面正的有想jupyter一般丝滑,比起pycharm又如此轻便,这也是我对阿里云DSW平台如此赞叹,不得不感叹国内已经有阿里大佬可以做出这样的界面
二、机器学习三要素,算法,算力,数据,在这个金融风控训练赛中我们已经有最后一项了,尽管还需要我们去做数据清洗等等。不过这一步并没有想象中的那么难,最难的前两步的算法和算力,算法需要不断的优化代码,算力是我们现在不需要担心的,因为相较于公司的大数据运行,我们手中的电脑已经足够撑起我们的算力。
三、也让我加深理解了所谓的数据挖掘,一直听说过这个词,但是只有真正去尝试才知道它究竟是什么,并且像我这种刚刚接触的人一开始就是觉得代码太难更换了,东拼西凑的代码老是出错。作为已经有差不多两个月公司数据运营经验的我来说,有点好奇更加高深的金融数据挖掘到底能给我们的生活带来什么,这也是我接下来会去探索的~
混淆矩阵(Confusion Matrix)分析 ↩︎
4.4.2分类模型评判指标(一) - 混淆矩阵(Confusion Matrix) ↩︎
混淆矩阵含义及python代码实现 ↩︎
阿里云天池 金融风控-Task1 ↩︎