為了獲得對模型性能的無偏估計,在訓練過程中使用未知數據對測試進行評估是至關重要的。所以,需要將數據集划分為訓練數據集和測試數據集,前者用於模型的訓練,后者用戶模型在未知數據上泛化性能的評估。
對於線性模型
一、殘差圖
當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)))