终于有人把准确率、精度、召回率、均方差和R²都讲明白了
在真实场景中,模型很少能成功地预测所有的内容。我们知道应该使用测试集的数据来评估我们的模型。但是这到底是如何工作的呢?
accuracy_score:准确率(accuracy)计算测试集中预测正确的数据点数,并返回正确预测的数据点的比例。以将图片分类为猫或狗为例,准确率表示正确分类为包含猫或狗的图片比例。该函数是最基本的分类器评分函数。 precision_score:精度(precision)描述了一个分类器不把包含狗的图片标记为猫的能力。或者说,在分类器认为测试集所有包含猫的图片中,精度是实际包含一只猫的图片比例。 recall_score:召回率(recall,或者敏感度)描述了一个分类器检索包含猫的所有图片的能力。或者说,测试集所有包含猫的图片中,召回率是正确识别为猫的图片比例。
import numpy as np
np.random.seed(42)
y_true = np.random.randint(0, 2, size=5)y_true
array([0, 1, 0, 0, 0])
在文献中,这两类有时也被称为正样例(类标签是1的所有数据点)和负样例(其他所有数据点)。
y_pred = np.ones(5, dtype=np.int32)y_pred
array([1, 1, 1, 1, 1], dtype=int32)
test_set_size = len(y_true)
predict_correct = np.sum(y_true == y_pred)
predict_correct / test_set_size
0.2
from sklearn import metrics
metrics.accuracy_score(y_true, y_pred)
0.2
在统计学假设检验中,假阳性也称为I型错误,而假阴性也称为II型错误。
truly_a_positive = (y_true == 1)
predicted_a_positive = (y_pred == 1)
# You thought it was a 1, and it actually was a 1true_positive = np.sum(predicted_a_positive * truly_a_positive)true_positive
1
# You thought it was a 1, but it was actually a 0false_positive = np.sum((y_pred == 1) * (y_true == 0))false_positive
4
# You thought it was a 0, but it actually was a 1false_negative = np.sum((y_pred == 0) * (y_true == 1))false_negative
0
# You thought it was a 0, and it actually was a 0true_negative = np.sum((y_pred == 0) * (y_true == 0))true_negative
0
accuracy = np.sum(true_positive + true_negative) / test_set_sizeaccuracy
0.2
precision = np.sum(true_positive) / np.sum(true_positive + false_positive)precision
0.2
metrics.precision_score(y_true, y_pred)
0.2
recall = true_positive / (true_positive + false_negative)recall
1.0
metrics.recall_score(y_true, y_pred)
1.0
mean_squared_error:对于回归问题,最常用的误差评估指标是对训练集中每个数据点的预测值和真实目标值之间的平方误差(所有数据点的平均值)进行度量。 explained_variance_score:一个更复杂的评估指标是度量一个模型对测试数据的变化或分配的可解释程度。通常使用相关系数度量可释方差的数量。 r2_score:R2得分(R平方)与可释方差得分密切相关,但使用一个无偏方差估计。它也被称为决定系数(coefficient of determination)。
x = np.linspace(0, 10, 100)
y_true = np.sin(x) + np.random.rand(x.size) - 0.5
y_pred = np.sin(x)
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
plt.figure(figsize=(10, 6))plt.plot(x, y_pred, linewidth=4, label='model')plt.plot(x, y_true, 'o', label='data')plt.xlabel('x')plt.ylabel('y')plt.legend(loc='lower left')
<matplotlib.legend.Legend at 0x7f3c2220f048>
mse = np.mean((y_true - y_pred) ** 2)mse
0.08531839480842378
metrics.mean_squared_error(y_true, y_pred)
0.08531839480842378
fvu = np.var(y_true - y_pred) / np.var(y_true)fvu
0.163970326266295
fve = 1.0 - fvufve
0.836029673733705
metrics.explained_variance_score(y_true, y_pred)
0.836029673733705
r2 = 1.0 - mse / np.var(y_true)r2
0.8358169419264746
metrics.r2_score(y_true, y_pred)
0.8358169419264746
metrics.r2_score(y_true, np.mean(y_true) * np.ones_like(y_true))
0.0
关于作者:阿迪蒂亚·夏尔马(Aditya Sharma),罗伯特·博世(Robert Bosch)公司的一名高级工程师,致力于解决真实世界的自动计算机视觉问题。曾获得罗伯特·博世公司2019年人工智能编程马拉松的首名。
赞 (0)