在数据加载和准备之后,机器学习模型会使用如线性回归或 K 近邻等算法和 Scikit-learn 等库进行训练。训练后的模型从训练数据中学习到模式。此时,一个主要问题便会产生:模型实际学得怎么样?它能对新的、未见过的数据做出准确预测吗?模型评估可以解答这些问题。回想在第二章(“基本概念”)和第六章(“数据准备”)中,我们讨论了将数据集划分为训练集和测试集。训练集用于教导模型,而测试集则被预留下来。我们在未经使用过的测试集上评估模型的表现,因为它能为我们提供模型在之前从未遇到的全新数据上表现的真实估计。仅在训练数据上评估可能会有误导性;模型可能只是简单地记住训练样本(过拟合),并在面对稍有不同的输入时表现不佳。您用于评估的具体指标在很大程度上取决于您解决的问题类型:回归问题还是分类问题。回归模型的评估如果您的目标是预测一个连续数值,例如预测房价(一个回归任务,第三章已介绍),您将使用衡量模型预测值与测试集真实值之间平均误差的指标。常见回归指标包括:平均绝对误差 (MAE): 该指标计算预测值与实际值之间绝对差值的平均值。它能直接衡量误差的平均大小,单位与您的目标变量原始单位相同(例如房价的美元)。 $$ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$ 这里,$n$ 是测试集中的样本数量,$y_i$ 是第 $i$ 个样本的真实值,$\hat{y}_i$ 是预测值。MAE 越低通常表示拟合效果越好。均方误差 (MSE): 该指标计算预测值与实际值之间平方差的平均值。对误差进行平方会使较大的误差受到比小误差更重的惩罚。MSE 的单位是目标变量单位的平方(例如美元平方),有时可能不太直观。 $$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$ 和 MAE 一样,MSE 越低越好。由于平方,MSE 对异常值(预测值偏离真实值很远)较为敏感。均方根误差 (RMSE): 这就是 MSE 的平方根。取平方根可以将误差指标带回目标变量的原始单位(例如美元),使其比 MSE 更容易解释,同时仍能惩罚较大的误差。 $$ RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} = \sqrt{MSE} $$ RMSE 越低表示数据拟合效果越好。使用 Scikit-learn 等库时,计算这些指标非常方便。您通常将测试集中的真实目标值 (y_test) 和模型做出的预测 (y_pred) 提供给 mean_absolute_error 或 mean_squared_error 等函数。# 使用 Scikit-learn 的示例(假设 y_test 和 y_pred 已存在) from sklearn.metrics import mean_absolute_error, mean_squared_error import numpy as np mae = mean_absolute_error(y_test, y_pred) mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) # 或者使用 mean_squared_error(y_test, y_pred, squared=False) print(f"平均绝对误差: {mae}") print(f"均方误差: {mse}") print(f"均方根误差: {rmse}")分类模型的评估如果您的目标是预测类别或标签,例如识别垃圾邮件或对动物图片进行分类(一个分类任务,第四章已讨论),您将使用不同的指标。常见分类指标包括:准确率: 这通常是人们首先想到的指标。它简单地表示模型正确预测的比例。 $$ 准确率 = \frac{\text{正确预测的数量}}{\text{预测总数}} $$ 准确率虽然易于理解,但可能具有误导性,特别是当您拥有一个不平衡数据集(当一个类别远比其他类别更常见时)时。例如,如果 95% 的邮件不是垃圾邮件,那么一个总是预测“不是垃圾邮件”的模型将达到 95% 的准确率,但对于识别真实垃圾邮件却毫无用处。混淆矩阵: 该表格为每个类别的正确和不正确预测提供了更详细的分解。对于一个二元分类问题(两个类别,通常标记为正类和负类或 1 和 0),它看起来像这样:digraph G { rankdir=LR; node [shape=plaintext]; subgraph cluster_0 { label = "混淆矩阵示例"; style = "rounded"; color = "#adb5bd"; // gray fontsize=12; matrix [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4"> <TR><TD BORDER="0"></TD><TD BORDER="0" COLSPAN="2"><B>预测类别</B></TD></TR> <TR><TD BORDER="0" ROWSPAN="2" VALIGN="MIDDLE"><B>实际<BR/>类别</B></TD><TD>正类 (1)</TD><TD>负类 (0)</TD></TR> <TR><TD BGCOLOR="#b2f2bb">真阳性 (TP)<BR/><I>正确预测为正类</I></TD><TD BGCOLOR="#ffc9c9">假阴性 (FN)<BR/><I>错误预测为负类<BR/>(漏报正类)</I></TD></TR> <!-- green / red --> <TR><TD BORDER="0"></TD><TD BGCOLOR="#ffc9c9">假阳性 (FP)<BR/><I>错误预测为正类<BR/>(虚警)</I></TD><TD BGCOLOR="#b2f2bb">真阴性 (TN)<BR/><I>正确预测为负类</I></TD></TR> <!-- red / green --> </TABLE> >]; } }混淆矩阵总结了分类表现,显示了真阳性(正确预测为正类)、真阴性(正确预测为负类)、假阳性(错误预测为正类)和假阴性(错误预测为负类)。混淆矩阵使我们能够计算更详细的指标:精确率: 在模型预测为正类的所有实例中,有多少比例实际是正类?高精确率意味着更少的假阳性。当假阳性的成本很高时(例如将合法邮件标记为垃圾邮件),这很重要。 $$ 精确率 = \frac{TP}{TP + FP} $$召回率 (灵敏度或真阳性率): 在所有实际为正类的实例中,模型正确识别出了多少比例?高召回率意味着更少的假阴性。当假阴性的成本很高时(例如未能检测出严重疾病),这很重要。 $$ 召回率 = \frac{TP}{TP + FN} $$通常,精确率和召回率之间存在权衡。调整模型的阈值可能会提高一个但降低另一个。您应用的具体需求将决定哪个指标(或指标的平衡)最重要。Scikit-learn 等库提供 accuracy_score、confusion_matrix 和 classification_report(方便地计算精确率、召回率和另一个称为 F1 分数的指标)等函数来评估您的分类器。# 使用 Scikit-learn 的示例(假设 y_test 和 y_pred 已存在) from sklearn.metrics import accuracy_score, confusion_matrix, classification_report accuracy = accuracy_score(y_test, y_pred) conf_matrix = confusion_matrix(y_test, y_pred) class_report = classification_report(y_test, y_pred) print(f"准确率: {accuracy}") print("\n混淆矩阵:\n", conf_matrix) print("\n分类报告:\n", class_report)结果的解读评估不仅仅是计算数字。它是关于解读这些数字对于您特定问题而言的含义。如果您预测的是数百万美元的房价,RMSE 为 50 可能是出色的,但如果您预测的是摄氏温度,那就很糟糕了。90% 的准确率可能看起来不错,但仔细查看混淆矩阵可能会显示模型在某个特定的、重要的类别上表现不佳。这些评估指标使用未见过(或“新”)的测试数据,为您的模型表现提供了客观反馈。它们帮助您了解模型的优点和缺点,并指引下一步的可能方向,例如尝试不同的算法、收集更多数据,或进行更精细的特征工程(这些是后续学习的内容)。完成了这些步骤,您现在已经完成了构建和评估一个基础机器学习模型的完整周期!