机器学习测试笔记(27)——模型评估和优化(下)

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 机器学习测试笔记(27)——模型评估和优化(下)

4.3 ROC 曲线(Receiver Operating Characteristic curve)

ROC曲线为接受者操作特性曲线是指在特定刺激条件下,以被试在不同判断标准下所得的假阳率为横坐标,真阳率为纵坐标,画得的各点的连线。

image.png

AUCArea Underthe Curve)为ROC下面的面积。


4.4 P-R(Recall-Precision)曲线

横坐标为,纵坐标为召回率,纵坐标为精确度。

image.png


如何选择ROCP-R曲线

  •  在很多实际问题中,正负样本数量往往很不均衡。比如,计算广告领域经常涉及转化率模型,正样本的数量往往是负样本数量的1/1000,甚至1/10000。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。
  •  但需要注意的是,选择P-R曲线还是ROC曲线是因实际问题而异的,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。
  •  PR曲线比ROC曲线更加关注正样本,而ROC则兼顾了两者。
  •  AUC越大,反映出正样本的预测结果更加靠前(推荐的样本更能符合用户的喜好)。
  •  当正负样本比例失调时,比如正样本1个,负样本100个,则ROC曲线变化不大,此时用PR曲线更加能反映出分类器性能的好坏。这个时候指的是两个分类器,因为只有一个正样本,所以在画auc的时候变化可能不太大;但是在画PR曲线的时候,因为要召回这一个正样本,看哪个分类器同时召回了更少的负样本,差的分类器就会召回更多的负样本,这样precision必然大幅下降,这样分类器性能对比就出来了。


4.5 Kappa系数

K=(P0-Pe)/(1-Pe)

P0是每一类正确分类的样本数量之和除以总样本数,也就是总体分类精度

假设每一类的真实样本个数分别为a1,a2,...,aC,而预测出来的每一类的样本个数分别为b1,b2,...,bC,总样本个数为n,则有Pe=( a1×b1+a2×b2+…+aC×bC)/(n×n)

4.6实际案例

让我们来看一个例子,比如有如下混淆矩阵:


判断

A

B

C

实际

A

239

21

16

B

16

73

4

C

6

9

280


  •  所有案例数:239+21+16+16+73+4+6+9+28=664
  •  判断为A的案例数:239+16+6=261
  •  判断为B的案例数:21+73+9=103
  •  判断为C的案例数:16+4+280=300
  •  A的案例数:239+21+16=276
  •  B的案例数:16+73+4=93
  •  C的案例数:6+9+280=295


这样:

  •  P0=(239+73+280)/664=0.8916
  •  Pe=(261×276+103×93+300×295)/(64×64)=0.3883
  •  K=(0.8916-0.3883)/(1-0.3883)=0.8228


通过K的值,可以判定模型的好坏:

  •  0.0~0.20:极低的一致性(slight)
  •  0.21~0.40:一般的一致性(fair)
  •  0.41~0.60:中等的一致性(moderate)
  •  0.61~0.80:高度的一致性(substantial)
  •  0.81~1:几乎完全一致(almostperfect)


4.7程序的实现

前面讲课那么多指标,其实在Python里面可以利用sklearn这个插件快速的画出这些指标和算法。利用这个工具之前当然需要下载安装这个插件。

>pip3 install sklearn


下面来讲解一下这个代码。

