机器学习 jupyter Python 常用模型评估指标

tech2024-10-23  28

1 精度

Accuracy(精度、准确率)和Error Rate(错误率)是分类模型中最常见的两种性能度量指标,既适用于二分类任务,也适用于多分类任务。 对于分类模型f和大小为n的测试集D,Accuracy(精度)的定义为: Accuracy = 分对的样本点个数/总的测试的样本个数

2 混淆矩阵

TP为真正(例),FN为假负(例), FP为假正(例),TN为真负(例) 其中T表示的是True,F代表的是False P代表正的,N代表负的。

精度accuracy = (TP+TN)/(TP+TN+FP+FN) 精确率precision = TP/(TP+FP) 召回率recall = TP/(TP+FN)

2.1 精确率

精确率表示被预测为正例的样本中有多少是真正的样本。

2.2 召回率

召回率表示所有正类的样本中有多少是被准确预测为正类。

2.3 如何理解精确率和召回率?

现在有四个样本点,实际上的标签为[1,0,0,1],分类的标签为[0,0,0,1] 则每个类别的召回率、精确率和对应的混淆矩阵。

精度:2+1/2+0+1+1=3/4 j精确率:2/2+1=2/3 召回率:2/2+0=1

3 F1分值

通常,查准率与查全率之间是反比关系。所以要想得到好的模型,我们需要另外一个指标( F1-score )。 F1分值是精确率和召回率的调和值(它是精确率和召回率的调和平均数),更接近于两个数较小的那个,所以精确率和召回率接近时,F1分值最大。很多推荐系统的评测指标就是用F值的。

有时候公式写为如下的形式: 注:调和平均数(倒数平均数),𝑥_1,𝑥_2………𝑥_𝑛 的调和平均数为:

3.3 如何了解查准率和查全率?

脑外科手术提供了一个很鲜明的例子。外科医生需要移除所有的肿瘤细胞,因为任何剩余的癌细胞都会再生肿瘤(召回率)。但是,外科医生必须不移除健康的脑细胞,因为这会使病人的脑功能受损(准确率)。 决策1:外科医生有可能会更自由更大胆地在大脑区域中移除癌细胞。这一决定增加查全率,但降低了查准率。 决策2:另一方面,外科医生可能会在大脑中更保守地移除癌细胞。这一决定提高了查准率,但减少了查全率。

4 sklearn模块中classification_report 介绍

sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息。 主要参数: y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。 y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计 labels:array, shape = [n_labels],报表中包含的标签索引的可选列表。 target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。 强调: y_true和y_pred位置千万不要对调;

5 例子

#关于精确率和召回率举例 from sklearn.metrics import classification_report,confusion_matrix#metrics #classification_report(y_true,y_pred) print(classification_report([1,0,0,1],[0,0,0,1])) print(confusion_matrix([1,0,0,1],[0,0,0,1])) #0类别的精确率:2/3=TP/(TP+FP) #0类别的召回率:2/2 #1类别的精确率:1/1 #1类别的召回率:1/2 =0.5

运行结果: recall是召回率,precision是精确率。

混淆矩阵可视化

def cm_plot(y,yp): #导入混淆矩阵 from sklearn.metrics import confusion_matrix #输出混淆矩阵 cm = confusion_matrix(y,yp) print(cm) print(len(cm)) #导入画图工具 import matplotlib.pyplot as plt #画图 # plt.matshow(cm) plt.matshow(cm,cmap=plt.cm.Greens) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',verticalalignment='center') plt.ylabel('True label')# 坐标轴标签 plt.xlabel('Predicted label')# 坐标轴标签 y = [1,0,0,1] yp = [0,0,0,1] cm_plot(y,yp)

运行结果:

6 具体案例 鸢尾花

6.1 导入模块和相关包

import numpy as np from sklearn import datasets#训练集 from sklearn.model_selection import train_test_split#划分测试集,训练集 # from sklearn.metrics import classification_report,confusion_matrix #性能指标(Metrics)是衡量一个模型好坏的关键 #sklearn中的classification_report函数用于显示主要分类指标的文本报告 from sklearn.naive_bayes import MultinomialNB,BernoulliNB,GaussianNB #高斯模型主要用于处理连续性数据;前两种模型主要用于处理离散型数据 from sklearn.metrics import accuracy_score

6.2 载入数据集

#载入数据集 iris = datasets.load_iris() print(type(iris)) # print('特征值:',iris.data)

6.3 划分测试集,训练集,建立模型,训练模型

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target)#划分测试集,训练集 print(len(x_train)) print(len(x_test)) # mul_nb = MultinomialNB() # mul_nb = BernoulliNB() mul_nb = GaussianNB() mul_nb.fit(x_train,y_train) prediction = mul_nb.predict(x_test) accuracy_score(prediction,y_test)#accuracy=分对的样本数/总的测试的样本数

运行结果:

6.4 导入混淆矩阵包,并且输出混淆矩阵

from sklearn.metrics import classification_report,confusion_matrix # 性能指标(Metrics)是衡量一个模型好坏的关键 # sklearn中的classification_report函数用于显示主要分类指标的文本报告 print(confusion_matrix(y_test,mul_nb.predict(x_test)))

运行结果:

6.5 混淆矩阵可视化

def cm_plot(y,yp): #导入混淆矩阵 from sklearn.metrics import confusion_matrix #输出混淆矩阵 cm = confusion_matrix(y,yp) print(cm) print(len(cm)) #导入画图工具 import matplotlib.pyplot as plt #画图 # plt.matshow(cm) plt.matshow(cm,cmap=plt.cm.Greens) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',verticalalignment='center') plt.ylabel('True label')# 坐标轴标签 plt.xlabel('Predicted label')# 坐标轴标签 cm_plot(y_test,mul_nb.predict(x_test)) #错误纠正 #准确率(精度):(13+14+10)/(13+14+10+1) #0类别的精确率:13/(13+0+0) #0类别的召回率:13/(13+0+0) #1类别的精确率:14/(14+0+0) #1类别的召回率:14/(14+0+1)

运行结果:

最新回复(0)