1. 程式人生 > >線性迴歸模型的效能評價指標

線性迴歸模型的效能評價指標

本節討論下線性迴歸模型的效能評價指標

對於機器學習的兩個基本問題分類和迴歸的評價方式有所不同,分類問題一般通過分類準確率、召回率、F1值、ROC/AUC等手段進行模型的評估。對於迴歸問題,該如何評價?  這裡簡要列舉部分評估方法。

1、殘差估計

總體思想是計算實際值與預測值間的差值簡稱殘差。從而實現對迴歸模型的評估,一般可以畫出殘差圖,進行分析評估、估計模型的異常值、同時還可以檢查模型是否是線性的、以及誤差是否隨機分佈。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# 資料讀取
df = pd.read_csv('dataset/boston.csv', sep=',')
df.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS',
              'NOX', 'RM', 'AGE', 'DIS', 'RAD',
              'TAX', 'PTRATIO', 'LSTAT', 'MEDV']
# 所有屬性擬合線性模型
X = df.iloc[:, :-1].values
y = df[['MEDV']].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)
# 模型訓練
slr = LinearRegression()
slr.fit(X_train, y_train)
y_train_pred = slr.predict(X_train)
y_test_pred = slr.predict(X_test)

# 殘差評估方法
plt.scatter(y_train_pred, y_train_pred-y_train,
            c='blue', marker='o', label='Training data')
plt.scatter(y_test_pred, y_test_pred-y_test,
            c='lightgreen', marker='s', label='Test data')
plt.xlabel('Predicted values')
plt.ylabel('Residuals')
plt.legend(loc='upper left')
plt.hlines(y=0, xmin=-10, xmax=50, lw=2, colors='red')
plt.xlim([-10, 50])
plt.savefig('result/residuals_metric.png')
plt.show()

效果圖

可以看出,殘差隨機分佈在0值附近,總體離0值越近說明迴歸模型的擬合效果越好。對於偏離較大的殘差點,可以認為是異常值點。

 

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

均方誤差是線性模型擬合過程中,最小化誤差平方和(SSE)代價函式的平均值。MSE可以用於不同模型的比較,或是通過網格搜尋進行引數調優,以及交叉驗證等。

# 均方誤差評價指標
from sklearn.metrics import mean_squared_error
print('MSE train: %.3f, test: %.3f' % (
    mean_squared_error(y_train, y_train_pred,
                       mean_squared_error(y_test, y_test_pred))
))

結果: MSE train: 20.217, test: 28.147

 

3、決定係數

可以看做是MSE的標準化版本,用於更好地解釋模型的效能。換句話說,決定係數是模型捕獲相應反差的分數。

# 決定係數評價指標
from sklearn.metrics import r2_score
print('R^2 train: %.3f, test: %.3f' % 
      (r2_score(y_train, y_train_pred),
      r2_score(y_test, y_test_pred)))

結果: R^2 train: 0.761, test: 0.662

 

整體程式碼

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# 資料讀取
df = pd.read_csv('dataset/boston.csv', sep=',')
df.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS',
              'NOX', 'RM', 'AGE', 'DIS', 'RAD',
              'TAX', 'PTRATIO', 'LSTAT', 'MEDV']
# 所有屬性擬合線性模型
X = df.iloc[:, :-1].values
y = df[['MEDV']].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)
# 模型訓練
slr = LinearRegression()
slr.fit(X_train, y_train)
y_train_pred = slr.predict(X_train)
y_test_pred = slr.predict(X_test)

# 殘差評估方法
plt.scatter(y_train_pred, y_train_pred-y_train,
            c='blue', marker='o', label='Training data')
plt.scatter(y_test_pred, y_test_pred-y_test,
            c='lightgreen', marker='s', label='Test data')
plt.xlabel('Predicted values')
plt.ylabel('Residuals')
plt.legend(loc='upper left')
plt.hlines(y=0, xmin=-10, xmax=50, lw=2, colors='red')
plt.xlim([-10, 50])
plt.savefig('result/residuals_metric.png')
plt.show()

# 均方誤差評價指標
from sklearn.metrics import mean_squared_error
print('MSE train: %.3f, test: %.3f' % (
    mean_squared_error(y_train, y_train_pred),
    mean_squared_error(y_test, y_test_pred))
)

# 決定係數評價指標
from sklearn.metrics import r2_score
print('R^2 train: %.3f, test: %.3f' %
      (r2_score(y_train, y_train_pred),
      r2_score(y_test, y_test_pred)))