目录
一、理论
1.常见指标
当评估分类模型性能时,常用的指标包括准确率、精确率、召回率、F1分数和混淆矩阵。下面对这些指标进行详细解释:
1.准确率(Accuracy): 准确率是指分类器正确分类的样本数占总样本数的比例。计算公式为:准确率 = (TP + TN) / (TP + TN + FP + FN),其中TP表示真正例(模型将正类别预测为正类别的样本数)、TN表示真负例(模型将负类别预测为负类别的样本数)、FP表示假正例(模型将负类别预测为正类别的样本数)、FN表示假负例(模型将正类别预测为负类别的样本数)。
2.精确率(Precision): 精确率是指分类器预测为正类别的样本中,真正为正类别的比例。计算公式为:精确率 = TP / (TP + FP)。精确率衡量了分类器预测为正类别的准确性
3.召回率(Recall): 召回率是指真正为正类别的样本中,被分类器预测为正类别的比例。计算公式为:召回率 = TP / (TP + FN)。召回率衡量了分类器对正类别的识别能力。
4.F1分数(F1 Score): F1分数是精确率和召回率的调和平均值,综合考虑了分类器的准确性和识别能力。计算公式为:F1 = 2 * (精确率 * 召回率) / (精确率 + 召回率)。
5.混淆矩阵(Confusion Matrix): 混淆矩阵是用于可视化分类模型性能的矩阵,展示了模型预测结果与真实标签之间的对应关系。混淆矩阵包括真正例(TP)、真负例(TN)、假正例(FP)和假负例(FN),帮助我们更直观地了解分类器的表现。
2.ROC曲线
ROC曲线是一种用于表示分类模型性能的图形工具。它通过将真阳性率(True Positive Rate,TPR)和假阳性率(False Positive Rate,FPR)作为横纵坐标来描绘分类器在不同阈值下的性能。
- 真阳性率 (True Positive Rate, TPR)
真阳性率(True Positive Rate,TPR)通常也被称为敏感性(Sensitivity)或召回率(Recall)。它是指分类器正确识别正例的能力。真阳性率可以理解为所有阳性群体中被检测出来的比率(1-漏诊率),因此TPR越接近1越好。它的计算公式如下:
其中,TP(True Positive)表示正确识别的正例数量,FN(False Negative)表示错误地将正例识别为负例的数量。
- 假阳性率 (False Positive Rate, FPR)
假阳性率(False Positive Rate,FPR)是指在所有实际为负例的样本中,模型错误地预测为正例的样本比例。假阳性率可以理解为所有阴性群体中被检测出来阳性的比率(误诊率),因此FPR越接近0越好。它的计算公式如下:
其中,FP(False Positive)表示错误地将负例识别为正例的数量,TN(True Negative)表示正确识别的负例数量。
FPR的值等于1-特异性。特异性(Specificity)是指在所有实际为负例的样本中,模型正确地预测为负例的样本比例,其衡量的是模型对负例样本的判断能力。假如一个模型的特异性很高,则该模型在预测负例时的准确率很高,也就是说,该模型较少将负例预测为正例,从而使得假阳性率较低。因此,假阳性率和特异性都是用来衡量模型在负例样本上的性能,它们之间是负相关的,即假阳性率越低,特异性越高,反之亦然。
3.PR曲线
PR曲线,即精确率-召回率曲线(Precision-Recall Curve),是用于评估分类模型性能的一种工具,尤其在处理不平衡数据集时非常有用。
PR曲线通过绘制精确率(Precision)和召回率(Recall)之间的关系来展示模型的性能。其中,精确率是指被预测为正类的样本中实际为正类的比例,而召回率则是指实际为正类的样本中被正确预测为正类的比例。在二分类问题中,这两个指标通常随着分类阈值的变化而变化,通过改变这个阈值,可以得到不同的精确率和召回率组合,从而形成一条曲线。具体特点如下:
- 阈值变化:通过调整分类模型的决策阈值,可以得到不同的精确率和召回率组合,这些组合构成了PR曲线。
- 评估模型性能:PR曲线可以帮助我们了解模型在不同阈值下的性能表现,特别是在正负样本数量不平衡的情况下。
- 选择合适的阈值:通过观察PR曲线,可以选择一个合理的阈值,使得模型在精确率和召回率达到一个较好的平衡点。
- 避免极端情况:在进行PR曲线分析时,需要注意避免出现精确率或召回率为0和1的极端情况,这些情况可能会导致模型性能的误判。
4.ROC曲线和PR曲线的差异
ROC曲线和PR曲线的主要差异在于它们各自的适用场景和表示的指标不同。
首先,ROC曲线主要用于评估模型的整体性能,而PR曲线则更关注于模型在正类样本上的识别能力。ROC曲线是通过绘制不同分类阈值下的真正例率(TPR)和假正例率(FPR)来表现模型性能的,它假设正负样本的先验概率相等,适用于类别均衡的数据集。相比之下,PR曲线则是通过精确率(Precision)和召回率(Recall)来评估模型,通常用于处理正样本先验概率远大于负样本的不平衡数据集。
其次,ROC曲线和PR曲线在视觉表现上也有所不同。一个好的模型在ROC图上的表现通常是偏向左上角的,而在PR曲线中则是偏向右上角的。这意味着在不同的数据分布和问题背景下,我们应该选择合适的曲线来评估模型性能。
二、代码实现——对鸢尾花分类的模型评估
1.源码实现
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from matplotlib.colors import ListedColormap
#导入iris数据
from sklearn.datasets import load_iris
iris = load_iris()
X=iris.data[:,:2] #只取前两列
y=iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y,random_state=42) #划分数据,random_state固定划分方式
#导入模型
from sklearn.neighbors import KNeighborsClassifier
#训练模型
n_neighbors = 5
knn = KNeighborsClassifier(n_neighbors=n_neighbors)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
#查看各项得分
print("y_pred",y_pred)
print("y_test",y_test)
print("score on train set", knn.score(X_train, y_train))
print("score on test set", knn.score(X_test, y_test))
print("accuracy score", accuracy_score(y_test, y_pred))
# 可视化
# 自定义colormap
def colormap():
return mpl.colors.LinearSegmentedColormap.from_list('cmap', ['#FFC0CB','#00BFFF', '#1E90FF'], 256)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
axes=[x_min, x_max, y_min, y_max]
xp=np.linspace(axes[0], axes[1], 500) #均匀500的横坐标
yp=np.linspace(axes[2], axes[3],500) #均匀500个纵坐标
xx, yy=np.meshgrid(xp, yp) #生成500X500网格点
xy=np.c_[xx.ravel(), yy.ravel()] #按行拼接,规范成坐标点的格式
y_pred = knn.predict(xy).reshape(xx.shape) #训练之后平铺
# 可视化方法一
plt.figure(figsize=(15,5),dpi=100)
plt.subplot(1,2,1)
plt.contourf(xx, yy, y_pred, alpha=0.3, cmap=colormap())
#画三种类型的点
p1=plt.scatter(X[y==0,0], X[y==0, 1], color='blue',marker='^')
p2=plt.scatter(X[y==1,0], X[y==1, 1], color='green', marker='o')
p3=plt.scatter(X[y==2,0], X[y==2, 1], color='red',marker='*')
#设置注释
plt.legend([p1, p2, p3], iris['target_names'], loc='upper right',fontsize='large')
#设置标题
plt.title(f"3-Class classification (k = {n_neighbors})", fontdict={'fontsize':15} )
# 可视化方法二
plt.subplot(1,2,2)
cmap_light = ListedColormap(['pink', 'cyan', 'cornflowerblue'])
cmap_bold = ListedColormap(['darkorange', 'c', 'darkblue'])
plt.pcolormesh(xx, yy, y_pred, cmap=cmap_light)
# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold,
edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title(f"3-Class classification (k = {n_neighbors})" ,fontdict={'fontsize':15})
plt.show()
########实验二###########
from sklearn.metrics import precision_score, recall_score, f1_score, roc_curve, auc, precision_recall_curve, roc_auc_score
# 计算精确率、召回率和F1分数
precision = precision_score(y_test, knn.predict(X_test), average='weighted')
recall = recall_score(y_test, knn.predict(X_test), average='weighted')
f1 = f1_score(y_test, knn.predict(X_test), average='weighted')
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)
#############不同k值下的ROC曲线###########
from sklearn.preprocessing import label_binarize
k_values = [3, 5, 7] # 不同的k值
plt.figure(figsize=(8, 6))
y_test_bin = label_binarize(y_test, classes=[0, 1, 2]) # 将多分类标签转换为二进制格式
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_proba = knn.predict_proba(X_test)
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(3): # 有3个类别
fpr[i], tpr[i], _ = roc_curve(y_test_bin[:, i], y_proba[:, i])
roc_auc[i] = roc_auc_score(y_test_bin[:, i], y_proba[:, i])
plt.plot(fpr[i], tpr[i], label='k = %d, class %d (AUC = %0.2f)' % (k, i, roc_auc[i]))
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve for Different k Values')
plt.legend(loc="lower right")
plt.show()
2.代码分析
在现有代码的基础上计算常见的分类模型评估指标。
第一部分:计算常见的分类模型评估指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1分数(F1 Score)和混淆矩阵(Confusion Matrix)。
第二部分:
不同k值下的ROC曲线:针对不同的k值(3, 5, 7),计算并绘制了多类别的ROC曲线,用于比较不同k值下模型的性能。
三、实验结果分析
1.实验结果
2.实验结果分析
-
结论
在实验二中,计算了模型的精确率、召回率和F1分数,进一步评估了模型的性能。
得到的指标表明模型在多个方面都取得了较好的性能表现。
针对不同的k值,绘制了多类别的ROC曲线,用于比较不同k值下模型的性能。
通过观察ROC曲线,可以发现在不同k值下,模型的性能有所差异。随着k值的增加,模型的整体性能存在一定的变化,这表明选择合适的k值对模型的性能影响较大。
-
问题与思考
如何确定最佳的k值?在实际应用中,需要对不同的k值进行交叉验证或者网格搜索,以确定最优的超参数。
对于多分类问题,是否可以尝试其他的分类算法,并与KNN进行比较,以获得更全面的模型评估?
虽然在二维空间下的可视化结果表现良好,但在实际应用中,如何处理高维数据的可视化呈现是一个挑战。