机器学习——模型评估

1. 常见的分类模型评估指标

  • 准确率(Accuracy):正确分类的样本数占总样本数的比例。
  • 精确率(Precision):真正例(TP)占预测为正例(TP+FP)的比例。
  • 召回率(Recall):真正例(TP)占实际为正例(TP+FN)的比例。
  • F1分数(F1 Score):精确率和召回率的调和平均值,用于综合评估模型性能。

from sklearn.metrics import confusion_matrix
y_true = [1, 1, 0, 1, 0, 0]
y_pred = [1, 1, 1, 1, 0, 1]
TN, FP, FN, TP = confusion_matrix(y_true, y_pred).ravel()
print(TN, FP, FN, TP)

运行结果为 
以这段代码为例来计算以上分类模型评估指标

TP表示原本为阳性,经模型预测后也为阳性的个数
FN表示原本为阳性,经模型预测后不为阳性的个数
FP、TN亦是如此。

1.1 准确率

Accuracy(准确率)

在这里插入图片描述
即为预测对的样本/总样本,这里acc=4/6

1.2精确率

Precision(精确率)

在这里插入图片描述
用阳性来举例
精确率又称为查准率,可以简单理解为该模型认为你是阳性,而其中实际确实为阳性的概率,这里阳性的Precision = 3 / 5

1.3 召回率

Recall(召回率)

在这里插入图片描述
用阳性来举例
简单来说就是用于评判模型能不能很好的找出阳性样本,即 阳性样本中被模型识别出阳性的数量/实际的阳性样本数量,这里阳性的recall = 3 / 3 = 100%,说明模型recall非常好。

1.4 F1-Score(F1评分)
召回率和精确率的调和平均数。

F1就是精确率和召回率的一种综合考虑标准,因为有的模型需要召回率高才能够进行实际运用,有的需要精确率高,有的则需要二者的折中。以阳性为例,这里f1 = 2 * 0.6 * 1 / 0.6 + 1 = 0.75

2. ROC曲线和PR曲线的差异

  • ROC曲线:以真正例率(TPR,即召回率)为纵轴,假正例率(FPR,即FP/(FP+TN))为横轴绘制的曲线。ROC曲线越接近左上角,模型性能越好。AUC(Area Under the Curve)值用于量化ROC曲线的性能,AUC值越大,模型性能越好。
  • PR曲线:以召回率为纵轴,精确率为横轴绘制的曲线。PR曲线越接近右上角,模型性能越好。PR曲线对于不平衡数据集的性能评估更为敏感。

3. 画出不同k值下的ROC曲线,并对其进行分析

  1. 准备数据:加载数据集,并将其划分为训练集和测试集。
  2. 训练模型:对于每个k值(例如k=1, 3, 5, ..., 21),训练一个k-NN分类器。
  3. 预测与评估:使用测试集对模型进行预测,并计算每个模型的真正例、假正例、真反例和假反例数量。
  4. 计算TPR和FPR:根据预测结果计算每个模型的TPR和FPR。

            ROC曲线是一种图形化工具,用于评估二分类模型的性能。它可以展示出模型在不同阈值下的全局性能,特别是在处理不平衡数据集时非常有用。

            ROC曲线以两个重要的性能指标为基础:真正例率(True Positive Rate, TPR)和假正例率(False Positive Rate, FPR)。

            TPR是指在所有实际正例中,被模型正确预测为正例的比例,计算公式为:

            FPR是指在所有实际负例中,被模型错误地预测为正例的比例,计算公式为

​​​​

     5.画出不同k值下的ROC曲线

        5.1绘制ROC曲线

        

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# 创建模拟的分类数据集
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
 
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
 
# 创建并训练KNN分类器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 获取模型的概率分数(KNN不直接输出概率,但可以用于ROC曲线)
y_scores = knn.predict_proba(X_test)[:, 1]
 
# 计算ROC曲线的FPR和TPR
fpr, tpr, _ = roc_curve(y_test, y_scores)
 
# 计算ROC曲线下方的面积
roc_auc = auc(fpr, tpr)

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkred', lw=2, label='ROC Curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='Random Guess')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.title('Receiver Operating Characteristic Curve')
plt.legend(loc='lower right')
plt.grid(True)
 
plt.show()

运行结果图:

当n_neighbors=5时:

当n_neighbors=8时:

在KNN 分类器中增加 n_neighbors 参数的值,并且观察到AUC值增加,通常是因为增加了K值,模型变得更加平滑和稳定。然而,需要注意的是,增加K值也可能导致模型的偏差增加,因为它可能无法捕获数据中的细微特征。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值