七、迴歸——迴歸預測的評價指標(附python代碼)

目錄

一、常用的評價指標

1、SSE(誤差平方和)

2、R-square(決定係數)

3、Adjusted R-Square (校正決定係數)

二、python中的sklearn. metrics

(1) explained_variance_score(解釋方差分)

(2) Mean absolute error(平均絕對誤差)

(3)Mean squared error(均方誤差)

(4) Mean squared logarithmic error

(5)Median absolute error(中位數絕對誤差)

(6) R² score(決定係數、R方)

三、交叉驗證在python上的實現

 


一、常用的評價指標

對於迴歸模型效果的判斷指標經過了幾個過程,從SSE到R-square再到Ajusted R-square, 是一個完善的過程:

  • SSE(誤差平方和):The sum of squares due to error

  • R-square(決定係數):Coefficient of determination

  • Adjusted R-square:Degree-of-freedom adjusted coefficient of determination

下面我對以上幾個名詞進行詳細的解釋下,相信能給大家帶來一定的幫助!!

1、SSE(誤差平方和)

計算公式如下:

     

  • 同樣的數據集的情況下,SSE越小,誤差越小,模型效果越好
  • 缺點:

SSE數值大小本身沒有意義,隨着樣本增加,SSE必然增加,也就是說,不同的數據集的情況下,SSE比較沒有意義

 

2、R-square(決定係數)

 

  • 數學理解: 分母理解爲原始數據的離散程度,分子爲預測數據和原始數據的誤差,二者相除可以消除原始數據離散程度的影響
  • 其實“決定係數”是通過數據的變化來表徵一個擬合的好壞。
  • 理論上取值範圍(-∞,1], 正常取值範圍爲[0 1] ------實際操作中通常會選擇擬合較好的曲線計算R²,因此很少出現-∞
  • 一個常數模型總是預測 y 的期望值,它忽略輸入的特徵,因此輸出的R^2會爲0

越接近1,表明方程的變量對y的解釋能力越強,這個模型對數據擬合的也較好

越接近0,表明模型擬合的越差

經驗值:>0.4, 擬合效果好

  • 缺點:

數據集的樣本越大,R²越大,因此,不同數據集的模型結果比較會有一定的誤差

 

3、Adjusted R-Square (校正決定係數)

 

      

n爲樣本數量,p爲特徵數量

  • 消除了樣本數量和特徵數量的影響

二、python中的sklearn. metrics

 python的sklearn.metrics中包含一些損失函數,評分指標來評估迴歸模型的效果。主要包含以下幾個指標:n_squared_errormean_absolute_errorexplained_variance_score and r2_score.。

(1) explained_variance_score(解釋方差分)

   y_hat :預測值, y :真實值, var :方差

explained_variance_score:解釋方差分,這個指標用來衡量我們模型對數據集波動的解釋程度,如果取值爲1時,模型就完美,越小效果就越差。下面是python的使用情況:

# 解釋方差分數
>>> from sklearn.metrics import explained_variance_score
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> explained_variance_score(y_true, y_pred)  
0.957...
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> explained_variance_score(y_true, y_pred, multioutput='raw_values')
... 
array([ 0.967...,  1.        ])
>>> explained_variance_score(y_true, y_pred, multioutput=[0.3, 0.7])
... 
0.990...

(2) Mean absolute error(平均絕對誤差)

   y_hat :預測值, y :真實值

 

給定數據點的平均絕對誤差,一般來說取值越小,模型的擬合效果就越好。下面是在python上的實現:

>>> from sklearn.metrics import mean_absolute_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_absolute_error(y_true, y_pred)
0.5
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> mean_absolute_error(y_true, y_pred)
0.75
>>> mean_absolute_error(y_true, y_pred, multioutput='raw_values')
array([ 0.5,  1. ])
>>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7])
... 
0.849...

(3)Mean squared error(均方誤差)

   y_hat :預測值, y :真實值

