为机器学习模型选择正确的度量:回归指标
最有用的度量
回归指标
大多数博客都集中在分类指标上,比如精度、查全率、AUC等,我想探索各种度量,包括回归中使用的度量标准。MAE和RMSE为连续变量的两个最流行的度量。
RMSE(均方根误差)
它表示预测值和观察值(称为残差)之间差异的样本标准偏差。在数学上,它是用这个公式计算的:
MAE
MAE是预测值和观测值之间绝对差值的平均值。MAE是一个线性分数,这意味着所有的个体差异在平均值上都是相同的。例如,10和0之间的差值将是5和0之差的两倍。但是,对于RMSE我们将进一步详细讨论的情况也是如此。在数学上,它是用这个公式计算的:
那么你应该选择哪一个?为什么?
那么,很容易理解和解释MAE,因为它直接取平均偏差,而RMSE惩罚高于MAE的更高差异。
让我们通过两个例子来理解上述说法:
Case 1: Actual Values = [2,4,6,8] , Predicted Values = [4,6,8,10]
Case 2: Actual Values = [2,4,6,8] , Predicted Values = [4,6,8,12]
MAE for case 1 = 2.0, RMSE for case 1 = 2.0
MAE for case 2 = 2.5, RMSE for case 2 = 2.65
从上面的例子中,我们可以看到RMSE比MAE更加严重地惩罚了最后的值预测。通常,RMSE将高于或等于MAE。唯一的情况下,它等于MAE是当所有的差异是相等或零。
我将尝试从数学角度解释上述逻辑。
让我们在一个变量中采用一个简单的线性模型:y = mx + b
在这里,我们试图找到“m”和“b”,并且我们提供了数据(x,y)。
如果我们用RMSE定义损失函数(J):那么我们可以很容易地区分J wrt。到m和b并得到更新的m和b
上述等式更容易解决,并且MAE不适用。
然而,如果你想要一个度量只是从解释的角度来比较两个模型,那么我认为MAE是一个更好的选择。需要注意的是,RMSE和MAE的单位与y值相同,对于R Square而言不是这样。RMSE和MAE的范围从0到无穷大。
R平方(R²)和调整R平方
R平方和调整R平方常常用于说明目的,并说明您选择的自变量如何很好地解释因变量的变化。这两个指标都有相当的误解,因此我想先澄清一下,然后再讨论它们的优点和缺点。
在数学上,R_Squared由下式给出:
调整后的R²
就像R²一样,调整后的R²也显示了术语如何符合曲线或线条,但是可以根据模型中的术语数量进行调整。它由以下公式给出:
其中n是观测值的总数,k是预测值的数量。调整后的R 2总是小于或等于R 2
为什么你应该选择R²调整R²?
正常R²存在一些问题,通过调整后的R²解决。经过调整的R²会考虑在模型中增加一个附加项的边际改进。因此,如果添加有用的术语,它会增加,并且如果添加不太有用的预测器,它将减少。但是,即使模型没有实际改进,R 2也随着增加而增加。用一个例子来理解这一点会更容易。
这里,情况1是一个简单的情况,我们有5个观察值(x,y)。在情况2中,我们有一个变量是变量1的两倍(与变量1完全相关)。在案例3中,我们对var2产生了轻微的干扰,因此它不再与var1完全相关。
因此,如果我们为每个案例拟合简单的普通最小二乘(OLS)模型,那么就逻辑而言,我们不会为案例1提供任何额外的或有用的信息给案例2和案例3.所以我们的度量值不应该为这些模型提高。然而,实际上R 2对于模型2和3给出更高的值是不正确的。但是,调整后的R 2可以解决这个问题,实际上对于情况2和3都是递减的。让我们给这些变量一些数字(x ,y)并查看Python中获得的结果。
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
def metrics(m,X,y):
yhat = m.predict(X)
print(yhat)
SS_Residual = sum((y-yhat)**2)
SS_Total = sum((y-np.mean(y))**2)
r_squared = 1 - (float(SS_Residual))/SS_Total
adj_r_squared = 1 - (1-r_squared)*(len(y)-1)/(len(y)-X.shape[1]-1)
return r_squared,adj_r_squared
data = pd.DataFrame({"x1": [1,2,3,4,5], "x2": [2.1,4,6.1,8,10.1]})
y = np.array([2.1, 4, 6.2, 8, 9])
model1 = linear_model.LinearRegression()
model1.fit( data.drop("x2", axis = 1),y)
metrics(model1,data.drop("x2", axis=1),y)
model2 = linear_model.LinearRegression()
model2.fit( data,y)
metrics(model2,data,y)
data = pd.DataFrame({"x1": [1,2,3,4,5], "x2": [2.1,4,6.1,8,10.1]} )
y = np.array([2.1, 4, 6.2, 8, 9])
model3 = linear_model.LinearRegression()
model3.fit( data,y)
metrics(model3,data,y)
注意:模型1和模型2的预测值将相同,因此r_squared也将相同,因为它仅取决于预测值和实际值。
从上表可以看出,尽管我们没有增加案例1到案例2的任何附加信息,但R 2仍在增加,而调整后的R 2正在显示正确的趋势(惩罚模型2获得更多变量)
调整后的R²与RMSE的比较
对于前面的例子,我们将看到类似于R²的情况1和情况2的RMSE相同。在这种情况下,调整后的R²比RMSE做得更好,其范围仅限于将预测值与实际值进行比较。而且,RMSE的绝对值实际上并不能说明模型有多糟糕。它只能用于比较两个模型,而调整后的R²很容易做到这一点。例如,如果一个模型将R²调整为0.05,那么肯定很差。
但是,如果你只关心预测精度,那么RMSE是最好的。它计算简单,容易区分并作为大多数模型的默认度量。
常见误解:我经常在网上看到R²的范围介于0和1之间,实际上并非如此。R²的最大值是1,但最小值可以是负无穷大。考虑到即使y_actual为正数,模型预测所有观测值都具有高负值的情况。在这种情况下,R 2将小于0.这将是一个极不可能的情况,但可能性依然存在。
附加内容
这里有一个有趣的指标,可以告诉你是否对NLP感兴趣,并且为了达到目的,
BLEU(双语评估研究)
它主要用于衡量机器翻译与人类翻译相关的质量。它使用了精确度量的修改形式。
计算BLEU得分的步骤:
1.将句子转换为unigrams,bigrams,trigrams和4-gram
2.计算大小为1到4的n-gram的精度
3.取所有这些精度值的加权平均的指数
4将其与简短的惩罚相乘(稍后将解释)
这里BP是简短惩罚,r&c分别是参考和候选词中的词的数量,w - 权重,P - 精度值
Example:
参考:The cat is sitting on the mat
机器翻译1: On the mat is a cat
机器翻译2:There is cat sitting cat
我们来比较一下上面两个翻译和BLEU得分。
我在这里使用nltk.translate.bleu_score包 -
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'cat',"is","sitting","on","the","mat"]]
candidate = ["on",'the',"mat","is","a","cat"]
score = sentence_bleu( reference, candidate)
print(score)
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'cat',"is","sitting","on","the","mat"]]
candidate = ["there",'is',"cat","sitting","cat"]
score = sentence_bleu( reference, candidate)
print(score)
最终结果:BLEU(MT1)= 0.454,BLEU(MT2)= 0.59