机器学习算法笔记(六):衡量一个算法解决回归问题的指标

与分类问题直接统计分类准确率类似,我们也有衡量一个算法解决回归问题的指标。不过因为回归问题预测的是具体的值,衡量回归问题的指标必然不会像分类问题那么简单。本文中主要探讨四种指标,分别是MSE,RMSE,MAE和R Squared。

一、MSE,RMSE和MAE

MSE,RMSE和MAE分别为均方误差(Mean Squared Error)均方根误差(Root Mean Squared Error)平均绝对误差(Mean Absolute Error)的缩写。它们的定义分别如下:

三种回归问题的评价指标

其中,由于MSE量纲与初始数据不同,我们往往采用RMSE或者MAE使得误差的意义更加明显。下面我们就以简单线性回归为例,编程实现这三个标准。我们把前面文章实现好的线性回归文件连同kNN算法文件一起封装成一个名为MyML的模块(点击下载),以便调用。新建一个main.py文件,实现如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

boston = datasets.load_boston() #加载波士顿房产数据
x = boston.data[:,5] #暂时只使用房间数量这个特征
y = boston.target

#波士顿房产数据集中的房价的最大值为50,有可能是所有大于等于50万元的房子都被写成了50,故我们需要去除房价等于50的数据
x = x[y < 50.0]
y = y[y < 50.0]

from MyML.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, seed=666)

from MyML.SimpleLinearRegression import SimpleLinearRegression

reg = SimpleLinearRegression()
reg.fit(x_train, y_train)

plt.scatter(x_train, y_train) #绘制训练集散点图
plt.scatter(x_test, y_test, color="c") #绘制测试集散点图
plt.plot(x_train, reg.predict(x_train), color='r') #绘制拟合后的直线模型
plt.show()

y_predict = reg.predict(x_test)

#MSE
mse_test = np.sum((y_predict - y_test)**2) / len(y_test)
print(mse_test)

from math import sqrt

#RMSE
rmse_test = sqrt(mse_test)
print(rmse_test)

#MAE
mae_test = np.sum(np.absolute(y_predict - y_test))/len(y_test)
print(mae_test) import numpy as np

绘制的图像与输出结果如下:

当然,我在MyML包中事先实现好了MSE,RMSE和MAE的函数,也可以直接调用:

from MyML.metrics import mean_squared_error
from MyML.metrics import root_mean_squared_error
from MyML.metrics import mean_absolute_error

print(mean_squared_error(y_test, y_predict))
print(root_mean_squared_error(y_test, y_predict))
print(mean_absolute_error(y_test, y_predict))

输出结果应该和上面完全一致。sklearn中也有封装这些函数,调用的方法如下:

from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

print(mean_squared_error(y_test, y_predict))
print(mean_absolute_error(y_test, y_predict))

值得补充的一点是,虽然RMSE和MAE的量纲相同(都是原始数据中y对应的量纲),但RMSE的值是大于MAE的。因为一组正数的平均数的平方,小于每个数的平方和的平均数。

二、R Squared:衡量线性回归法的最佳指标

R Squared是在线性回归问题中衡量算法好坏的最佳指标。它是一个0到1之间的数,即使分类的问题不同,也可以比较模型应用在不同问题上所体现的优劣。它也完美的解决了RMSE和MAE的局限性——使用同一个算法模型去解决不同的问题,不能体现此模型针对不同问题所表现的优劣(因为不同实际应用中,数据的量纲不同,无法直接比较预测值,因此无法判断模型更适合预测哪个问题)。R Squared将预测结果转换为准确度,根据准确度,我们就能判断这个模型到底适合预测哪个问题了。

R Squared的含义以及计算方法

从上图第二块内容我们可以看出,减号后面分子的样式与MSE类似,我们可以把它理解为“使用我们自己的机器学习模型预测产生的误差”;而分母的样式与“方差”类似,“方差”通常用来描述随机变量和其数学期望(即均值)之间的偏离程度,所以我们可以理解为“使用y=这个模型预测产生的误差”。通常我们称y=这个模型为基准模型(Baseline Model)。

我们可以想象,基准模型与真实值的误差肯定非常大,因为我们没有考虑x,直接生硬地预测所有的样本数据都等于样本最终输出结果的均值。而我们模型预测所产生的结果的误差应该是比较少的,因为我们充分考虑了x与y之间的关系。

基于上一段我们就能这样来了解R Squared的表达式:我们使用Baseline Model进行预测肯定会产生误差,这个误差肯定不小;而使用自己的模型进行预测也会产生一些误差,但相比Baseline Model,误差肯定会减少一些。所以我们用1 – (自己的模型预测产生的误差 / 基础模型预测生产的误差),实际上就计算出了我们的模型拟合住这些数据的地方,反映了我们的模型没有产生误差的指标。简言之,这个比值衡量的是我们自己的模型对比基准模型的效果

理解了R Squared的公式,通过公式本身,我们就可以得到以下结论:

1、R2 <= 1
2、R2越大越好,当自己的预测模型没有任何误差时,R2 = 1
3、当我们的模型等于基准模型时:R2 = 0
4、如果R2 < 0,说明学习到的线性模型误差大于基准模型,还不如直接使用基准模型,数据很可能根本不存在线性关系,应考虑用其他方法解决该问题。

我们继续将式子进行变形:

分子分母同除以m,我们会发现上面的部分其实就是MSE,下面的部分就是“方差”,将来深入学习概率统计后,有助于我们更加深入理解 R这个指标。变形后的式子将成为我们代码实现采用的最终表达式。

下面我们通过编程,具体实现R Squared的计算。在main.py文件的最后,输入一行代码即可:

r2_score = 1 - mean_squared_error(y_test, y_predict)/np.var(y_test)

打印r2_score,结果约为61.3%。我们也可以将R Squared的计算封装成一个函数:

def r2_score(y_true, y_predict):
    #计算R Squared

    return 1 - mean_squared_error(y_true, y_predict)/np.var(y_true)

我已经在MyML的metrics.py中实现了这个函数。调用时非常方便:

from MyML.metrics import r2_score

r2_score(y_test, y_predict)

sklearn中也有相应封装好的函数,只需要将上面代码from后的模块改为sklearn,这里不再重复。

发表评论

电子邮件地址不会被公开。 必填项已用*标注