R square 的计算方法和一点思考

模型的性能评价指标有几种方案:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score

其中,当量纲不同时,RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score;

这里注意,使用 r2 是平行的对比不同因子/品种的;即 两个shape 一样的样本集,若同个样本集,进行样本切分成不同长度的数据,则会有其他的问题,这个放最后去解释!!!!

先看看 r2 怎么算的

使用 表示预测值,y表示真实值,表示真实值的平均值;则有

回归平方和:

表示预测值与平均值的误差,反映相关程度的偏差平方和。

残差平方和:

表示预测值与真实值的误差,反映模型拟合程度

总离差平方和:

表示 平均值与真实值的误差,反映与数学期望的偏离程度

进一步变形得到

分子就变成了常用的评价指标均方误差MSE,分母就变成了方差。

对于 R2 可以通俗地理解为使用均值作为误差基准,看预测误差是否大于或者小于均值基准误差。

R2_score = 1:样本中预测值和真实值完全相等,没有任何误差,表示回归分析中自变量对因变量的解释越好。

R2_score = 0:此时分子等于分母,样本的每项预测值都等于均值。

R2_score < 0:R2_score不是r的平方,也可能为负数(分子>分母),模型等于盲猜,还不如直接计算目标变量的平均值。

代码如下:

python 复制代码
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)


## r2 = mean_squared_error(y_test,y_preditc)/ np.var(y_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()

注意:

  1. r2 一般用在线性模型中(非线性模型也可以用)

  2. r2 不能完全反映模型预测能力的高低,比如实际观测的自变量取值范围很窄(即var很小/分母很小),此时计算出来的 r2 值很大,但这并不代表模型在样本外应用时的效果很好;

  3. 数据集的样本越大,r2 越大。因此,不同数据集的模型结果比较起来会有误差,这也是开头提到的问题,如果不同模型使用的因子数据不同,但是数据条数一致,即 shape1 = (10000,5) 和 shape2 = (10000,8);

针对这种情况,可以使用 Adjusted R square(校正决定系数),对非显著变量给出惩罚

n 是样本个数,p是变量的个数。

ps: 关于 shape1 = (1000,5) 和 shape2 = (100,5)这种情况, r2 可能不合适作为评价指标,可以考虑RMSE(标准化的)去作为评价指标,或者有人有更好的方案可以讨论一下,我也很想学习!!!!!

相关推荐
飞Link16 小时前
智能体时代的“紧箍咒”:深度解析 Agent 治理架构与 AI 杀伤开关
人工智能·架构
飞Link16 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
zhangfeng113317 小时前
小龙虾 wordbuddy 安装浏览器控制器 agent-browser npm install -g agent-browse
前端·人工智能·npm·node.js
阿里云大数据AI技术17 小时前
一条 SQL 生成广告:Hologres 如何实现素材生成到投放分析一体化
人工智能·sql
liudanzhengxi17 小时前
GitSubmodule避坑全攻略
人工智能·新人首发
用户4252108006017 小时前
Claude Code Linux 服务器部署与配置
人工智能
OJAC11117 小时前
学过Python却不敢投AI岗,他最后拿下12K offer
人工智能
Bigger17 小时前
因为看不懂小棉袄的画,我写了个 AI 程序帮我“翻译”她的世界
前端·人工智能·ai编程
CeshirenTester17 小时前
LangChain的工具调用 vs 原生Skill API:性能差在哪儿?
java·人工智能·langchain
爱问的艾文17 小时前
八周带你手搓AI应用-第二周-让AI更像人-第1天-流式输出改造
人工智能