一、模型评估概述

1.什么是模型评估

模型评估是机器学习中一个非常关键的环节,它的主要目的是衡量训练好的模型在未见过的数据上的表现,从而判断模型是否泛化得好、有没有过拟合或欠拟合,以及是否能投入实际使用。

简单理解:

就是对模型“考试”,看看它学得咋样,不光是课堂作业(训练集),更重要的是期末考试(测试集)表现。


2.常见的模型评估方式

2.1按任务类型来分:

任务类型 常用评估指标
分类(如判断邮件是否为垃圾) 准确率、精确率、召回率、F1 分数、ROC-AUC
回归(如预测房价) 均方误差(MSE)、平均绝对误差(MAE)、R²
聚类或无监督任务 轮廓系数、互信息、ARI、DBI 等

2.2按数据集划分来分:

  • 训练集:模型学习用的,不适合做最终评估。

  • 验证集:调参用的。

  • 测试集:最终评估模型性能的标准,必须是模型“没见过”的数据。

举个例子(分类任务):

比如你训练了一个识别猫狗的模型,现在要评估它:

  • 你给它100张新的图片(测试集)

  • 它正确识别了90张,错了10张

  • 那它的准确率就是90%

但如果数据极度不平衡(比如90张是狗,10张是猫),单看准确率就容易“被忽悠”,所以你可能还要看精确率、召回率、F1等。


3. 什么是过拟合和欠拟合?

在这里插入图片描述

3.1 总结

  • 欠拟合(Underfitting):模型太“笨”,没学明白。

  • 过拟合(Overfitting):模型太“聪明”,把题都死记硬背了,结果考试不会用。

3.2 欠拟合

定义

模型在训练集上表现就不好,说明它没学到数据的规律,太简单了。

原因
  • 模型太简单(比如线性模型处理非线性问题)

  • 训练不够(轮数太少)

  • 特征太少或者特征提取不行

解决方法
  • 模型复杂化

  • 增加更多特征,使输入具有更强的表达能力

  • 调整参数和超参数

  • 降低正则化约束

3.3 过拟合(Overfitting)

定义

模型在训练集上学得很好,但测试集上表现很差——它不是学懂了,而是背答案了!

原因
  • 模型太复杂,参数太多

  • 数据量太小

  • 没做正则化

解决方法
  • 增加训练数据数

  • 使用正则化约束

  • 减少特征值

  • 调整超参数和参数

  • 降低模型的复杂度

  • 使用Dropout

  • 提前结束训练

总结口诀
欠拟合——模型太蠢,学不懂  
过拟合——模型太聪,死记硬背  
解决欠拟合——换复杂模型,多训练  
解决过拟合——模型降智,加数据,做正则

二、常见的分类模型评估指标

1. 混淆矩阵 Confusion Matrix

混淆矩阵是监督学习中的一种可视化工具,主要用于模型的分类结果和实例的真实信息的比较 。

矩阵中的每一行代表实例的预测类别,每一列代表实例的真实类别。

真实值是positive,模型认为是positive的数量(True Positive=TP)
真实值是positive,模型认为是negative的数量(False Negative=FN)
真实值是negative,模型认为是positive的数量(False Positive=FP)
真实值是negative,模型认为是negative的数量(True Negative=TN)

将这四个指标一起呈现在表格中,就能得到如下这样一个矩阵,我们称它为混淆矩阵(Confusion Matrix):
在这里插入图片描述

2. 准确率 Accuracy

正确分类的样本数 / 总样本数
即 Accuracy = (TP+TN)/(TP+FN+FP+TN)

  • 简单直观

  • 在样本不平衡时容易误导

    比如99%都是负类,模型全猜负类也有99%准确率。

3. 精确率 Precision

真阳性 / (真阳性 + 假阳性)
即 Precision = TP/(TP+FP)

  • 意思是:模型预测为正的那些中,真的是正的有多少?

  • 适用于假阳性成本高的场景

    比如垃圾邮件识别,宁可漏掉也不能误判正常邮件为垃圾。

4. 召回率 Recall(灵敏度)

真阳性 / (真阳性 + 假阴性)
即 Recall = TP/(TP+FN)

  • 意思是:所有真实为正的样本中,模型识别出了多少?

  • 适用于假阴性代价高的场景

    比如疾病筛查,宁可错杀一千,也不漏掉病人。

5. F1 分数

精确率和召回率的调和平均值
F1=2×Precision×RecallPrecision+RecallF1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}F1=2×Precision+RecallPrecision×Recall

  • 权衡精确率和召回率的平衡指标

  • 适用于正负样本不平衡、你既怕误杀也怕漏判的时候。

6. ROC 曲线 & AUC 值

  • ROC 曲线:全称为“受试者工作特征曲线”,它体现了模型在不同阈值下的“容错能力”。
    逻辑回归里面,对于正负例的界定,通常会设一个阈值,大于阈值的为正类,小于阈值为负类。而 ROC 曲线的精髓就在于:不断调整这个阈值(从0到1),记录每个点的真正率和假正率,然后以假阳性率为 X 轴,真阳性率为 Y 轴画出的曲线。
    在这里插入图片描述

  • AUC(Area Under Curve):ROC 曲线下的面积,范围在 0.5 - 1 之间。随机挑选一个正样本以及一个负样本,分类器判定正样本的值高于负样本的概率就是 AUC 值。AUC值(面积)越大的分类器,性能越好。

    0.5 = 瞎猜,1 = 完美分类

    在这里插入图片描述

  • 适用于模型输出的是概率值的情况,比如逻辑回归、神经网络

