回归类算法的模型评估与分类型算法的模型评估其实是相似的法则——找真实标签和预测值的差异。在分类型算法中,评判否预测到了正确的分类,而在我们的回归类算法中,评判是否预测到了正确的数值、以及是否拟合到了足够的信息。
绝对误差 MAE
---- 是否预测了正确的数值
sklearn中使用RSS 的变体,均方误差MSE(mean squared error)来衡量我们的预测值和真实值的差异:
均方误差MSE
在sklearn当中,我们有两种方式调用这个评估指标,一种是使用sklearn专用的模型评估模块metrics里的类mean_squared_error,另一种是调用交叉验证的类cross_val_score并使用里面的scoring参数来设置使用均方误差。
sklearn.metrics.mean_squared_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average', squared=True)
sklearn.model_selection.cross_val_score(reg,X,y,cv=10,scoring=="neg_mean_squared_error")squared bool, default=True If True returns MSE value, if False returns RMSE value.
这里注意scoring=="neg_mean_squared_error", 均方误差为负是因为sklearn在计算模型评估指标的时,认为均方误差本身是一种误差,是模型的一种损失(loss)。在sklearn当中,所有的损失都使用负数表示,因此均方误差也被显示为负数了。
均方根误差RMSE
RMSE为MSE的算术平方根
缺点:因使用平均误差,平均误差对异常值比较敏感,异常值的出现,使得RMSE的误差较大。
例:
>>> from sklearn.metrics import mean_squared_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_squared_error(y_true, y_pred)
0.375
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_squared_error(y_true, y_pred, squared=False)
0.612...
>>> y_true = [[0.5, 1],[-1, 1],[7, -6]]
>>> y_pred = [[0, 2],[-1, 2],[8, -5]]
>>> mean_squared_error(y_true, y_pred)
0.708...
>>> mean_squared_error(y_true, y_pred, squared=False)
0.822...
>>> mean_squared_error(y_true, y_pred, multioutput='raw_values')
array([0.41666667, 1. ])
>>> mean_squared_error(y_true, y_pred, multioutput=[0.3, 0.7])
0.825...
同样可以在sklearn当中,使用命令from sklearn.metrics import mean_absolute_error来调用MAE;在交叉验证中的scoring = "neg_mean_absolute_error"来调用MAE。
sklearn.metrics.mean_absolute_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average')
>>> from sklearn.metrics import mean_absolute_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_absolute_error(y_true, y_pred)
0.5
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> mean_absolute_error(y_true, y_pred)
0.75
>>> mean_absolute_error(y_true, y_pred, multioutput='raw_values')
array([0.5, 1. ])
>>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7])
0.85...如果multioutput为'raw_values',则分别返回每个输出的绝对平均误差。
如果multioutput是'uniform_average'或权值的ndarray,则返回所有输出错误的加权平均值。
R^2 (决定系数)
---- 是否拟合了足够的信息
方差的本质是任意一个值和样本均值的差异,差异越大,这些值所带的信息越多。由此可以用来衡量数据上的信息量。如果方差越大,代表数据上的信息量越多,而这个信息量不仅包括了数值的大小,还包括了希望模型捕捉的那些规律。
为衡量模型对数据上的信息量的捕捉而生。
总平方和(SST)= 回归平方和(SSR)+ 残差平方和(SSE)
其中,
为真实标签,
为预测结果,
为样本均值。
比 样本量
即为样本方差。数学理解:
1,
衡量的是1 - 模型没有拟合到的信息占真实标签中所带的信息量。
2, 分母理解为原始数据的离散程度,方差,即真实标签所带的信息量。
3,分子为预测数据和原始数据的误差,残差平方和模型没有拟合到的信息。
4, 两者相除可以消除原始数据离散程度的影响。
理论上取值(−∞,1],正常取值范围为[0, 1]越接近1,模型对数据拟合的越好。
越接近0,表明模型拟合的越差。
小于0(为负),说明模型拟合到的全部信息小于残差平方和
缺点:数据集的样本越大,R2越大。
不同数据集的模型结果比较会有一定的误差。
可以使用三种方式来调用,一是从metrics中导入r2_score,输入预测值和真实值后打分。第二是从线性回归LinearRegression的接口score来进行调用。第三是在交叉验证中,输入scoring = "r2"来调用。
sklearn.metrics.r2_score(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average')
>>> from sklearn.metrics import r2_score
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> r2_score(y_true, y_pred)
0.948...
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> r2_score(y_true, y_pred,
... multioutput='variance_weighted')
0.938...
>>> y_true = [1, 2, 3]
>>> y_pred = [1, 2, 3]
>>> r2_score(y_true, y_pred)
1.0
>>> y_true = [1, 2, 3]
>>> y_pred = [2, 2, 2]
>>> r2_score(y_true, y_pred)
0.0
>>> y_true = [1, 2, 3]
>>> y_pred = [3, 2, 1]
>>> r2_score(y_true, y_pred)
-3.0multioutput: {'raw_values','uniform_average','variance_weighted'},array like of shape(n_output,) or None,default='uniform_average'
定义多个输出分数的聚合。类数组值定义用于平均得分的权重。默认设置是"uniform_average"。
"raw_values": 在多输出输入的情况下返回完整的分数集。
"uniform_average": 对所有输出的分数取平均值,权重一致。
"variance_weighted": 所有输出的分数取平均值,用每个单个输出的方差加权。
更多详情可参见原文链接:机器学习 | 简单而强大的线性回归详解mp.weixin.qq.com