回归模型的性能的评价指标主要有:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score。但是当量纲不同时,RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score,实际使用时,会遇到许多问题,今天我们深度研究一下。
预备知识
搞清楚R2_score计算之前,我们还需要了解几个统计学概念。
(资料图片)
若用$y_i$表示真实的观测值,用$\bar{y}$表示真实观测值的平均值,用$\hat{y_i}$表示预测值,则:
回归平方和:SSR
$$SSR = \sum_{i=1}^{n}(\hat{y_i} - \bar{y})^2$$
即估计值与平均值的误差,反映自变量与因变量之间的相关程度的偏差平方和
残差平方和:SSE
$$SSE = \sum_{i=1}^{n}(y_i-\hat{y_i} )^2$$
即估计值与真实值的误差,反映模型拟合程度
总离差平方和:SST
$$SST =SSR + SSE= \sum_{i=1}^{n}(y_i - \bar{y})^2$$
即平均值与真实值的误差,反映与数学期望的偏离程度
R2_score计算公式
R^2 score,即决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。计算公式:
$$R^2=1-\frac{SSE}{SST}$$
即
$$R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)2}{\sum_{i=1}{n} (y_i - \bar{y})^2}$$
进一步化简
$$R^2 = 1 - \frac{\sum\limits_i(y_i - y_i)^2 / n}{\sum\limits_i(y_i - \hat{y})^2 / n} = 1 - \frac{RMSE}{Var}$$
分子就变成了常用的评价指标均方误差MSE,分母就变成了方差。
对于$R^2$可以通俗地理解为使用均值作为误差基准,看预测误差是否大于或者小于均值基准误差。
R2_score = 1,样本中预测值和真实值完全相等,没有任何误差,表示回归分析中自变量对因变量的解释越好。
R2_score = 0。此时分子等于分母,样本的每项预测值都等于均值。
R2_score不是r的平方,也可能为负数(分子>分母),模型等于盲猜,还不如直接计算目标变量的平均值。
r2_score使用方法
根据公式,我们可以写出r2_score实现代码
1- mean_squared_error(y_test,y_preditc)/ np.var(y_test)
也可以直接调用sklearn.metrics中的r2_score
sklearn.metrics.r2_score(y_true, y_pred, sample_weight=None, multioutput="uniform_average")
#y_true:观测值
#y_pred:预测值
#sample_weight:样本权重,默认None
#multioutput:多维输入输出,可选‘raw_values’, ‘uniform_average’, ‘variance_weighted’或None。默认为’uniform_average’;
raw_values:分别返回各维度得分
uniform_average:各输出维度得分的平均
variance_weighted:对所有输出的分数进行平均,并根据每个输出的方差进行加权。
sklearn.metrics.r2_score使用方法
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import r2_score
#导入数据
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)
diabetes_X = diabetes_X[:, np.newaxis, 2]
#划分测试集验证集
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_train = diabetes_y[:-20]
diabetes_y_test = diabetes_y[-20:]
# 创建线性回归模型
regr = linear_model.LinearRegression()
# 训练模型
regr.fit(diabetes_X_train, diabetes_y_train)
# 预测
diabetes_y_pred = regr.predict(diabetes_X_test)
# 模型评价
print("r2_score: %.2f"
% r2_score(diabetes_y_test, diabetes_y_pred))
# 绘制预测效果图
plt.scatter(diabetes_X_test, diabetes_y_test, color="black")
plt.plot(diabetes_X_test, diabetes_y_pred, color="blue", linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
r2_score: 0.47
r2_score偏小,预测效果一般。
注意事项
1、$R^2$ 一般用在线性模型中(非线性模型也可以用)
2、$R^2$不能完全反映模型预测能力的高低,某个实际观测的自变量取值范围很窄,但此时所建模型的R2 很大,但这并不代表模型在外推应用时的效果肯定会很好。
3、数据集的样本越大,R²越大,因此,不同数据集的模型结果比较会有一定的误差,此时可以使用Adjusted R-Square (校正决定系数),能对添加的非显著变量给出惩罚:
$$R2_{\text{Adj}}=1-(1-R2)\frac{n-p-1}{n-1}$$
n是样本的个数,p是变量的个数
Reference
今年1月份,内蒙古自治区全区监测的7大类现代煤化工产品价格6降1升,其中,煤制天然气、煤制高温煤焦油价格降幅较为明显,其余5类产品价格更多
2023-02-10 09:11:58黄玉治在全国矿山安全防范视频调度会议上强调坚决防范遏制矿山重特大事故为全国两会胜利召开营造良好安全生产环境 2月7日,国家矿山安全监更多
2023-02-09 11:18:041月份,宁夏煤业公司聚焦保供,精准发力,狠抓落实,商品煤产量完成50074万吨,超计划107万吨;煤制油化工品产量完成9755万吨,超计划273更多
2023-02-09 11:12:422月8日上午,山东能源集团与北京科技大学战略合作框架协议签约活动在济南举行。北京科技大学校长杨仁树,中国工程院院士蔡美峰,山东能源更多
2023-02-09 11:15:42截至1月31日,黄骅港煤炭港区月度完成煤炭装船1661万吨,超计划89万吨,顺利完成了迎峰度冬能源保供任务,为群众安全用能提供了有力支撑。更多
2023-02-09 10:56:582月7日,内蒙古自治区乌拉特中旗人民政府发布《关于加快建设零碳园区破解能耗制约第151002号提案的答复》。根据答复,乌拉特中旗计划,到2更多
2023-02-09 11:11:18原煤生产增速略有放缓,进口降幅收窄。据国家统计局统计,2022年,规模以上企业生产原煤450亿吨,同比增长90%。其中,12月份生产原煤40亿更多
2023-02-09 10:01:38记者8日从山东省煤田地质局获悉,该局突出地质勘查基本职能,服务能源资源安全,2022年新发现矿产地13处,共探获煤炭资源3785亿吨,其中省更多
2023-02-09 09:57:42据商务部业务系统统一平台洛阳市重要生产资料监测系统数据显示,上周(1月28日-2月3日)洛阳市煤炭(烟煤)平均零售价为709元吨,环比下降更多
2023-02-09 10:16:07据商务部重要生产资料市场监测系统显示,1月28日至2月3日,陕西省煤炭均价16002元吨,环比下跌06%。其中:无烟煤18400元吨,环比下跌05%;更多
2023-02-09 10:09:38