当前位置: 首页 > news >正文

score函数 机器学习_深度研究:回归模型评价指标R2_score

回归模型的性能的评价指标主要有: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

相关文章:

  • 国际运营商ICT服务发展现状及策略分析
  • bash 将二进制转换为十进制_bash shell实现二进制与十进制数的互转
  • 实体类多层嵌套 遍历_循环运用(多级嵌套结构)
  • 流程设计和优化原则
  • react做h5 例子_【React入门实例(运行于浏览器duan)】
  • XP中用U盘扩充内存
  • 301跳转 https_nginx配置https301跳转
  • php 创建64位的数_使用PHP应用查询SAP HANA Express Edition里的数据
  • 惠普电脑u盘重装系统步骤_惠普U盘重装,惠普电脑U盘一键重装系统方法
  • SQL Server 2005中的SQLCMD工具使用
  • 统计占比_统计局:2019年高等教育在校生中女研究生占比过半
  • 我的个人2007-非工作盘点
  • scritp里怎么传值给php_PHP中的script部分的值怎么传递出来呢?
  • anchor free 目标检测_Anchor Free的目标检测方法--FCOS
  • 《闯关东》
  • 自己简单写的 事件订阅机制
  • create-react-app做的留言板
  • Logstash 参考指南(目录)
  • Python - 闭包Closure
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 大数据与云计算学习:数据分析(二)
  • 给github项目添加CI badge
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 跳前端坑前,先看看这个!!
  • 通过几道题目学习二叉搜索树
  • 微信公众号开发小记——5.python微信红包
  • 原生Ajax
  • 你对linux中grep命令知道多少?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #pragma once与条件编译
  • #stm32整理(一)flash读写
  • #图像处理
  • $refs 、$nextTic、动态组件、name的使用
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (二)PySpark3:SparkSQL编程
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (南京观海微电子)——COF介绍
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net的socket示例
  • .NET项目中存在多个web.config文件时的加载顺序
  • /etc/fstab和/etc/mtab的区别
  • @JsonFormat与@DateTimeFormat注解的使用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • []Telit UC864E 拨号上网
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [BZOJ] 2044: 三维导弹拦截
  • [Everyday Mathematics]20150130
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
  • [HDU5685]Problem A
  • [ICCV2017]Neural Person Search Machines
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表