在实际使用的时候,训练线性回归模型的数据来源于从原始数据集拆分出来的训练集(train_data),模型的损失函数也是对应训练集的,即$\sum^{m}_{i} {(\hat y^{(i)}_{train} - y^{(i)}_{train})^{2}} $。
① 均方误差(Mean Square Error)
$MSE = \frac {1}{m}\sum^{m}_{i} {(\hat y^{(i)}_{test} - y^{(i)}_{test})^{2}}$
这是目前最为通用的通过衡量真值与预测值差距来评估线性模型性能的方法。
当使用$\sum^{m}_{i} {(\hat y^{(i)}_{test} - y^{(i)}_{test})^{2}}$作为评估模型的标准会使得测试集大小$m$与其值密切关联,$m$越大会使得$\sum^{m}_{i} {(\hat y^{(i)}_{test} - y^{(i)}_{test})^{2}}$的值也越大。均方误差(Mean Square Error)是其改进方法。
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict)
② 均方根误差(Root Mean Square Error)
$RMSE = \sqrt {\frac {1}{m} \sum^{m}_{i} {(\hat y^{(i)}_{test} - y^{(i)}_{test})^{2}}} = \sqrt {MSE}$
该方法改进了 MSE 处理量纲敏感问题的缺陷,使误差的衡量单位变回样本输出标记的原始量纲,从而误差背后的意义更方便解释。
③ 平均绝对误差(Mean Absolute Error)
$MAE =\frac {1}{m} \sum^{m}_{i} |{(\hat y^{(i)}_{test} - y^{(i)}_{test})}|$
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_predict)
RMSE 与 MAE 的比较
RMSE是每个样本点的真值与预测值的差异值的平方加和后再开方,该方法会明显放大样本中最大的差异,RMSE反映的差距会比直接反映的差距$MAE$要大一些。所以在真实情况中,使RMSE的值更加小相对来说会更有意义,这就意味着样本的错误中,最大的错误值相对更小。使得目标损失函数$\sum^{m}_{i} {(\hat y^{(i)} - y^{(i)})^{2}}$最小化的背后也是使得最终预测结果中最大的误差最小化。
④ R Square
对于算法性能评估方法 RMSE,MAE 等,其衡量的误差带有样本输出标签的量纲,当面对不同的回归问题时,算法的好坏评判标准就会变得模糊(比如一个模型在房价预测时误差是5万元,在学生分数预测的时候是10分,这时就无法难判断这个模型是适合学生分数预测还是房价预测,不同量纲的数据无法直接比较)。这是这些方法的局限性。改进方法就是 R Square,该方法将回归问题的评估结果规约到了[0-1]区间。
$R^{2} = 1- \frac {SS_{residual}}{SS_{total}} = 1 - \frac {MSE(\hat y - y^{(i)})}{Var(y)} , R^{2} \le 1$
Residual Sum of Square $SS_{residual} = \sum_{i}{(\hat y^{(i)} - y^{(i)})^2}$
Total Sum of Square $\ \ \ \ \ \ SS_{total} \ \ \ \ \ \ = \sum_{i}{(\overline y - y^{(i)})^{2}}$$SS_{residual}$描述的是使用 训练模型(train Model) 进行预测产生的错误;$ SS_{residual}$描述的是使用 $y = \overline y$(基准模型,Baseline Model) 进行预测产生的错误。在这里,使用 Baseline Model 进行预测通常会产生非常多的错误,而使用 训练模型(train Model) 也会产生错误,但是相应地也减少了很多错误。所以$R^{2}$ 衡量的是 训练模型(train Model) 相比 Baseline Model 减少的错误,也就是模型的拟合程度。
当$R^{2} = 1$意味着 训练模型(train Model) 不凡任何错误;
当$R^{2} = 0$意味着 训练模型(train Model) 等于基准模型;
当$R^{2} \lt 0$意味着 训练模型(train Model) 不如基准模型,很有可能数据不存在任何线性关系。from sklearn.metrics import r2_score r2_score = r2_score(y_test,y_predict)