1.分类模型介绍
分类模型是机器学习的一种类型,它的任务是通过学习样本的特征来预测样本的类别。
分类模型通常用于那些输出变量是分类或者离散值的任务,例如,判断一封邮件是垃圾邮件还是非垃圾邮件,或者预测一个患者是否患有某种疾病。在训练过程中,分类模型会从标记好的训练数据中学习到如何判断一个样本属于哪个类别,然后在面对新的数据时,根据学习到的知识进行预测。
2.为什么要进行分类模型的评估
评估分类模型的性能非常重要,因为它能帮助我们了解模型的表现如何,以及模型在实际应用中的可能表现。通过使用不同的评估指标,可以从不同的角度理解模型的性能。
作为使用场景最为广泛的机器学习模型,其评估指标也随着使用场景的拓展而不断丰富,例如,可以通过查看模型的准确率来了解模型正确预测的比例,还有精确度、召回率、F1分数、受试者特征曲线(ROC-AUC)等,不同评估指标有对应的不同的计算方法,同时也对应着不同的使用场景。
3.分类模型评估指标
准确率(Accuracy)
查准率(Precision)
召回率(Recall)
F1分数(F1-Score)
P-R曲线、ROC曲线
1.准确率准确率(Accuracy)
准确率:对于给定的测试数据集,分类器正确分类的样本数与总样本数之比,其计算公式为:准确度(Accuracy)= 真正例(TP)+真负例(TN)/真正例(TP)+假正例(FP)+真负例(TN)+假负例(FN)
2.查准率(Precision)
查准率,又称为精确率,指的是模型预测为正的样本中实际情况也为正的概率,公式如下:
精确度(Precision)=
真正例(TP)/真正例(TP)+假正例(FP)
3. 召回率
召回率,又叫做查全率,指的是实际为正的样本中模型预测为正的概率,公式如下:
召回率= 真正例数/真正例数 + 假负例数
4.F1分数(F1-Score)
可以看出,召回率和查准度是一对相对的概念,它们在关注正类样本的识别过程中,各有侧重点。召回率的目标是尽可能地将正类样本识别出来,而查准率则追求在每次对正类样本的判断都能获得正确的结果。
然而,在大多数情况下,我们的期望是获得一个在两者之间实现“均衡”的模型评估指标,既不希望模型过于冒进,也不希望模型过于保守。特别是对于偏斜的样本,不仅要求模型能够准确地识别出正类样本,同时也希望能尽可能地减小对负类样本准确率的牺牲。因此,在这种情况下,可以考虑使用召回率和查准率的调和平均数作为模型评估指标,这就是F1-Score,其常用的一种计算公式为
F1−Score= 2⋅TP/2⋅TP+FP+FN
其中,P 为查准率,R 为召回率。
F1-Score是综合考虑使用召回率和查准率的指标,F1-Score越高,模型分类效果越好。
P-R曲线、ROC曲线
1.了解ROC曲线:
ROC曲线就有四个关键的数据
与准确率一样需要用到的 TP 表示真正例,TN 表示真负例,FP 表示假正例,FN 表示假负例
1.FPR
曲线的x轴,表示假阳性率,计算公式为 :FPR=FP/(FP+TN)
2.TPR
曲线的纵坐标,表示真阳性率,也称为召回率,计算公式为 :TPR=TP/(TP+FN)
3. AUC
ROC曲线下方的面积被称为AUC,也就是ROC曲线与x轴围成的面积。AUC的取值范围在0到1之间,AUC越大,越接近1,表示模型性能越好,也就是是相同假阳性下对应的真阳性率标记高,预测的就更准确。那ROC曲线通常会越靠近左上角,AUC值就越大。
4.阈值
阈值代表了分类器将样本判定为正例的概率阈值。阈值决定了分类器如何将样本判定为正例或负例。当样本的预测概率高于阈值时,分类器将其判定为正例,否则判定为负例。
阈值的取值在[0, 1]之间,每个阈值代表的是ROC上的一个点,也就我们在绘制ROC曲线的时候需要选取多个阈值来描绘多个点,用平滑的曲线将这些点连接起来就得到了ROC曲线。
我们拿鸢尾花来举例一下,假设我们的阈值取值为0.3,我们拿本实验的knn算法来解释一下,鸢尾花有三种类别setosa,versicolor和virginica,我们选取测试集中的一个点,用knn算法求得训练集中与该点最近的k个点,这k个点都属于这三种类别,每种类别的预测概率就为该类别在这k个中的占比,这边假设setosa为0.2,versicolor为0.4和virginica为0.4,那么
TP是被正确分类为正例的versicolor和virginica样本数。
FN是实际为正例但被错误分类为负例的versicolor和virginica样本数。
FP是实际为负例但被错误分类为正例的setosa样本数。
TN是被正确分类为负例的setosa样本数。
通过这个我们就可以得到FPR和TPR,然后我们就可以得到ROC上的一个点,把这些点平滑的连接起来就是ROC曲线,不同的k值得到的曲线也不相同。
2.绘制ROC曲线
1.函数解释
我们的函数需要四个变量,y_test 是测试集的真实标签,y_pred_probs 是预测的概率值,k 值,classes 是类别的列表。
我们用y_test_bin记录真实标签进行二值化处理的结果,将其转换为二进制形式。也就是说我们把我们的标签都标号了,便于遍历。
roc_curve(y_test_bin[:, i], y_pred_probs[:, i])中第一个变量是真实标签,第二个是预测概率,得到的是图上的一个点。
for循环中对于每个类别,计算对应的假正例率、真正例率以及ROC曲线下面积。我们利用roc_curve函数来得到该类别在不同阈值下的多个点。用roc_auc[i] = auc(fpr[i], tpr[i])计算该类别的AUC值,再把这些点连接起来得到该类别下的ROC曲线。
使用了 plt.plot 函数来绘制 ROC 曲线上的点,并为每条线条指定了不同的类别标签和颜色。我们没有显式地为每个类别指定颜色,因此 Matplotlib 会自动选择合适颜色。
2.绘制的ROC图像
可以看到我的曲线都不够平滑,那是因为我的数据集太小,预测的结果比较单一,因此得到的点的分布就比较简单。
我们还可以看到当我们的k值取19的时候,我们绘制的ROC曲线就是TPR=1这一条直线。那是因为在鸢尾花数据集中,如果 k 值足够大,KNN 算法会考虑到所有的训练样本,因此最终分类结果将会非常准确。这会导致 ROC 曲线上的所有点都位于左上角,形成一条直线,使得 AUC 的值等于 1
roc函数代码`def plot_roc_curve(y_test, y_pred_probs, k,classes):
# Binarize the output
y_test_bin = label_binarize(y_test, classes=classes)
n_classes = y_test_bin.shape[1]
plt.figure()
fpr = dict()
tpr = dict()
roc_auc = dict()
# Compute ROC curve and ROC area for each class
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test_bin[:, i], y_pred_probs[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
plt.plot(fpr[i], tpr[i], label=f'类别Class {i} (AUC = {roc_auc[i]:.2f})')
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.title(f'k值为(k={k})的ROC曲线 ')
plt.legend(loc="lower right")
plt.show()`
标签:plt,机器,模型,ROC,TP,负例,曲线,评估 From: https://www.cnblogs.com/ls111/p/18136873