這是人們常用的指標之一。

>>> from sklearn.metrics import mean_squared_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_squared_error(y_true, y_pred)
0.375
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> mean_squared_error(y_true, y_pred)  
0.7083...

(4) Mean squared logarithmic error

   y_hat :預測值, y :真實值

 

     當目標實現指數增長時,例如人口數量、一種商品在幾年時間內的平均銷量等,這個指標最適合使用。請注意,這個指標懲罰的是一個被低估的估計大於被高估的估計。

>>> from sklearn.metrics import mean_squared_log_error
>>> y_true = [3, 5, 2.5, 7]
>>> y_pred = [2.5, 5, 4, 8]
>>> mean_squared_log_error(y_true, y_pred)  
0.039...
>>> y_true = [[0.5, 1], [1, 2], [7, 6]]
>>> y_pred = [[0.5, 2], [1, 2.5], [8, 8]]
>>> mean_squared_log_error(y_true, y_pred)  
0.044...

(5)Median absolute error(中位數絕對誤差)

y_hat :預測值, y :真實值

 

中位數絕對誤差適用於包含異常值的數據的衡量

>>> from sklearn.metrics import median_absolute_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> median_absolute_error(y_true, y_pred)
0.5

(6) R² score(決定係數、R方)

R方可以理解爲因變量y中的變異性能能夠被估計的多元迴歸方程解釋的比例,它衡量各個自變量對因變量變動的解釋程度,其取值在0與1之間,其值越接近1,則變量的解釋程度就越高,其值越接近0,其解釋程度就越弱。

一般來說,增加自變量的個數,迴歸平方和會增加,殘差平方和會減少,所以R方會增大;反之,減少自變量的個數,迴歸平方和減少,殘差平方和增加。

爲了消除自變量的數目的影響,引入了調整的R方

>>> from sklearn.metrics import r2_score
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> r2_score(y_true, y_pred)  
0.948...
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> r2_score(y_true, y_pred, multioutput='variance_weighted')
... 
0.938...
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> r2_score(y_true, y_pred, multioutput='uniform_average')
... 
0.936...
>>> r2_score(y_true, y_pred, multioutput='raw_values')
... 
array([ 0.965...,  0.908...])
>>> r2_score(y_true, y_pred, multioutput=[0.3, 0.7])
... 
0.925...

 

三、交叉驗證在python上的實現

 

############################交叉驗證,評價模型的效果############################
from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_score
diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
lasso = linear_model.Lasso()
print(cross_val_score(lasso, X, y, cv=5))  # 默認是3-fold cross validation
############################交叉驗證,評價模型的效果############################
from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_score
diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
lasso = linear_model.Lasso()
print(cross_val_score(lasso, X, y, cv=5))  # 默認是3-fold cross validation
################定義一個返回cross-validation rmse error函數來評估模型以便可以選擇正確的參數########
from sklearn.linear_model import Ridge, RidgeCV, ElasticNet, LassoCV, LassoLarsCV
from sklearn.model_selection import cross_val_score

def rmse_cv(model):
    ##使用K折交叉驗證模塊,將5次的預測準確率打印出
    rmse= np.sqrt(-cross_val_score(model, X_train, y_train, scoring="neg_mean_squared_error", cv = 5))  #輸入訓練集的數據和目標值
    return(rmse)
    
model_ridge = Ridge()

alphas = [0.05, 0.1, 0.3, 1, 3, 5, 10, 15, 30, 50, 75]
cv_ridge = [rmse_cv(Ridge(alpha = alpha)).mean()    #對不同的參數alpha,使用嶺迴歸來計算其準確率
            for alpha in alphas]

cv_ridge

#繪製嶺迴歸的準確率和參數alpha的變化圖
cv_ridge = pd.Series(cv_ridge, index = alphas)
cv_ridge.plot(title = "Validation - Just Do It")
plt.xlabel("alpha")
plt.ylabel("rmse")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章