指标
在本节课中,了解机器学习任务中最常用的一些评估指标。
什么是指标?
指标在机器学习任务中至关重要。当你定义一个机器学习任务时,必须明确将使用哪些类型的指标进行评估。评估模型的性能非常重要,如果没有指标,你就无法判断模型表现的好坏。更糟糕的是,选择错误的指标可能会导致你走向错误的方向。
因此,为机器学习任务定义一个良好的评估指标非常关键。
对于有监督学习,我们通常有一些公认的指标。分类和回归问题所使用的指标不同。即使是同一类任务(例如分类任务),也有多种指标可供选择,如 F1-score、AUC、accuracy 等。有些指标具有通用性,而有些则仅适用于特定场景。
对于无监督学习,情况稍复杂一些,不同任务之间的指标差异较大。例如聚类任务中有许多可用指标,但它们不像有监督学习中的指标那样具有普适性。
sklearn 提供了大量函数,覆盖了多种任务和应用场景。
注意:在接下来的示例中,我们将使用逻辑回归和线性回归模型来演示模型效果。你可以暂时忽略这些模型是如何训练的,相关内容将在后续章节中详细讲解。
分类
混淆矩阵
在介绍混淆矩阵之前,我们需要先了解二分类任务中的一些基本术语:
P:数据中真实正例的数量。N:数据中真实负例的数量。TP:真正例(True Positive):预测结果为正,实际值也为正。TN:真负例(True Negative):预测结果为负,实际值也为负。FP:假正例(False Positive):预测结果为正,但实际值为负。FN:假负例(False Negative):预测结果为负,但实际值为正。
混淆矩阵是一个包含两行两列的表格,用于展示假正例、假负例、真正例和真负例的数量。
sklearn 提供了一个函数用于输出该矩阵,同时还提供了一个非常实用的函数,可用于绘制带有颜色的混淆矩阵图。
如下代码所示,confusion_matrix 函数可在给定真实标签和预测标签的情况下计算混淆矩阵。plot_confusion_matrix 则用于将混淆矩阵以热力图(heatmap)形式可视化。以下是混淆矩阵可视化的一个示例:
1import sklearn.metrics as metrics 2 3cm = metrics.confusion_matrix(test_y, pred_y) 4metrics.plot_confusion_matrix(lr, test_x, test_y)
1import sklearn.datasets as datasets 2import sklearn.metrics as metrics 3from sklearn.linear_model import LogisticRegression 4from sklearn.model_selection import train_test_split 5from sklearn.metrics import plot_confusion_matrix 6import matplotlib.pyplot as plt 7 8X, y = datasets.make_classification(1000) 9train_x, test_x, train_y, test_y = train_test_split(X, 10 y, 11 test_size=0.2, 12 random_state=42) 13 14lr = LogisticRegression() 15lr.fit(train_x, train_y) 16pred_y = lr.predict(test_x) 17plot_confusion_matrix(lr, test_x, test_y) 18plt.savefig('output/plt.png', dpi=300) 19cm = metrics.confusion_matrix(test_y, pred_y) 20print(cm)
-
第
6行到第10行生成了一个二分类数据集,并将其划分为两部分,其中训练集占整个数据集的 80%。 -
第
12行到第13行创建并训练了一个逻辑回归模型。 -
第
14行使用该模型对测试数据集进行预测。 -
第
15行展示了如何使用confusion_matrix()计算混淆矩阵,需要传入预测结果pred_y(第14行的输出)和真实标签test_y。
F1分数
在二分类任务中,F1 分数(也称 F-score 或 F-measure)是衡量测试准确性的指标之一。它综合考虑了查准率 和查全率 ,F1 是查准率与查全率的调和平均值。
注意:F1 分数常用于权衡查准率与查全率,尤其在数据严重不平衡的情况下非常有用。
你需要使用的函数是 f1_score,只需像下面这样传入真实标签 Y 和预测标签 Y 即可:
1f1 = metrics.f1_score(test_y, pred_y)
1import sklearn.datasets as datasets 2import sklearn.metrics as metrics 3from sklearn.linear_model import LogisticRegression 4from sklearn.model_selection import train_test_split 5 6X, y = datasets.make_classification(1000) 7train_x, test_x, train_y, test_y = train_test_split(X, 8 y, 9 test_size=0.2, 10 random_state=42) 11 12lr = LogisticRegression() 13lr.fit(train_x, train_y) 14pred_y = lr.predict(test_x) 15f1 = metrics.f1_score(test_y, pred_y) 16print(f1)
-
第
6行到第10行生成了一个二分类数据集并划分为训练集和测试集,训练集占比 80%。 -
第
12行到第13行创建并训练了一个逻辑回归模型。 -
第
14行使用模型对测试集进行预测。 -
第
15行展示了如何使用f1_score()计算 F1 分数,需传入预测结果pred_y和真实标签test_y。
AUC
在介绍 AUC 之前,我们先了解 ROC。受试者工作特征曲线(Receiver Operating Characteristic Curve),简称 ROC 曲线,是一种图形化方法,通过改变分类器的判别阈值,展示其在不同阈值下的诊断能力。简而言之,ROC 曲线是在不同阈值下以真阳性率(TPR)为纵轴、假阳性率(FPR)为横轴绘制而成的曲线。
当使用归一化单位时,曲线下面积(Area Under the Curve,常称为 AUC)等于分类器将一个随机选取的正样本排在随机选取的负样本之前的概率。AUC 常被用来衡量分类器性能,尤其是在正负样本比例不平衡的情况下尤为有效。
让我们来看如何获取 AUC。由于 AUC 是 ROC 曲线下的面积,而 ROC 曲线基于 TPR 和 FPR,所以我们需要得到一系列 TPR 和 FPR 值。
1fpr, tpr, thresholds = metrics.roc_curve(test_y, pred_y) 2auc = metrics.auc(fpr, tpr)
同时,sklearn 还提供了绘制 ROC 曲线的函数,如下所示。第一个参数是你想评估的模型,在本例中是逻辑回归模型,然后可以传入测试样本及其对应标签。
1metrics.plot_roc_curve(lr, test_x, test_y)
分类报告
sklearn 提供了一个非常有用的函数 classification_report,用于展示主要的分类指标。
1cr = metrics.classification_report(test_y, pred_y)
1import sklearn.datasets as datasets 2import sklearn.metrics as metrics 3from sklearn.linear_model import LogisticRegression 4from sklearn.model_selection import train_test_split 5 6X, y = datasets.make_classification(1000) 7train_x, test_x, train_y, test_y = train_test_split(X, 8 y, 9 test_size=0.2, 10 random_state=42) 11 12lr = LogisticRegression() 13lr.fit(train_x, train_y) 14pred_y = lr.predict(test_x) 15cr = metrics.classification_report(test_y, pred_y) 16print(cr)
-
第
6行到第10行生成一个二分类数据集并划分为训练集和测试集,训练集占 80%。 -
第
12行到第13行创建并训练了一个逻辑回归模型。 -
第
14行使用模型对测试集进行预测。 -
第
15行展示了如何使用classification_report()输出包括precision(查准率)、recall(查全率)和f1-score在内的分类指标,需传入预测结果pred_y和真实标签test_y。
回归
相比分类任务,回归任务的评估指标较少。MSE 可能是最常用的指标之一。若 表示第 i 个样本的预测值, 表示其真实值,则均方误差(MSE)定义如下:
1mse = metrics.mean_squared_error(test_yr, pred_yr)
以下是完整代码示例,你可以尝试运行:
1import sklearn.datasets as datasets 2import sklearn.metrics as metrics 3from sklearn.linear_model import LinearRegression 4from sklearn.model_selection import train_test_split 5 6Xr, yr = datasets.make_regression(1000) 7train_xr, test_xr, train_yr, test_yr = train_test_split(Xr, 8 yr, 9 test_size=0.2, 10 random_state=42) 11 12lrg = LinearRegression() 13lrg.fit(train_xr, train_yr) 14pred_yr = lrg.predict(test_xr) 15mse = metrics.mean_squared_error(test_yr, pred_yr) 16print("The MSE is {}".format(mse))
-
第
6行到第10行生成一个回归数据集并划分为训练集和测试集,训练集占 80%。 -
第
12行到第13行创建并训练了一个线性回归模型。 -
第
14行使用模型对测试集进行预测。 -
第
15行展示了如何使用mean_squared_error()计算MSE,需传入预测值pred_yr和真实值test_yr。
此外还有其他一些有用的回归指标。你可以通过相关工具打开包含更多详细信息和交互式示例的 Jupyter 文件进一步学习。