線性模型之二:線性回歸模型性能的評估(殘差圖、MSE與R2)


    為了獲得對模型性能的無偏估計,在訓練過程中使用未知數據對測試進行評估是至關重要的。所以,需要將數據集划分為訓練數據集和測試數據集,前者用於模型的訓練,后者用戶模型在未知數據上泛化性能的評估。

    對於線性模型

一、殘差圖

    當m>1時,模型使用了多個解釋變量,無法在二維坐標上繪制線性回歸曲線。那么如何對回歸模型的性能有一個直觀的評估呢?可以通過繪制預測值的殘差圖,即真實值和預測值之間的差異或者垂直距離。

    殘差圖作為常用的圖形分析方法,可對回歸模型進行評估,獲取模型的異常值,同時還可以檢查模型是否是線性的,以及誤差是否隨機分布。

    通過將預測結果減去對應的目標變量的真實值,便可獲得殘差值。如下殘差圖像,其中X軸表示預測結果,Y軸表示殘差。其中一條直線 Y=0,表示殘差為0的位置。

 

    如果擬合結果准確,殘差應該為0。但實際應用中,這種情況通常是不會發生的。但是,對於一個好的回歸模型,期望誤差是隨機分布的,同時殘差也隨機分布於中心線附近。

    如果我們從殘差圖中找出規律,就意味着模型遺漏了某些能夠影響殘差的解釋信息,就如同看到的殘差圖那樣,其中有這些許規律。此外,還可以通過殘差圖來發現異常值,這些異常值看上去距離中心線有較大的偏差。

二、均方誤差(Mean Squared Error, MSE)

    另外一種對模型性能進行定量估計的方法稱為均方誤差(Mean Squared Error, MSE), 它是線性回歸模型擬合過程中,最小化誤差平方和(SSE)代價函數的平均值。

三、決定系數(R2)     

    但是MSE不甚全面,某些情況下決定系數(coefficient of determination)(R2)顯得尤為有用,它可以看作是MSE的標准化版本,用於更好地解釋模型的性能。R2值的定義如下:

 

     其中,SSE為誤差平方和,而

   

    SST反映了真實的y的方差。決定系數R2反映了y的波動有多少百分比能被X的波動所描述,R2的取值范圍0~1。然后使用MSE定義R2,

    在y變化越劇烈(Var(y)很大)的時候(即大方差)情況下,預測的也很好(MSE會小)的話,則說明模型越好!說明模型對多樣性數據的擬合能力比較強!

    從另一個角度思考,y的方差越小,說明很相似很集中,當然就更容易擬合

 四、綜合評估

    在度量一個回歸模型的好壞時,會同時采用殘差圖、均方誤差MSE和決定系數R2。

    1)殘差圖可以更直觀地掌握每個樣本的誤差分布。

    2)MSE的值越小越好,但是不考慮樣本本身的分布。

    3)R2綜合考慮了測試樣本本身波動的分布性。


房價數據的附件: boston_house.csv

代碼實現如下:  
# In[1]
# 從csv載入房價數據
import pandas as pd
df = pd.read_csv('boston_house.csv')

df.columns = ['row', 'CRIM', 'ZN', 'INDUS', 'CHAS', 
              'NOX', 'RM', 'AGE', 'DIS', 'RAD', 
              'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
df.drop("row", axis=1, inplace=True) #刪除第一列的行號
df.head()
# In[2]
from sklearn.model_selection import train_test_split

X = df.iloc[:, :-1].values
y = df['MEDV'].values

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                    random_state=0, test_size=0.3)
# In[4]
# 開始訓練
from sklearn.linear_model import LinearRegression
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

lr = LinearRegression()
lr.fit(X_train, y_train)
y_train_pred = lr.predict(X_train)  #訓練數據的預測值
y_test_pred = lr.predict(X_test)    #測試數據的預測值
y_train_pred.shape, y_test_pred.shape
# In[5]
# 繪制散點圖
plt.scatter(y_train_pred, y_train_pred - y_train,
            c='steelblue', marker='o', edgecolor='white',
            label='Training_data')
plt.scatter(y_test_pred, y_test_pred-y_test,
            c='limegreen', marker='s', edgecolor='white',
            label='Test_data')
plt.xlabel('Predicted values')
plt.ylabel('Residuals')
plt.legend(loc='upper left')
plt.hlines(y=0, xmin=-10, xmax=50, color='black', lw=2)
plt.xlim([-10, 50]) # 設置坐標軸的取值范圍
plt.tight_layout()
plt.show()
# In[6]
# 計算均方誤差MSE、決定系數R2
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
print("MSE of train: %.2f, test, %.2f" % (
                    mean_squared_error(y_train, y_train_pred), 
                    mean_squared_error(y_test, y_test_pred)))

print("R^2 of train: %.2f, test, %.2f" % (
                    r2_score(y_train, y_train_pred), 
                    r2_score(y_test, y_test_pred)))
 
       


免責聲明!

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



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