你选择用来评估机器学习算法的指标非常重要。
指标的选择影响机器学习算法性能的衡量和比较方式。它们影响你对结果中不同特征重要性的权重分配,以及你最终选择哪种算法。
在这篇文章中,你将学习如何在 Python 中使用 scikit-learn 选择和使用不同的机器学习性能指标。
使用我的新书 《Python 机器学习精通》 **启动你的项目**,其中包括**分步教程**和**所有示例的 Python 源代码文件**。
让我们开始吧。
- 2017年1月更新:更新以反映 scikit-learn 0.18 版本中的 API 变化。
- **2018 年 3 月更新**:添加了下载数据集的备用链接,因为原始链接似乎已被删除。
- **2019 年 11 月更新**:改进了 ROC AUC 的描述。
- **2020 年 8 月更新**:更新了 API 更改。

在 Python 中评估机器学习算法的指标
图片作者:Ferrous Büller,保留部分权利。
关于这些示例
本文通过 Python 和 scikit-learn 中的小段代码示例展示了各种不同的机器学习评估指标。
每个示例都设计为独立运行,你可以将其复制粘贴到你的项目中并立即使用。
这些指标针对分类和回归类型的机器学习问题进行了演示。
- 对于分类指标,使用了 Pima Indians 糖尿病发病数据集进行演示。这是一个二元分类问题,所有输入变量都是数值型的(更新:可在此处下载)。
- 对于回归指标,使用了波士顿房价数据集进行演示。这是一个回归问题,所有输入变量也是数值型的(更新:可在此处下载数据)。
在每个示例中,数据集都直接下载。
所有示例都评估相同的算法:分类使用逻辑回归,回归问题使用线性回归。为了演示每个指标,使用了 10 折交叉验证测试套件,因为这是你最可能采用不同算法评估指标的场景。
这些示例中的一个注意事项是 cross_val_score 函数,它用于报告每个示例的性能。它确实允许使用将要讨论的不同评分指标,但所有分数都被报告为可以按升序排序(最高分数最好)。
一些评估指标(如均方误差)本质上是降序分数(分数越小越好),因此会被 *cross_val_score()* 函数报告为负值。这一点很重要,因为有些分数被报告为负值,而根据定义它们永远不可能为负值。
你可以在 scikit-learn 页面 模型评估:量化预测质量 上了解更多关于 scikit-learn 支持的机器学习算法性能指标。
现在我们来看看评估指标。
需要 Python 机器学习方面的帮助吗?
参加我为期 2 周的免费电子邮件课程,探索数据准备、算法等等(附带代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
分类指标
分类问题可能是最常见的机器学习问题类型,因此有无数的指标可以用来评估这些问题的预测。
在本节中,我们将回顾如何使用以下指标:
- 分类准确率。
- 对数损失。
- ROC 曲线下面积。
- 混淆矩阵。
- 分类报告。
1. 分类准确率
分类准确率是正确预测的数量与所有预测数量之比。
这是分类问题最常见的评估指标,也是最常被误用的指标。它只适用于每个类别中的观测数量相等(这种情况很少见),并且所有预测和预测错误同等重要的情况,而这通常不是事实。
下面是一个计算分类准确率的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 交叉验证分类准确率 import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] kfold = model_selection.KFold(n_splits=10, random_state=7, shuffle=True) model = LogisticRegression(solver='liblinear') scoring = 'accuracy' results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print("Accuracy: %.3f (%.3f)" % (results.mean(), results.std())) |
你可以看到报告了比例。
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
将其乘以 100 即可转换为百分比,得到约 77% 的准确率。
1 |
准确率:0.770 (0.048) |
2. 对数损失
对数损失(或对数误差)是评估对给定类别的成员概率预测的性能指标。
0 到 1 之间的标量概率可以看作是算法预测置信度的度量。正确或不正确的预测会根据预测的置信度按比例进行奖励或惩罚。
有关对数损失及其与交叉熵的关系,请参阅教程。
下面是一个计算 Pima Indians 糖尿病发病数据集上逻辑回归预测的对数损失的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 交叉验证分类对数损失 import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] kfold = model_selection.KFold(n_splits=10, random_state=7, shuffle=True) model = LogisticRegression(solver='liblinear') scoring = 'neg_log_loss' results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print("Logloss: %.3f (%.3f)" % (results.mean(), results.std())) |
对数损失越小越好,0 表示完美的对数损失。
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
如上所述,在使用 *cross_val_score()* 函数时,该度量被反转以便结果呈升序排列。
1 |
对数损失:-0.493 (0.047) |
3. ROC 曲线下面积
ROC 曲线下面积(简称 ROC AUC)是二元分类问题的性能指标。
AUC 表示模型区分正类和负类的能力。面积为 1.0 表示模型做出了所有完美预测。面积为 0.5 表示模型与随机猜测一样好。
ROC 曲线是给定一组概率预测在不同阈值下用于将概率映射到类别标签时的真阳性率和假阳性率的图。曲线下面积是 ROC 曲线下的近似积分。
有关 ROC 曲线和 ROC AUC 的更多信息,请参阅教程。
以下示例演示了如何计算 AUC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 交叉验证分类 ROC AUC import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] kfold = model_selection.KFold(n_splits=10, random_state=7, shuffle=True) model = LogisticRegression(solver='liblinear') scoring = 'roc_auc' results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print("AUC: %.3f (%.3f)" % (results.mean(), results.std())) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
你可以看到 AUC 相对接近 1 且大于 0.5,这表明预测具有一定的技能。
1 |
AUC: 0.824 (0.041) |
4. 混淆矩阵
混淆矩阵是模型在两个或多个类别中准确性的一种便捷表示。
该表在 x 轴上显示预测,在 y 轴上显示准确性结果。表的单元格是机器学习算法所做的预测数量。
例如,机器学习算法可以预测 0 或 1,每个预测实际上可能是 0 或 1。实际为 0 但预测为 0 的预测出现在预测 = 0 和实际 = 0 的单元格中,而实际为 1 但预测为 0 的预测出现在预测 = 0 和实际 = 1 的单元格中。以此类推。
有关混淆矩阵的更多信息,请参阅本教程。
下面是一个计算模型在测试集上进行的一组预测的混淆矩阵的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 交叉验证分类混淆矩阵 import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] test_size = 0.33 X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=7) model = LogisticRegression(solver='liblinear') model.fit(X_train, Y_train) predicted = model.predict(X_test) matrix = confusion_matrix(Y_test, predicted) print(matrix) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
虽然数组是无标题打印的,但你可以看到大多数预测落在矩阵的对角线上(这些是正确的预测)。
1 2 |
[[141 21] [ 41 51]] |
5. 分类报告
Scikit-learn 在处理分类问题时提供了一个便捷的报告,可以让你快速了解模型在使用多种度量时的准确性。
*classification_report()* 函数显示每个类别的精确率、召回率、F1 分数和支持度。
下面的示例演示了二元分类问题上的报告。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 交叉验证分类报告 import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] test_size = 0.33 X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=7) model = LogisticRegression(solver='liblinear') model.fit(X_train, Y_train) predicted = model.predict(X_test) report = classification_report(Y_test, predicted) print(report) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
你可以看到算法的良好预测和召回率。
1 2 3 4 5 6 |
精确度 召回率 F1 分数 支持度 0.0 0.77 0.87 0.82 162 1.0 0.71 0.55 0.62 92 平均/总计 0.75 0.76 0.75 254 |
回归指标
在本节中,我们将回顾 3 个最常用的回归机器学习问题预测评估指标:
- 平均绝对误差。
- 均方误差。
- R^2。
1. 平均绝对误差
平均绝对误差(MAE)是预测值与实际值之间绝对差值的平均值。它提供了预测误差大小的 ধারণা。
该度量提供了误差大小的概念,但没有提供方向的概念(例如,过高或过低预测)。
你可以在维基百科上了解更多关于 平均绝对误差 的信息。
以下示例演示了如何计算波士顿房价数据集上的平均绝对误差。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 交叉验证回归 MAE import pandas from sklearn import model_selection 来自 sklearn.linear_model 导入 LinearRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = model_selection.KFold(n_splits=10, random_state=7, shuffle=True) 模型 = LinearRegression() scoring = 'neg_mean_absolute_error' results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print("MAE: %.3f (%.3f)" % (results.mean(), results.std())) |
值为 0 表示没有误差或完美预测。
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
与对数损失一样,此度量被 *cross_val_score()* 函数反转。
1 |
MAE:-4.005 (2.084) |
2. 均方误差
均方误差(MSE)与平均绝对误差非常相似,因为它提供了误差大小的粗略概念。
对均方误差取平方根,可以将单位转换回输出变量的原始单位,这对于描述和表示可能是有意义的。这称为均方根误差(RMSE)。
你可以在维基百科上了解更多关于 均方误差 的信息。
以下示例演示了如何计算均方误差。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 交叉验证回归 MSE import pandas from sklearn import model_selection 来自 sklearn.linear_model 导入 LinearRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = model_selection.KFold(n_splits=10, random_state=7, shuffle=True) 模型 = LinearRegression() scoring = 'neg_mean_squared_error' results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print("MSE: %.3f (%.3f)" % (results.mean(), results.std())) |
该指标也被反转,以便结果呈递增趋势。
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
如果你对计算 RMSE 感兴趣,请记住在取平方根之前取绝对值。
1 |
MSE: -34.705 (45.574) |
3. R^2 指标
R^2(或 R 平方)指标提供了预测集与实际值拟合优度的一个指示。在统计文献中,此度量称为决定系数。
这是一个介于 0 和 1 之间的值,分别表示不拟合和完美拟合。
你可以在维基百科上的 决定系数 文章中了解更多信息。
以下示例演示了如何计算一组预测的平均 R^2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 交叉验证回归 R^2 import pandas from sklearn import model_selection 来自 sklearn.linear_model 导入 LinearRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = model_selection.KFold(n_splits=10, random_state=7, shuffle=True) 模型 = LinearRegression() scoring = 'r2' results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print("R^2: %.3f (%.3f)" % (results.mean(), results.std())) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,你的 结果可能会有所不同。考虑运行示例几次并比较平均结果。
你可以看到预测与实际值的拟合度很差,值接近于零且小于 0.5。
1 |
R^2: 0.203 (0.595) |
总结
在这篇文章中,你了解了可用于评估机器学习算法的指标。
你学习了 3 个分类指标:
- 准确率。
- 对数损失。
- ROC 曲线下面积。
还有 2 种用于分类预测结果的便捷方法:
- 混淆矩阵。
- 分类报告。
以及 3 个回归指标:
- 平均绝对误差。
- 均方误差。
- R^2。
关于评估机器学习算法的指标或本文,你有什么问题吗?在评论中提出你的问题,我将尽力回答。
你说的 model_selection 是什么意思?
你可以在这里了解 sklearn.model_selection API:
https://scikit-learn.cn/stable/modules/classes.html#module-sklearn.model_selection
你必须安装 sklearn 0.18.0 或更高版本。
你好,Jason
感谢这个教程,但我有一个关于计算 AUC 的问题。
我正在使用不平衡类别进行二元分类,然后计算 AUC,但我有一个问题。我正在使用 Keras。
我计算 AUC 的方法如下:
1. 训练模型并保存它 - 第一个 python 脚本
2. 加载模型和模型权重 - 第二个 python 脚本
3. 加载一张图片(循环)并将结果保存到 csv 文件 - 第二个 python 脚本
4. 使用 sklearn 的 roc_auc_score
在第三点,我正在加载图像,然后我使用 predict_proba 获取结果。结果总是在 0-1 之间,但我应该使用 predict_proba 吗?这个方法来自 http://stackoverflow.com/questions/41032551/how-to-compute-receiving-operating-characteristic-roc-and-auc-in-keras
Eka 解决方案。
看起来不错,我建议使用 predict_proba(),我预计它会规范化任何 softmax 输出,以确保值加起来为一。
Jason,
我是长期读者,首次发文。我目前正在为如何选择适合当前项目的模型性能指标而烦恼。让我提供一些背景信息。
我有一个分类模型,我真的希望最大化我的召回结果。原因是,如果我说某物是 1 而它不是 1,我会损失大量时间/金钱,但如果我说某物是 0 而它不是 0,我根本不会损失太多时间/金钱。也就是说,我希望减少假阴性。此外,我训练集中因变量的分布严重偏向于 0,我的训练集中所有因变量中只有不到 5% 是 1。通常我会使用 F1 分数、AUC、VIF、准确率、MAE、MSE 或许多其他已讨论的分类模型指标,但我现在不确定该使用什么。目前我使用 LogLoss 作为我的模型性能指标,因为我发现有文档表明在因变量偏斜以及主要关注召回而不关心精确率或反之亦然的情况下,这是正确的指标。我从 Kaggle 论坛上的人那里获得了这些信息。
感谢你的专业意见,我非常感谢你的帮助。如果你没有时间回答这样的问题,我也会理解。
你好 Evy,感谢你长期阅读我的文章。
我建议你调整模型,并只关注召回率统计数据。
我还建议使用以概率形式进行预测的模型,并调整概率阈值以优化召回率(ROC 曲线可以帮助理解这一点)。
希望这些能作为一个开始有所帮助。
嗨,Jason,
感谢您精彩的文章,我只有一个关于 MSE 及其属性的问题。在构建线性模型时,添加特征应该总是会降低训练数据中的 MSE,对吗?
只是,当我使用 SciKit 中的多项式特征方法并拟合线性回归时,MSE 不一定下降,有时它会随着我添加特征而上升。
这是因为 MSE 指标的一些固有属性,还是仅仅因为我的代码中存在错误?
据我所知,增加特征并不能保证降低 MSE。你是从哪里听说的?
你好。我住在巴西,经常阅读您的帖子。我有一个 LSTM 循环神经网络,正在使用 Twitter 数据集进行二元分类。我正在使用准确率来评估我的模型。您能建议其他评估我的模型的方法吗?我正在使用 Keras 和 Python。如果您能给我一个示例,我将不胜感激。
这真的取决于你的具体问题。
例如,如果你正在对推文进行分类,那么准确率可能是有意义的。如果你正在预测单词,那么 BLEU 或 ROGUE 可能是有意义的。
嗨,Jason,
我认为 Jeppe 的意思是,通过增加特征,我们增加了模型的复杂性,因此我们正朝着过拟合的方向发展。
现在在过拟合模型中,预测数据点将更接近实际数据点,因此 MSE 应该会下降。
顺便说一句,我也这么认为……:/
我不同意。
更多特征可以更好地揭示问题结构,从而获得更好的拟合。模型可能会过拟合,也可能不会,这是一个正交的担忧。
嗨,Jason,
感谢您的文章。非常有帮助!我现在正在使用 Python SciKit Learn 训练一个不平衡数据集。我正在寻找一个已经嵌入 Python SciKit Learn 中,适用于评估模型在预测不平衡数据集方面的性能的良好指标。您有什么建议或想法吗?或者,我知道一个判断标准,平衡错误率 (BER),但我不知道如何在 Python 中将其用作评分参数?
非常感谢!
程
很好的问题。
这篇文章可能会给你一些想法。
https://machinelearning.org.cn/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
嗨,Jason,
我对评估回归问题的指标仍有一些困惑。在交叉验证的 cross_val_score 中,最终结果是负均方误差和负平均绝对误差,这到底是什么意思?(这意味着模型表现不佳,还是说模型可以最小化这些指标的好迹象?)
此外,我使用了一些回归方法,它们在测试部分返回了非常好的结果,例如 R_squared = 0.9999 和非常小的 MSE、MSA。然而 cross_val_score 的结果是 1.00 ± 00,这是否意味着模型过拟合了?
所以总的来说,我认为当我们使用 cross_val_score 评估回归模型时,我们应该选择 MSE 和 MSA 最小的模型,这正确吗?
非常感谢您的回答,这将对我帮助很大。
好问题。
一般来说,分数的解释是针对具体问题而定的。一个好的分数实际上只相对于你可以用其他方法实现的分数。
选择模型取决于你的应用,但一般来说,你希望选择最简单的模型,它能提供最佳的模型技能。
嗨,Jason,
我最近读了一些文章,它们完全反对使用 R^2 来评估非线性模型(例如在机器学习算法的情况下)。鉴于这仍然是常见的做法,您对此有何看法?
谢谢
我建议使用几个指标,并在您的具体问题背景下解释它们。
我确实觉得 R^2 很有用。
如何为机器学习问题选择正确的指标?
你需要一个最能捕捉你在特定问题上希望优化的指标。
也许你需要与领域专家交流。也许你需要尝试一些指标并向利益相关者展示结果。这可能是一个迭代过程。
CA 如何依赖于“random_state”的值?
请看这篇文章
https://machinelearning.org.cn/randomness-in-machine-learning/
Jason,
损失函数和评估指标之间有什么区别?损失函数 = 评估指标 - 正则化项?
Kono
很好的问题。
损失函数在拟合模型时被最小化。
损失函数得分可以作为模型技能报告,例如作为评估指标,但并非必须如此。
正则化项是对损失函数的修改,旨在惩罚复杂模型,例如,以获得更简单、通常更好/更熟练的结果模型。
这有帮助吗?
@Jason,谢谢!非常有帮助!
不客气!
嗨,Jason,
我有一个问题。我不想在标准配置中使用 MSE,而是想使用带样本权重的 MSE,其中每个数据点基本上都会得到不同的权重(它是原始数据框中的一个单独列,但显然不是训练模型的特征)。我如何将这些样本权重纳入评分函数中?
好问题,我相信权重的处理将是特定于算法的。
例如,谷歌指向 SVM 的这个例子:
https://scikit-learn.cn/stable/auto_examples/svm/plot_weighted_samples.html
您的博客又一篇很棒且有帮助的文章。万分感谢!
谢谢。
在一般情况下,我看到当类别重叠时,敏感性和特异性之间存在权衡 [1]。
— 我如何使用 Python 算法找到两个值都高的最佳点?
— 假设类别平衡,分类器是否会在这一点上给出最高的准确率?
提前感谢
[1] https://www.youtube.com/watch?v=vtYDyGGeQyo
你可能需要研究 ROC 曲线和模型校准。
嗨,Jason,
我很想看到一篇关于无监督学习算法指标的类似文章。
就我而言,我只知道调整兰德指数是其中一个指标。
感谢您的建议。
嗨,Jason,
感谢您对这些指标的详细解释。不过,我有一个关于我的问题。我有一个二元分类问题,我对负类和正类预测的准确率都感兴趣,而且负类的实例数量大于正类。
1) 在这种情况下,使用“roc_auc”或“f1-score”指标来优化分类器的准确率会更好吗?
2) 使用类别预测还是概率预测会更好?在后一种情况下,如何优化分类器的校准?
提前感谢您的帮助!
好问题,也许这篇文章会有帮助
https://machinelearning.org.cn/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
谢谢 Jason,一如既往地非常有用的信息!这些测试中哪一个也适用于非线性学习算法?或者您是否知道任何可能有助于回答此问题的信息来源?例如,使用 rbf 核的 SVC 产生的结果?
它们都适用于线性和非线性方法。
嘿,Jason
MSE 和 MAE 是否仅用于比较相同数据集的模型?我问这个问题的原因是,我使用自回归从 t = 0s 到 t = 50s 的传感数据,然后使用自回归参数预测从 t = 50s 到 t = 100s 的时间序列数据。这些值非常小,因此我得到了小的 MSE 和 MAE 值,但这并没有真正意义。有没有办法获得预测的绝对分数,MSE 和 MAE 似乎高度依赖于数据集的量级,我只能将它们视为比较相同数据集模型的方法。
也许你可以将数据重新缩放到 [0-1] 范围,然后再进行建模?
亲爱的 Jason,
感谢您提供的信息丰富的帖子。
对于具有两个以上潜在值的分类变量,如何计算其准确率和 F 分数?
我有一个数据集,包含变量(人口类别、建筑类型、总楼层数)。建筑类型可能的值为(住宅、商业、工业、特殊建筑),人口类别为(高、中、低),总楼层数是一个数值变量,其值范围从 1 到 35。在训练数据后,我想预测“人口类别”。我将 SVM 应用于数据集。如何计算我的情况下的准确率和 F 分数?准确率和 F 分数对于具有多个值(高、中、低)的分类变量来说是一个好的指标吗?我通过评估具有两个以上潜在值(高、中、低)的分类变量(人口类别)的分类是否做对了?如果任何变量是序数变量,是否应该应用与二元变量相同的指标和分类算法来预测?
使用像对数损失这样的度量可能会更容易。
嗨,Jason
我有一个问题,在网上找不到好的答案。这篇文章也没有提及。
我使用 R^2 作为评估回归模型的指标。它在哪个范围内可以表示这是一个好模型?
例如:
R^2 >= 90%:完美
R^2 >= 80%:非常好
R^2 >= 70%:好
R^2 >= 60%:差
R^2 <= 60%:垃圾
非常感谢。
好问题,我在统计学的“效应量”书籍中见过类似的表格。
尝试在 Google/Google Books/Google Scholar 上搜索。
希望这能有所帮助。
非常感谢 Jason。
很高兴它有帮助。
嗨,Jason,
我正在处理一个不平衡数据集的分类问题。我使用召回率/精确率和混淆矩阵作为我的评估指标。最初在我的数据集中,类别“1”与类别“0”的观测比例为 1:7,因此我使用 SMOTE 上采样训练集中的少数类别,使比例变为 3:5(即 60% 的类别“1”观测)。
在验证集上,我得到以下指标:
在概率阈值:0.3
召回率:0.79
精确率:0.54
f1 分数:0.64
AUC 分数:0.845674177201395
在测试集上,我得到以下指标:
使用默认 .predict() 阈值,我得到:
召回率:0.91
精确率:0.45
f1 分数:0.60
但在概率阈值:0.7 时,我在测试集上得到以下结果:
召回率:0.8
精确率:0.61
f1 分数:0.69
AUC 分数:0.8
我的问题是:为了获得最佳召回率/精确率分数,测试集选择与训练/验证集不同的阈值是否可以?
另外,您能否建议在保持召回率的同时提高精确率的选项。
谢谢,
ND
不,阈值必须在验证集上选择,并在测试集上使用。
当使用测试集时,我们假设我们不知道答案,我们得到的结果就是我们得到的结果。
谢谢 Jason。您能推荐一些选项来探索,以便在保持召回分数的同时提高不平衡数据集机器学习模型的精确分数吗?
感谢您的博客。我参考了其中的一些,它们对构建我的机器学习代码非常有帮助。
ND
你可以使用精确率-召回率曲线并调整阈值。
大家好……我正在尝试使用感知器标记器实现的 pos_tag 函数来标记文本的词性。标记文本后,我想计算输入与任何语料库(无论是 brown 还是 conll2000 或 tree bank)的准确率。如何找到该准确率??有人能帮我解决这个问题吗……
抱歉,我没有词性标注的教程。
嗨,Jason,
感谢您清晰的解释。
本页讨论了分类和回归问题。我正在处理一个分割问题,即从遥感图像中分类土地覆盖。您认为这种情况的最佳评估指标是什么?
我很难说。一些想法:
与利益相关者交流,弄清楚评估模型技能的最重要方式是什么?
查阅文献,看看在类似问题中使用了哪些类型的指标?
尝试几个指标,看看它们是否捕捉到了重要内容?
@Claire:我也面临着类似的情况,因为我正在使用 SAR 图像进行分割。你有没有找到一些用于分割部分(特别是在遥感图像分割领域)的评估指标?
谢谢你。
嗨,Jason,
我正在处理一个多变量回归问题。我可以使用哪些回归指标进行评估?
提前感谢!
也许每个变量的 RMSE?
你好 Jason,又是我。-34.705 (45.574),括号里的值是什么?谢谢!
多次运行的标准差。
我们如何通过数组打印多个模型的分类报告?
使用 for 循环并遍历模型,为每个所需的报告调用 print()。
是否可以使用 cross_val_score 函数绘制 ROC 曲线?因为我看到很多例子都是使用 for 循环而不是使用该函数。
我想不行,曲线是针对单一预测集的。通过 CV,我想你会有 k 条曲线。
如何使用 cross_val_score 函数获取每个类别(如果是二元,则为类别 0 和类别 1)的性能?
谢谢。
你可以使用混淆矩阵
https://machinelearning.org.cn/confusion-matrix-machine-learning/
那么,如果你的分类问题中的类别是序数呢?例如,对衬衫尺码进行分类,但有 XS、S、M、L、XL、XXL。准确率或 ROC 曲线不能说明全部真相……MAE 或 MSE 是否更有意义?
或许吧。可能需要一些案例/测试才能确定一个对项目有意义的性能衡量标准。
嘿,我有一个问题
我们如何从回归模型的 RMSE 值计算准确率、灵敏度、精确率和特异性?请帮忙
你无法计算回归问题的准确率,我在这里解释得更清楚。
https://machinelearning.org.cn/classification-versus-regression-in-machine-learning/
嗨,Jason,
感谢您的这类帖子和评论!
我正在处理一个横截面数据集的回归问题。我正在使用 RMSE 和 NAE(归一化绝对误差)。
如果您能回答以下问题,将非常有帮助:
— 我们如何解释 NAE 的值并根据它们比较性能(我知道越小越好,但我的意思是相对于平均值的解释)?
我得到了不同模型的 NAE 值:
模型 1:0.629
模型 2:1.02
模型 3:0.594
模型 4:0.751
— 使用 RMSE 和 NAE 时排名不同的原因可能是什么?
提前感谢您!
将所有结果与天真基线进行比较,例如,比较是相对的。
抱歉,我从没听说过 NAE。
感谢您的宝贵信息。只有一个问题:
— 我们如何才能在部署后持续评估(测试)机器学习模型?
好问题,我这里有一些建议
https://machinelearning.org.cn/deploy-machine-learning-model-to-production/
先生,
线性回归、逻辑回归、决策树、随机森林、SVM、朴素贝叶斯、KNN 等等所有输入变量的类别应该是什么(数值型或类别型)?
我没听懂,你具体是什么意思?
例如,对于线性回归,我们的预测变量(自变量)应该是数值型的,因此我们的目标变量(因变量)也应该是数值型的。
同样,我想了解其他模型。
当然,你可以从这里开始:
https://machinelearning.org.cn/start-here/#algorithms
你好 Jason,
一如既往,你的帖子是金矿。 🙂
你写道:
“平均绝对误差(或 MAE)是预测值与实际值之间绝对差的总和。它能让你了解预测的错误程度。”
我猜你忘了提到“总和……除以观测值数量”或将“总和”替换为“平均值”
祝好,Gilles。
是的,谢谢。已修正。
你好,如何使用度量评估算法比较最小生成树算法、最短路径算法和旅行商问题。
也许是基于在一系列难度递增的虚构问题中发现的最小距离?
你好,不错的博客 🙂。你能推荐一些关于机器学习和深度学习中不同类型错误度量的综述文章吗?谢谢
谢谢。
也许这会有帮助。
https://machinelearning.org.cn/custom-metrics-deep-learning-keras-python/
还有这个。
https://machinelearning.org.cn/how-to-choose-loss-functions-when-training-deep-learning-neural-networks/
你好 Jason,很棒的帖子!我是一名生物学家,在一个团队中开发基于图像的机器学习算法,用于同时分析多个参数的细胞行为。对我来说,展示我们的算法是否能很好地完成其预期任务最“合乎逻辑”的方式是使用分类准确率。然而,非生物学家认为我们应该为此目的使用 R 平方值。我们如何决定使用哪个最佳度量,以及:对于这种类型的数据,当我们希望大多数受众了解我们的算法有多么惊人时,最常用的度量是什么?谢谢。
很好的问题。
没有简单的答案。
你必须从模型中重视什么以及如何衡量它开始。这可能需要采用该领域的最佳实践,或者与许多专家交流并进行深入思考。
有时,选择一个度量来选择模型,然后选择另一个度量来展示模型会很有帮助,例如,在验证数据集上最小化损失,然后在测试集上使用分类准确率。
希望这能有所帮助。
谢谢 Jason,
如何同时打印回归的三个度量。我不想进行三次 cross_val_score。
谢谢
抱歉,我不明白。你具体是什么意思?
另外,你认为平均绝对百分比误差(MAPE)https://en.wikipedia.org/wiki/Mean_absolute_percentage_error 作为回归模型准确性的报告方式如何。作为结果报告听起来不像是学术方法,因为它更容易解释,而 MAE 给出大数字,例如 150,因为我的数据集中 y 值通常 >1000。谢谢
很好。
嗨,Jason,
一个令人惊叹且有用的内容……我有一个问题,我正在应用深度神经网络,如 LSTM、BILSTM、BIGRU、GRU、RNN 和 SimpleRNN,所有这些模型在数据集上都给出相同的准确率,即
LSTM = 93%,BILSTM= 93%,BIGRU= 93%,GRU= 93%,RNN= 93%,SimpleRNN= 93%。
我想知道为什么会这样。请问您能指导我解决这个问题吗。提前感谢。
也许问题很简单?
也许 RNN 不适合你的问题?
也许模型需要调整?
也许数据需要不同的准备?
…
你好,Jason
嗨!
感谢你的好文章,我想知道如何使用 yellowbrick 模块进行多类分类,使用一个模块中不存在的特定模型,即我们自己的模型
谢谢
“yellowbrick 模块”是什么?
假设我已经为同一个数据集训练了两个分类模型。我怎么知道哪个模型最好?如何选择哪个度量?
在保留数据集上进行评估,并选择具有最佳技能和最低复杂度的那个——具体取决于你的项目中最重要的是什么。
我们如何计算不同 k-fold 值的分类报告?
我们不这样做。
你好,先生,我一直在关注你的网站,它信息量很大。感谢你的努力。
我的问题是,我们使用 log_loss 作为真实标签和预测标签的参数,对吗?
在这里你使用 kfold 方法
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LogisticRegression()
scoring = ‘neg_log_loss’
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
Y 是真实标签或目标,X 是数据点。那么我们如何使用模型预测的概率值来计算 log_loss 值呢?
log_loss 不应该根据预测概率值计算吗???
cross_val_score 会为每个交叉验证折叠拟合模型,进行预测并为我们评分。
好的,谢谢先生!
你好 Jason,
下面是我的即时检查中多类分类报告的样本输出。我有几个问题想了解即时检查模型的分类评估指标。
1. 类 2 的精确率和召回率之间存在谐波平衡,因为它们约为 50%
2. 以类 1 为例:它只能正确预测其 22% 的数据(召回率为 0.22)?
3. 总体而言,普遍的看法是这个模型“不好”,但比随机猜测(33%)好?
每个类的数据集计数:({2: 11293, 0: 8466, 1: 8051})
准确率:0.41
分类报告
精确率 召回率 f1分数 支持数
0 0.34 0.24 0.28 2110
1 0.35 0.22 0.27 1996
2 0.46 0.67 0.54 2846
准确率 0.41 6952
宏平均 0.38 0.38 0.37 6952
加权平均 0.39 0.41 0.39 6952
很好的问题。谐波平均数比算术平均数更复杂
https://machinelearning.org.cn/arithmetic-geometric-and-harmonic-means-for-machine-learning/
我推荐这个教程来帮助将 F1 分解为精确率和召回率
https://machinelearning.org.cn/fbeta-measure-for-machine-learning/
哇,谢谢!这不仅帮助我更深入地理解了最适用于我的分类问题的指标,而且现在我也可以回答问题 3 了。 🙂
谢谢,很高兴听到这个!
还有一个问题:根据上面定义的分类报告和其他指标,这是否意味着即时检查的模型将更倾向于预测类别 2 而非类别 0 和 1?谢谢。
在一个项目中,你应该首先选择最能体现项目目标的指标,然后仅根据该指标选择模型。
这将帮助你选择一个指标
https://machinelearning.org.cn/tour-of-evaluation-metrics-for-imbalanced-classification/
对于非线性多输出回归,最佳评估指标是什么?
最能捕捉你项目目标的那个。
我认为 sklearn 进行了一些更新,因为我无法运行此页面上的任何代码
/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_split.py:296: FutureWarning: Setting a random_state has no effect since shuffle is False. This will raise an error in 0.24. You should leave random_state to its default (None), or set shuffle=True.
FutureWarning
/usr/local/lib/python3.6/dist-packages/sklearn/linear_model/_logistic.py:940: ConvergenceWarning: lbfgs failed to converge (status=1)
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in
https://scikit-learn.cn/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options
https://scikit-learn.cn/stable/modules/linear_model.html#logistic-regression
extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)
/usr/local/lib/python3.6/dist-packages/sklearn/linear_model/_logistic.py:940: ConvergenceWarning: lbfgs failed to converge (status=1)
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
_____等等
TypeError Traceback (most recent call last)
in ()
14 scoring = ‘accuracy’
15 results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
—> 16 print(“Accuracy: %.3f (%.3f)”) % (results.mean(), results.std())
TypeError: unsupported operand type(s) for %: ‘NoneType’ and ‘tuple
谢谢,我已经更新了代码示例以适应 API 的更改。
谢谢!顺便说一下,cross_val_score 链接已损坏(“这些食谱中的一个警告是 cross_val_score 函数”)
谢谢,已修复!
供参考,我运行了第一段代码,从 1. 分类准确率开始,仍然得到一些错误
准确率:%.3f (%.3f)
—————————————————————————
TypeError Traceback (most recent call last)
in ()
14 scoring = ‘accuracy’
15 results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
—> 16 print(“Accuracy: %.3f (%.3f)”) % (results.mean(), results.std())
TypeError: % 的操作数类型不受支持:'NoneType' 和 'tuple'
哦,抱歉!也修复了。
没关系,很高兴能帮上忙!
嗨,如何获得自编码器的预测准确率?
通常我们不对自编码器使用准确率。我们会使用重构误差。
亲爱的 Jason,
我有一个多类别分类数据集。我用几层简单的密集网络训练了它,并使用了 softmax 层和分类交叉熵损失。
该模型在打印混淆矩阵和测试数据的 Kappa 分数(0.92)时给出了良好的结果。
但我不确定在训练模型时是否使用了正确的指标。我在编译模型时使用了 metrics = ["accuracy"]。由于它是一个类别不平衡的多类别数据集,我是否应该使用 Kappa 分数而不是准确率,以便在每次迭代中以 Kappa 分数而不是准确率来查看模型的性能。有什么方法可以在 Keras 中实现这一点吗?
选择指标很困难,这些建议可能会有所帮助
https://machinelearning.org.cn/tour-of-evaluation-metrics-for-imbalanced-classification/
对于有许多类的多类分类,我更喜欢混淆矩阵而不是单个数字
https://machinelearning.org.cn/confusion-matrix-machine-learning/
对于少量类且平衡合理的情况,准确率和 Kappa 非常好。
嗨,Jason;
我正在开发一个用于预测的线性回归ANN模型。我使用了MSE和MAE作为指标,但我的同行评审员建议在模型性能评估中使用U因子……我该如何着手?
提前感谢
什么是U因子?
U_质量和 U_准确率
抱歉,没听说过这些。
布朗利教授你好
我正在进行多元线性回归,如何为每一行获取 R²。
谢谢您。
您好……以下是一个很好的起点
https://www.bmc.com/blogs/mean-squared-error-r2-and-variance-in-regression-analysis/