搞清楚R2_score计算之前,我们还需要了解几个统计学概念。
若用 y i y_i yi表示真实的观测值,用 y ˉ \bar{y} yˉ表示真实观测值的平均值,用 y i ^ \hat{y_i} yi^表示预测值,则:
回归平方和:SSR
 
 即估计值与平均值的误差,反映自变量与因变量之间的相关程度的偏差平方和。
残差平方和:SSE
 
 即估计值与真实值的误差,反映模型拟合程度。
总离差平方和:SST
 
 即平均值与真实值的误差,反映与数学期望的偏离程度
R2_score 计算公式
 R2_score,即决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。计算公式:
 
 即
  
      
       
        
         
         
           R 
          
         
           2 
          
         
        
          = 
         
        
          1 
         
        
          − 
         
         
          
           
           
             ∑ 
            
            
            
              i 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
          
            ( 
           
           
           
             y 
            
           
             i 
            
           
          
            − 
           
           
            
            
              y 
             
            
              i 
             
            
           
             ^ 
            
           
           
           
             ) 
            
           
             2 
            
           
          
          
           
           
             ∑ 
            
            
            
              i 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
          
            ( 
           
           
           
             y 
            
           
             i 
            
           
          
            − 
           
           
           
             y 
            
           
             ˉ 
            
           
           
           
             ) 
            
           
             2 
            
           
          
         
        
       
         R^2 = 1 - \frac{\sum\limits_{i=1}^{n} (y_i - \hat{y_i})^2}{\sum\limits_{i=1}^{n} (y_i - \bar{y})^2} 
        
       
     R2=1−i=1∑n(yi−yˉ)2i=1∑n(yi−yi^)2
 进一步化简
 
      
       
        
         
         
           R 
          
         
           2 
          
         
        
          = 
         
        
          1 
         
        
          − 
         
         
          
           
           
             ∑ 
            
            
            
              i 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
          
            ( 
           
           
           
             y 
            
           
             i 
            
           
          
            − 
           
           
            
            
              y 
             
            
              i 
             
            
           
             ^ 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            / 
           
          
            n 
           
          
          
           
           
             ∑ 
            
            
            
              i 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
          
            ( 
           
           
           
             y 
            
           
             i 
            
           
          
            − 
           
           
           
             y 
            
           
             ˉ 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            / 
           
          
            n 
           
          
         
        
          = 
         
        
          1 
         
        
          − 
         
         
          
          
            R 
           
          
            M 
           
          
            S 
           
          
            E 
           
          
          
          
            V 
           
          
            a 
           
          
            r 
           
          
         
        
       
         R^2 = 1 - \frac{\sum\limits_{i=1}^{n}(y_i - \hat{y_i})^2/ n}{\sum\limits_{i=1}^{n}(y_i - \bar{y})^2 / n} = 1 - \frac{RMSE}{Var} 
        
       
     R2=1−i=1∑n(yi−yˉ)2/ni=1∑n(yi−yi^)2/n=1−VarRMSE
 分子就变成了常用的评价指标均方误差RMSE,分母就变成了方差。
 对于 
     
      
       
        
        
          R 
         
        
          2 
         
        
       
      
        R^2 
       
      
    R2可以通俗地理解为使用均值作为误差基准,看预测误差是否大于或者小于均值基准误差。
 R2_score = 1,样本中预测值和真实值完全相等,没有任何误差,表示回归分析中自变量对因变量的解释越好。
 R2_score = 0。此时分子等于分母,样本的每项预测值都等于均值。
 R2_score不是r的平方,也可能为负数(分子>分母),模型等于盲猜,还不如直接计算目标变量的平均值。
 
      
       
        
         
         
           R 
          
         
           2 
          
         
        
       
         R^2 
        
       
     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()