# coding=UTF-8
from sklearn import metrics
from sklearn.metrics import  confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import  precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
import matplotlib.pylab as plt
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn.metrics import  precision_recall_curve
#真实值
GTlist =   [1,1,0,1,1,0,1,0,0,1]
#模型预测值
Problist = [1,0,1,1,1,1,1,1,0,1]
y_true = np.array(GTlist)
y_pred = np.array(Problist)
#混淆矩阵
confusion_matrix =  confusion_matrix(y_true, y_pred)
print("混淆矩阵:")
print(confusion_matrix)
#准确性
accuracy =  '{:.1%}'.format(accuracy_score(y_true, y_pred))
print("准确性:",end='')
print(accuracy)
#精确性
precision =  '{:.1%}'.format(precision_score(y_true, y_pred))
print("精确性:",end='')
print(precision)
#召回率
recall = '{:.1%}'.format(recall_score(y_true,  y_pred))
print("召回率:",end='')
print(recall)
#F1值
f1score = '{:.1%}'.format(f1_score(y_true,  y_pred))
print("F1值:",end='')
print(f1score)
#初始化画图数据
#真实值
GTlist = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0,  0.0, 1.0, 0.0, 1.0,0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]
#模型预测值
Problist = [0.99, 0.98, 0.97, 0.93, 0.85,  0.80, 0.79, 0.75, 0.70, 0.65,0.64, 0.63, 0.55, 0.54, 0.51, 0.49, 0.30, 0.2,  0.1, 0.09]
fpr, tpr, thresholds = metrics.roc_curve(GTlist, Problist,  pos_label=1)
roc_auc = metrics.auc(fpr, tpr)  #auc为Roc曲线下的面积
print("AUC值:",end='')
print('{:.1%}'.format(roc_auc))
#ROC曲线
plt.plot(fpr, tpr, 'b',label='AUC =  %0.2f'% roc_auc)
plt.legend(loc='lower right')
# plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([-0.1, 1.1])
plt.ylim([-0.1, 1.1])
plt.xlabel('False Positive Rate') #横坐标是fpr
plt.ylabel('True Positive Rate')  #纵坐标是tpr
plt.title('Receiver operating  characteristic example')
plt.show()
#P-R曲线
plt.figure("P-R Curve")
plt.title('Precision/Recall Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
#y_true为样本实际的类别,y_scores为样本为正例的概率
y_true = np.array(GTlist)
y_scores = np.array(Problist)
precision, recall, thresholds =  precision_recall_curve(y_true, y_scores)
plt.plot(recall,precision)
plt.show()


真实值GTlist =[1,1,0,1,1,0,1,0,0,1]


模型预测值Problist= [1,0,1,1,1,1,1,1,0,1]

现在有10位病人来看病,其中3号、6号、8号和9号病人是没有疾病的(绿色),其他剩余6位有疾病(红色)。


编号

1

2

3

4

5

6

7

8

9

10

实际

1

1

0

1

1

0

1

0

0

1

检查

1

0

1

1

1

1

1

1

0

1


1号、4号、5号、7号和10号病人被查出来(真阳性,红色);2号病人没有被查出来(漏诊,橙色);3号、6号和8号被误诊(误诊,蓝色),另外9号(真隐性,绿色),通过运行这段代码,得到如下结果:

混淆矩阵:

[[1 3]

[1 5]]

准确性:60.0%

精确性:62.5%

召回率:83.3%

F1:71.4%

我们来验证一下,真阳性:5、真阴性:1、假阳性:3、假阴性:1,所以混淆矩阵为:



预测

实际

1

3

1

5


由此,可以看出算出来的矩阵与正式的矩阵的对应关系。假在前,真在后,一行代表实际中的实际中的一行。

准确性:(1+5/10=60%

精确性:5/8=62.5%

召回率:5/6=83.3%

F1 Score=62.5%×83.3%×2/62.5%+83.3%=1.04125/1.458=71%

可见这些值都是正确的。接下来再看下面的数据。

#真实值

GTlist = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0,1.0, 0.0, 1.0,0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]

#模型预测值

Problist = [0.99, 0.98, 0.97, 0.93, 0.85,0.80, 0.79, 0.75, 0.70, 0.65,0.64, 0.63, 0.55, 0.54, 0.51, 0.49, 0.30, 0.2,0.1, 0.09]

GTlist表示真实样本,1.0代表真样本,0.0代表假样本;

Problist表示预测样本,每个值表示预测到对应真实样本为真的概率。比如第一个0.99表示预测第一个正样本的概率为99%,第三个0.97表示预测第三个假样本的概率为97%。通过运行我们得到如下曲线图。


image.png


我们考察A(0,0)B(1,1)C(0,1)D(1,0)四个点:

  •   A(0,0):表示真阳率与假阳率均为0,表示什么都没有测试到;
  •   B(1,1):表示真阳率与假阳率均为100%
  •   C(0,1):真阳率为100%,假阳率均为0,测试到的全是真的;
  •   D(1,0):真阳率为0,假阳率均为100%,测试到的全是假的。


由此可见C点的情况最高,所以曲线越靠近左上角说明算法最好。

 

另外,上面代码也会给出了化P-R图的方法,对于ROC曲线,采用同一个测试数据,画出来的图如下显示。

image.png


4.8 最终分析

from sklearn.neighbors import KNeighborsClassifier  
def my_score():
       X,y =datasets.load_wine().data,datasets.load_wine().target
       X_train, X_test,y_train, y_test = train_test_split(X, y, random_state=68)
       knn =KNeighborsClassifier()
       knn.fit(X_train,y_train)
       print("训练集得分:\n{:.2%}".format(knn.score(X_train,y_train)))
       print("测试集得分:\n{:.2%}".format(knn.score(X_test,y_test)))
       y_true = y_test
       y_pred =knn.predict(X_test)
#混淆矩阵
       print("混淆矩阵:\n",confusion_matrix(y_true,y_pred))
#准确性
       accuracy ='{:.1%}'.format(accuracy_score(y_true, y_pred))
       print("准确性:",accuracy)
#精确性
       precision ='{:.1%}'.format(precision_score(y_true, y_pred, average='micro'))
       print("精确性:",precision)
#召回率
       recall ='{:.1%}'.format(recall_score(y_true, y_pred, average='micro'))
       print("召回率:",recall)
#F1值
       f1score ='{:.1%}'.format(f1_score(y_true, y_pred, average='micro'))
       print("F1值:",f1score)
       X,y =make_blobs(n_samples=200,centers=2, random_state=1,cluster_std=5)
       X_train, X_test,y_train, y_test = train_test_split(X, y, random_state=68)
       gnb = GaussianNB()
       gnb.fit(X_train,y_train)
       predict_proba =gnb.predict_proba(X_test)
       mylist = [None] *int(predict_proba.shape[0])
       i = 0
for my_predict_proba inpredict_proba:
              sign = int(y[i])
              mylist[i] =my_predict_proba[sign]
        i = i+1
       GTlist = y_test
       Problist = mylist
       fpr, tpr, thresholds =roc_curve(GTlist, Problist, pos_label=1)
       roc_auc =metrics.auc(fpr, tpr)  #auc为Roc曲线下的面积
       print("AUC值:",end='')
       print('{:.1%}'.format(roc_auc))
       plt.rcParams['font.sans-serif']=['SimHei']
       plt.rcParams['axes.unicode_minus']=False
#ROC曲线
       plt.plot(fpr, tpr,'b',label='AUC = %0.2f'% roc_auc)
       plt.legend(loc='lowerright')
# plt.plot([0, 1], [0,1], 'r--')
       plt.xlim([-0.1, 1.1])
       plt.ylim([-0.1, 1.1])
       plt.xlabel(u'假阳性率') #横坐标是fpr
       plt.ylabel(u'真阳性率')  #纵坐标是tpr
plt.title(u'接收器工作特性示例')
       plt.show()
#P-R曲线 
       plt.figure(u"P-R 曲线")
       plt.title(u'精度/召回曲线')
       plt.xlabel(u'召回')
       plt.ylabel(u'精度')
#y_true为样本实际的类别,y_scores为样本为正例的概率
       y_true =np.array(GTlist)
       y_scores =np.array(Problist)
       precision, recall,thresholds = precision_recall_curve(y_true, y_scores)
       plt.plot(recall,precision)
       plt.show()


输出

训练集得分:
76.69%
测试集得分:
80.00%
混淆矩阵:
[[17  0   0]
[ 2  12  3]
[ 3 1   7]]
准确性: 80.0%
精确性: 80.0%
召回率: 80.0%
F1值: 80.0%
AUC值:57.8%

image.png

image.png


—————————————————————————————————


软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps 和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之Jenkins

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

Selenium自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
18天前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型的五大技巧
【4月更文挑战第7天】 在数据科学迅猛发展的今天,机器学习已成为解决复杂问题的重要工具。然而,构建一个既精确又高效的机器学习模型并非易事。本文将分享五种提升机器学习模型性能的有效技巧,包括数据预处理、特征工程、模型选择、超参数调优以及交叉验证。这些方法不仅能帮助初学者快速提高模型准确度,也为经验丰富的数据科学家提供了进一步提升模型性能的思路。
|
24天前
|
安全 Linux 测试技术
提升龙蜥内核测试能力!探究持续性模糊测试优化实践
清华大学软件学院对Anolis OS使用靶向模糊测试方法将测试工作引向修改的代码,进而提高对业务代码的测试能力。
|
22天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型的最佳实践
【4月更文挑战第3天】在数据驱动的时代,构建高效的机器学习模型已成为解决复杂问题的关键。本文将探讨一系列实用的技术策略,旨在提高模型的性能和泛化能力。我们将从数据预处理、特征工程、模型选择、超参数调优到集成学习等方面进行详细讨论,并通过实例分析展示如何在实践中应用这些策略。
17 1
|
2天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
28 12
|
2天前
|
人工智能 监控 数据处理
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
12 0
|
2天前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型的最佳实践
【4月更文挑战第23天】在数据驱动的时代,机器学习已成为创新的核心动力。本文深入探讨了构建高效机器学习模型的关键步骤,包括数据预处理、特征工程、模型选择、训练技巧以及性能评估。通过实例分析与经验总结,旨在为从业者提供一套实用的技术指南,帮助他们在复杂数据环境中提升模型的准确性和泛化能力。
|
8天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
30 7
|
8天前
R语言估计多元标记的潜过程混合效应模型(lcmm)分析心理测试的认知过程
R语言估计多元标记的潜过程混合效应模型(lcmm)分析心理测试的认知过程
30 0
|
8天前
|
机器学习/深度学习 算法 数据处理
构建自定义机器学习模型:Scikit-learn的高级应用
【4月更文挑战第17天】本文探讨了如何利用Scikit-learn构建自定义机器学习模型,包括创建自定义估计器、使用管道集成数据处理和模型、深化特征工程以及调优与评估模型。通过继承`BaseEstimator`和相关Mixin类,用户可实现自定义算法。管道允许串联多个步骤,而特征工程涉及多项式特征和自定义变换。模型调优可借助交叉验证和参数搜索工具。掌握这些高级技巧能提升机器学习项目的效果和效率。
|
9天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从特征工程到模型调优
【4月更文挑战第16天】 在数据驱动的时代,机器学习已成为解决复杂问题的关键工具。本文旨在分享一套实用的技术流程,帮助读者构建高效的机器学习模型。我们将重点讨论特征工程的重要性、选择合适算法的策略,以及通过交叉验证和网格搜索进行模型调优的方法。文章的目标是为初学者提供一个清晰的指南,同时为有经验的实践者提供一些高级技巧。

相关产品

  • 人工智能平台 PAI