7. PR 曲线(Precision-Recall Curve)

  • 横轴:召回率 Recall(查全率)

  • 纵轴:精确率 Precision(查准率)

  • 面积:Average Precision(AP),越大越好

评价标准和ROC一样,先看平滑不平滑(蓝线明显好些)。一般来说,在同一测试集,上面的比下面的好(绿线比红线好)。当P和R的值接近时,F1值最大,此时画连接(0,0)和(1,1)的线,线和PRC重合的地方的F1是这条线最大的F1(光滑的情况下),此时的F1对于PRC就好像AUC对于ROC一样。

在这里插入图片描述

  • 适用场景:

    二分类任务

  • 数据不平衡时比 ROC 更实用!

    比如少数类别(如欺诈检测)特别关键时

8. 表格对比

指标 含义 适用场景
Accuracy 总体正确率 类别均衡、对误差容忍高
Precision 预测为正中真正的比例 错杀成本高(如垃圾邮件、广告点击)
Recall 实际为正中被预测出来的比例 漏判成本高(如疾病识别、欺诈检测)
F1 Score Precision 和 Recall 的调和平均 样本不平衡、需权衡查准与查全
AUC (ROC AUC) ROC 曲线下的面积,反映模型区分能力 二分类概率模型,样本不平衡时仍适用
PR 曲线 & AP 精确率-召回率之间的权衡曲线 & 平均精度 极度不平衡样本(如恶意行为、异常检测)
Confusion Matrix 展示 TP/FP/FN/TN 的二维矩阵 分析模型在哪些类型上容易出错

三、用 KNN 模型绘制ROC曲线和PR曲线

1.代码实现

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 precision_recall_curve, roc_curve, auc, accuracy_score, confusion_matrix

# Step 1: 生成二分类数据集
def generate_data():
    """
    生成一个用于二分类任务的模拟数据集,包含3个特征,其中2个是信息性特征。
    """
    X, y = make_classification(n_samples=4000, n_features=3, n_classes=2, 
                               n_informative=2, n_redundant=0, random_state=0)
    print(f"生成数据集:样本数 = {X.shape[0]}, 特征数 = {X.shape[1]}")
    return X, y

# Step 2: 数据分割为训练集和测试集
X, y = generate_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

print(f"训练集大小: {X_train.shape[0]}, 测试集大小: {X_test.shape[0]}")

# Step 3: 初始化KNN模型并训练
knn_model = KNeighborsClassifier(n_neighbors=5)  # 选择KNN分类器,邻居数设为5
knn_model.fit(X_train, y_train)  # 训练模型
print("KNN 模型训练完成。")

# Step 4: 预测测试集的概率
y_scores = knn_model.predict_proba(X_test)[:, 1]  # 预测正类的概率
print("概率预测完成。")

# Step 5: 计算 Precision-Recall 曲线数据
precision, recall, _ = precision_recall_curve(y_test, y_scores)
pr_auc = auc(recall, precision)  # 计算 Precision-Recall 曲线下的AUC值
print(f"PR 曲线 AUC: {pr_auc:.2f}")

# Step 6: 计算 ROC 曲线数据
fpr, tpr, _ = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)  # 计算 ROC 曲线下的AUC值
print(f"ROC 曲线 AUC: {roc_auc:.2f}")

# Step 7: 模型评估 - 计算准确率和混淆矩阵
y_pred = knn_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)

print(f"模型准确率: {accuracy:.2f}")
print("混淆矩阵:")
print(cm)

# Step 8: 绘制 Precision-Recall 和 ROC 曲线
plt.figure(figsize=(12, 6))

# 绘制 ROC 曲线
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, color='r', label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--')  # 参考线
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc='lower right')

# 绘制 PR 曲线
plt.subplot(1, 2, 1)
plt.plot(recall, precision, color='b', label=f'PR curve (AUC = {pr_auc:.2f})')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc='lower left')

# Step 9: 显示图形
plt.tight_layout()
plt.show()

# Step 10: 结果解释
# print(f"1. PR 曲线 AUC:PR 曲线 AUC 值接近1表示模型性能好,AUC越大,模型表现越好。")
# print(f"2. ROC 曲线 AUC:ROC 曲线 AUC 值接近1表示模型能更好地区分正负样本。")
# print(f"3. 准确率:这是模型分类的基本评价指标,考虑了正负类样本的分布。")
# print(f"4. 混淆矩阵:混淆矩阵提供了模型在测试集上的预测结果分布,帮助我们理解误分类的类型。")

2.运行结果

在这里插入图片描述
在这里插入图片描述

四、总结

模型评估不仅是为了看模型得分高不高,更重要的是找出模型的问题在哪,比如有没有过拟合、欠拟合,或者预测是否偏向某一类。为了更全面地了解模型表现,我们不能只看一个指标,而是要结合多种指标一起分析。比如在样本不平衡的情况下,Accuracy(准确率)可能会很高,但模型其实没学会真正有用的东西。这时候,Precision(精确率)、Recall(召回率)和 F1 分数就能帮我们判断模型是否真的有效。ROC 曲线和 PR 曲线可以让我们直观看出模型在不同阈值下的表现变化,帮助我们选择更合适的决策边界。而混淆矩阵则像一张成绩单,把预测正确和错误的情况一一列出,让我们知道模型具体错在哪。通过这些工具,我们才能真正了解模型的强项和弱点,为后续优化打下基础。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