在机器学习领域,我们基于某个业务建立模型并完成训练后,若要评判模型的好坏,就需要借助混淆矩阵、ROC 和 AUC 等进行辅助判断。
混淆矩阵也被称作精度矩阵。它是用于表示精度评价的工具。它是一个 N * N 的矩阵。这个矩阵可用来判别分类的好坏。
混淆矩阵中有以下几个概念:
TP(True ): 被判定为正样本,实际也为正样本
FN( ):伪阴性 ,被判定为负样本,实际为正样本
FP( ):伪阳性,被判断为正样本,实际为负样本
TN(True ):被判断为负样本,实际为负样本
另外模型的评判的时候大家会谈到如下几个指标概念:
精确率:它也被称作查准率,指的是实际为正样本且你预测也为正样本的部分,占整体你预测为正样本的比例。
召回率:也叫查全率,指的是实际为正样本且你预测也为正样本的部分占整体实际为正样本的比例。换句话说,就是实际为正样本中你在预测中正确预测为正样本的占比情况。
这些概念较为绕口,建议你多读上几遍,并且多思考几回,慢慢地你就会对其有一个印象。
所以在进行模型评判时,我们需要把握最终看重的结果。例如在流失模型中,流失用户占比一直是小部分。那么,我们要尽可能全面地找到这部分小样本数据,这样就会更看重查全率,即……
利用来定义混淆矩阵如下:
通过导入混淆矩阵
从 sklearn.metrics 中导入混淆矩阵(confusion_matrix)、ROC 曲线(roc_curve)、AUC(auc)、精确率召回率曲线(precision_recall_curve)以及平均精度得分(average_precision_score)。
在 sklearn.model_selection 模块中可以找到 learning_curve 这个东西。
导入 matplotlib 库的绘图模块 plt 。
def confusion_metrix(y,y_p):
Confusion_matrix 是通过 confusion_matrix 函数计算得出的,其中 y 代表真实值,y_p 代表预测值。
plt.matshow(Confusion_matrix)
plt.title("混淆矩阵")
plt.colorbar()
plt.ylabel("实际类型")
plt.xlabel("预测类型")
通过调用的我们就可以得到混淆矩阵,通过画图来画出对应的图形
ROC 是一条曲线,它由 FPR 的点和 TPR 的点连接而成。其中横轴表示 FPR,纵轴表示 TPR。
AUC(面积):ROC 的曲线所覆盖的面积即为 AUC 值。AUC 主要是被用来对二分类问题中机器学习算法的性能或者泛化能力进行衡量。
下面截图ROC曲线
ROC曲线重点了解下这几个节点:
(0,1)点意味着 FPR 为 0 且 TPR 为 1;这是最好的情况,即所有的正样本都能被准确地预测出来,同时没有负样本被错误地判定为正样本。
(1,0)点意味着 FPR 等于 1 且 TPR 等于 0;这是最坏的情况,意味着所有的正样本都被错误地认定为负样本。
(0,0)点意味着 FPR 为 0 且 TPR 为 0;分类器把所有的样本都判定为负样本。
点(1,1)意味着 FPR 为 1 且 TPR 为 1;分类器把所有的样本都判定为正样本。
如上图所示,存在一条红色虚线为 y = x 。这条曲线的面积是 0.5 。这意味着若进行随机猜测,AUC = 0.5 。倘若我们所得到的 ROC 曲线处于 y = x 之下,那么 AUC
在实际中,因为侧重的点不一样,所以我们得明白侧重的地方在哪里。如果在实际中结果重点在于覆盖,那我们就应该更注重 True 高;如果重点在于准确,那我们就应该更注重低。
那么如何通过 ROC 曲线来判断 True 和其他情况呢?在此我们会发现,如果曲线越往左上凸,就越好,如此一来,所得到的 True 就会越高,而对应的其他情况就会越低。
这张图来源于我所做的逻辑回归分类,最终所得的模型其 AUC 为 0.99。
PR 曲线是由精确率和召回率的点连接而成的线,其中横轴表示某一数值,纵轴表示另一数值。
在PR曲线中越右上凸越好,PR想要 和同时高
当样本表现极不均衡时,哪个曲线更好呢?依据 ROC 曲线和 PR 曲线的含义,我们预先假设正样本极少,负样本极多,如此一来 TN 会很大,能将 FPR 拉低,最终的曲线会表现得很好。然而,我们再反过来观察 PR 曲线,就会发现曲线反而表现得没那么好了。所以,我们在进行判断时不能仅由单一指标来作决定。
实现代码如下:
绘制 PR 曲线的函数为 plot_PR,该函数接收模型、测试集输入 x_test 和测试集标签 y_test 作为参数。
模型对 x_test 进行预测,得到的预测概率结果为 y_pro。
precision 是通过 precision_recall_curve 函数计算得出的,该函数的参数为 y_test 和 y_pro[:,1];recall 也是通过 precision_recall_curve 函数计算得出的,同样参数为 y_test 和 y_pro[:,1];thresholds 同样是通过 precision_recall_curve 函数计算得出的,参数依然是 y_test 和 y_pro[:,1]。
average_precision 等于 average_precision_score 函数,该函数的第一个参数是 y_test,第二个参数是 y_pro 的第二列
ax2 = plt.subplot(224)
ax2 为图表设置标题,标题内容为"Precision_Recall Curve AP=%0.2f",其中的平均精度值为 average_precision,标题的垂直对齐方式为'center'
plt 以“post”为条件进行步长操作,精度为 precision,召回率为 recall,透明度 alpha 为 0.2,颜色为红色。
plt 以“post”为步长填充 recall 和 precision 之间的区域,透明度为 0.2,颜色为“b”
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt 为 y 轴添加标签为“Precision”。
plt.xlabel('Recall')
通过这些数据来绘制 ROC 曲线和计算 AUC 值。
y_pro=model.predict_proba(x_test)
假阳性率、召回率、阈值等于接收者操作特征曲线(roc_curve)的输出,其中 y_test 为真实标签,y_pro[:,1] 为预测概率的某一列,通过该曲线计算得出假阳性率、召回率和阈值。
roc_auc 等于 auc(假阳性率,召回率)
ax3=plt.subplot(223)
ax3 给图形设置标题为“Receiver Operating Characteristic”,并且垂直对齐方式为“center”。
使用 plt.legend 函数,并将其位置设置为右下角。
第三个参数 'r--' 表示红色虚线样式
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.0])
plt.ylabel('Recall')
plt 给 x 轴添加了标签,这个标签是 'false_positive_rate' 。
学习曲线主要用于提高学习算法的性能。它通过对学习过程进行判断,进而调整学习参数,以判断模型是否过拟合。
我们通过绘制可以发现效果如下:
对应实现代码如下:
绘制学习曲线以判断模型的学习情况。使用该函数需传入模型、自变量 x、因变量 y、训练样本大小 train_sizes 以及并行任务数 n_jobs 。
构建学习曲线评估器,其中 train_size 能够控制用于生成学习曲线的样本的数量,这个数量可以是绝对的,也可以是相对的。
cv 等于 10 ,这是 ShuffleSplit(4,n_iter=3,test_size=0.2,random_state=0) 。
首先获取训练集大小 train_sizes,接着获取训练集得分 train_scores,然后获取测试集得分 test_scores,这些结果是通过学习曲线函数 learning_curve 计算得出的,其中估计器为 model,输入特征为 x,目标变量为 y,训练集大小为 train_sizes,交叉验证次数为 cv,并行任务数为 n_jobs。
#统计结果
计算训练集得分的平均值,其计算方式是对训练集得分在轴 1 上进行均值计算,得到的结果赋值给 train_score_mean
训练分数的标准差是通过计算训练分数在轴为 1 上的标准差得到的,即 train_score_std 等于 np.std(train_scores,axis=1) 。
计算测试分数的平均值,是通过对测试分数在轴为 1 的方向上进行求和,然后再除以测试分数的数量得到的,即 test_score_mean 等于 np.mean(test_scores,axis=1) 。
计算测试分数的标准差,其中轴为 1 。通过 np.std(test_scores,axis=1) 得到测试分数的标准差。测试分数的标准差是通过对测试分数进行特定计算得出的,该计算的轴为 1 。np.std(test_scores,axis=1) 这个操作用于获取测试分数在轴为 1 方向上的标准差。
#绘制效果图
ax1=plt.subplot(211)
ax1 为其设置了标题为“learning curve”
plt 用 train_sizes 来填充区域,这个区域在 train_score_mean - train_score_std 与 train_score_mean + train_score_std 之间,透明度为 0.1,颜色为红色。
plt 用 alpha 为 0.15 以及颜色为'green'来填充 train_sizes 与 test_score_mean + test_score_std 以及 test_score_mean - test_score_std 之间的区域
plt.plot 函数绘制了 train_sizes 与 train_score_mean 的关系图,线条颜色为蓝色,标记形状为圆形(marker='o'),标记大小为 5,并且添加了标签为'training score'
plt 用 'o-' 样式绘制 train_sizes 和 test_score_mean 的关系图,颜色为 'g',并标注为 'Cross_validation score'
plt.grid()
plt 为 x 轴添加标签为“training samples”。
plt 用于设置纵坐标的标签为 'Accuracy' 。
plt.legend(loc='lower right')
plt.ylim([0.2,1.01])
最后作图如下:
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态