目录
分类模型评估指标
什么是分类模型
分类模型是机器学习的一种类型,主要用于区分和处理离散或分类数据。分类模型的目标是根据已有数据的特征来预测新的数据属于哪个类别。
常见的分类模型评估指标
混淆矩阵
对于二分类问题,有 FP,TP,FN,TN四个参数来表示模型的预测情况。
TP 对应 true positive, 真阳性,真实分类为正,模型预测也为正
TN 对应 true negative, 真阴性,真实分类为反,模型预测也为反
FP 对应 false positive, 假阳性,真实分类为反,模型预测为正
FN 对应 false negative, 假阴性,真实分类为正,模型预测为反
准确率(Accuracy)
准确率是我们最常用的分类性能指标。
这个指标的含义是预测正确的数占样本总数的比例,即正确预测的正反例数 /总数。
精准率(Precision)
这个指标的含义是所有预测为正例的样本中正例预测正确的样本个数。
召回率(Recall)
正确预测的正例数与实际正例总数的比值。
这个指标的含义是实际为正例的样本中,有多少正例被检测出来了。
F1分数
F1分数是精确率和召回率的调和平均值,更接近于两个数较小的那个,用于综合考虑分类器的性能。所以精确率和召回率接近时,F值最大。
ROC曲线与PR曲线的差异
ROC曲线
ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估二分类模型性能的工具。它通过绘制真正例率(TPR)和假正例率(FPR)之间的关系来展示模型在不同阈值下的性能。AUC值(Area Under the Curve)则是ROC曲线下的面积,它表示了模型的整体性能,AUC值越接近1,模型的性能越好。
PR曲线
在正负样本分布得极不均匀(highly skewed datasets),负例远大于正例时,并且这正是该问题正常的样本分布时,PR比ROC能更有效地反应分类器的好坏,即PR曲线在正负样本比例悬殊较大时更能反映分类的真实性能。
ROC曲线与PR曲线的差异
ROC曲线关注模型对整体样本的分类效果,适用于评估分类器的整体性能;而PR曲线则更关注模型对少数类的识别率,适用于数据不平衡或需要关注特定类别识别能力的场景。
KNN算法对不同K值下的ROC曲线的分析
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, auc
# 生成一个模拟的二分类数据集
X, y = make_classification(n_samples=1000, n_classes=2, n_features=10, random_state=42)
# X是一个包含1000个样本、每个样本有10个特征的数组,y是一个包含1000个样本的标签的数组(0或1)
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# X_train, y_train是训练集的特征和标签,X_test, y_test是测试集的特征和标签
k_values = [1, 3, 6, 10]
plt.figure()
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_scores = knn.predict_proba(X_test)[:, 1] # 取正类的概率
# 计算ROC曲线的相关指标:假正率(fpr)和真正率(tpr)
fpr, tpr, thresholds = roc_curve(y_train, knn.predict_proba(X_train)[:, 1])
# 计算AUC值
roc_auc = auc(fpr, tpr)
print(f"k={k}, AUC={roc_auc:.2f}")
# 在同一个图上绘制不同k值的ROC曲线
plt.plot(fpr, tpr, label=f'ROC curve for k={k} (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC curve for KNN classification with different k values on an imbalanced dataset')
plt.legend(loc="lower right")
plt.show()
运行结果
结论
随着k
值的增加,KNN分类器的决策会更加基于数据的整体分布,而不是单个样本的噪声。这通常会导致分类器性能的改善,反映在ROC曲线上的更高真正率和更低假正率。然而,k
值也不能过大,因为过大的k
值可能导致分类器过于平滑,失去对局部结构的敏感性,从而降低性能。因此,在实际应用中,应该选择合适的k
值。