性能指标是机器学习的一部分,他们会告诉你是否取得了进展给予你反馈,并给出一个数字。所有的机器学习模型,无论是线性回归,还是像Chatgpt,都需要一个衡量性能的指标。
回归指标
回归模型具有连续输出。因此,我们需要一个基于计算预测和实际值之间某种距离的度量。
为了评估回归模型,我们将详细讨论这些指标:
- 平均绝对误差Mean Absolute Error (MAE),
- 均方误差Mean Squared Error (MSE),
- 均方根误差Root Mean Squared Error (RMSE),
- R² (R-Squared).(通过计算这两个平方差和,我们可以得到一个范围在0到1之间的R²值。R²值越接近1,表示模型对数据的解释能力越强,拟合效果越好;R²值越接近0,表示模型的拟合效果较差,未能解释数据的大部分变异。)
均方误差 Mean Squared Error (MSE)
本质上是找到目实际值和回归模型预测值之间的平方差的平均值
- y_j: 实际值
- y_hat: 预测值
- N: 总样本数
关于MSE有几点需要强调:
1.是可微分的,因此可以做更多的优化。
2.平方后数值变大,使得模型容忍度降低,高估模型的“烂”度。
3.平方使得相对于其他指标易于出现异常值。
可以用python代码复现此算法
mse = (y-y_hat)**2
print(f"MSE: {mse.mean():0.2f} (+/- {mse.std():0.2f})")
平均绝对误差 Mean Absolute Error (MAE)
本质上是找到目实际值和回归模型预测值之间的平均值
- y_j: 实际值
- y_hat: 预测值
- N: 总样本数
关于MSE有几点需要强调:
1.它对异常值比MAE更稳健,因为它不会夸大错误。
2.为我们提供了一个衡量预测与实际产出之间差距的指标。然而,由于MAE使用残差的绝对值,它并不能让我们知道误差的方向,即我们是低估还是高估了数据。
3.MAE是不可微的,而MSE是可微的(在mae中绝对值操作使得误差项可以取正值或负值,而绝对值函数在零点处不可导),MSE的可微性使得它在梯度下降等优化算法中更容易处理。
4.使用MAE评价模型误差时,不需要进行额外的思考或转换,因为它与目标变量的原始量纲一致。
- MAE计算的是预测值与真实值之间的绝对误差。
- 而目标变量本身具有一个原始的量纲,例如房价预测任务中的价格是以美元计的。
- MAE的计算结果直接以这个原始量纲(美元)表达。
这样的好处是:
- MAE的误差值可以直接反映目标变量的原始量纲,方便理解其意义。
- 不需要进行额外的转换或标准化来解释误差。
- 误差值的意义更直观,无需二次推理。
相比而言,MSE或RMSE由于平方操作,其量纲与原目标变量不一致,需要进行换算后才能理解误差的实际大小。
对应代码如下:
mae = np.abs(y-y_hat)
print(f"MAE: {mae.mean():0.2f} (+/- {mae.std():0.2f})")
均方根误差 Root Mean Squared Error (RMSE)
本质是实际值与回归模型预测的值之间的平方差的平均值的平方根
- y_j: 实际值
- y_hat: 预测值
- N: 总样本数
这个就是mse的平方根而已,但是巧妙地将mse取其精华去其糟粕
体现在以下几点:
1.保留了MSE的可微性
2.它通过平方根处理MSE所做的较小错误的惩罚
3.由于标度现在与随机变量相同(量纲相同),误差解释可以顺利完成。
4.由于标度因子基本上是标准化的,因此在异常值的情况下不太容易出现问题。
对应算法代码如下:
mse = (y-y_hat)**2
rmse = np.sqrt(mse.mean())
print(f"RMSE: {rmse:0.2f}")
R平方决定系数(R² Coefficient of determination)
R²决定系数实际上是一个后度量,这意味着它是一个使用其他度量计算的度量。
甚至计算这个系数的目的是回答“Y(目标)的总变化有多少(百分之几),是由X(回归线)的变化来解释的。
1.求y的总平方差变化
2.回归值变化的总百分比,SE(line)代表预测值与实际值的均方差
3.
代码如下:
SE_line = sum((y-y_hat)**2)
SE_mean = sum((y-y.mean())**2)
r2 = 1-(SE_line/SE_mean)
print(f"R^2 coefficient of determination: {r2*100:0.2f}%")
功能:
1.如果回归线的平方误差之和很小=>R²将接近1(理想),这意味着回归能够捕获目标变量中100%的方差。相反,如果回归线的平方误差之和很高=>R²将接近0,这意味着回归无法捕捉目标变量的任何方差,有的人可能认为R²的范围是(0,1),但实际上是(-∞,1),因为如果回归线的平方误差太高(>平均值的平方误差),回归线的误差与平均值的比值可能会超过1。
修正R² Adjusted R²
原始的R2值存在一些问题,当R2值上升时,可能让人误认为模型效果正逐步改善,但实际上模型并没有真正学到有效的知识,这主要出现在模型过拟合的情况。
例如,当模型对训练集过度拟合时,R2值可以达到100%,说明模型可以完全拟合训练数据,但这并不意味着模型就可以很好地推广到测试集上。模型只是机械记忆了训练数据而没有真正学习到有用的知识。
为了纠正这一问题,有了调整后的R2(Adjusted R-squared)的概念,调整后的R2在计算时考虑了自变量的个数,它一般会低于原始R2的值。只有当模型加入新变量真正提升了预测能力时,调整后的R2才会上升;如果新增变量导致的R2增长只是过拟合造成的假象,调整后的R2则不会上升。
这样,调整后的R2更能防止过拟合问题,给出一个更可靠地评估模型预测能力的指标,它仅在模型效果实际提升时才会上升,而不会被过拟合的数据所迷惑。
总之,相比原始R2,调整后的R2值对模型过拟合更具鲁棒性,能给出一个更准确、可信的模型效果评估。
- n = 样本数量
- k =自变量数量
- Ra² = adjusted R²
分类指标
分类问题是世界上研究最广泛的领域之一如语音识别、人脸识别、文本分类等。分类模型有离散的输出(例如,在语音识别问题中,你可能要将输入的声音信号分为若干个可能的单词或短语。在人脸识别中,你会将输入的图像分为“是人脸”和“不是人脸”两个类别。在文本分类中,你要将文本分为不同的主题或情感类别。),所以我们需要一个以某种形式比较离散类的度量,分类度量评估模型的性能,并告诉你分类的好坏,但每个度量的评估方式都不同。
混淆矩阵 Confusion Matrix
一般是展现真阳性(tp)、真阴性(tn)、假阳性(fp)和假阴性(fn)预测的常见方式。这些值以矩阵的形式表示,其中Y轴显示真实类别,而X轴显示预测类别。
它是根据类预测计算的,这意味着需要首先对模型的输出进行阈值处理。
from sklearn.metrics import confusion_matrix
y_pred_class = y_pred_pos > threshold
cm = confusion_matrix(y_true, y_pred_class)
tn, fp, fn, tp = cm.ravel()
假阳性率 False Positive Rate | Type I error
当预测了一些值,而与实际值不符时就导致假阳性。可以把它看作是基于模型预测而产生的虚假警报的一小部分。
from sklearn.metrics import confusion_matrix
y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
false_positive_rate = fp / (fp + tn)
# log score to neptune
run[“logs/false_positive_rate”] = false_positive_rate
很少会单独使用这个指标,但是经常作为其他指标的辅助指标,如果处理警报的成本很高,则应考虑提高阈值以减少警报。
假阴性率 False Negative Rate | Type II error
与假阳性率相反,当我们没有在应该进行预测的情况下进行预测时,就会增加漏判率。你可以把它想象成你的模型错过的应当判对的事件所占的比例。
from sklearn.metrics import confusion_matrix
y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
false_negative_rate = fn / (tp + fn)
# log score to neptune
run[“logs/false_negative_rate”] = false_negative_rate
待更新