深度研究:回歸模型評價指標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

https://scikit-learn.org
https://zhuanlan.zhihu.com/p/36305931
https://www.jianshu.com/p/9ee85fdad150
https://blog.csdn.net/Dear_D/article/details/86144696
https://blog.csdn.net/shy19890510/article/details/79375062


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM