線性迴歸模型的效能評價指標
阿新 • • 發佈:2018-11-20
本節討論下線性迴歸模型的效能評價指標
對於機器學習的兩個基本問題分類和迴歸的評價方式有所不同,分類問題一般通過分類準確率、召回率、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)))