1.數據集的導入以及自變量和因變量的選取
作為機器學習的入門知識點和模型,網上有很多sklearn庫實現線性回歸的例子。不過在這里我會從最開始的模型訓練到最后的模型調優,統一地進行一個練習,以便對線性回歸有個更深入淺出的理解。
首先我們先導入一些相關的包:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_predict, train_test_split
from sklearn import datasets
%matplotlib inline
mpl.rcParams['font.family'] = ['sans-serif']
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus']=False
作為回歸模型練習的數據集,就從經典的波士頓房價數據集來進行訓練就好,這也是sklearn庫中自帶的小數據集。在這里,作為自變量X的就是數據集中的feature_names維度,總共有13個維度,所以這是一個多元線性回歸模型;因變量y就是我們數據集中的target維度——房價。
data = datasets.load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
target = pd.DataFrame(data.target, columns=['MEDV'])
X = df
y = target
2.劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
print(X_train.shape)
print(X_test.shape)
可以看到由于參數test_size是0.5,所以訓練集和測試集對半分,維度都是13.
3.模型的訓練
劃分好訓練集和測試集后,就是對模型進行訓練了,然后我們輸出截距和權重系數,看下模型
lr = LinearRegression()
lr.fit(X_train, y_train)
print(lr.coef_)
print(lr.intercept_)
因此,波士頓房價的多元線性模型就此誕生,下面就要評估下這兩個系數擬合的模型能否相對準確地預測出因變量y——房價了。
4.模型的評估
對于多元線性回歸模型的評估,主要有四種指標,這里我選用了RMSE——均方差根,數值越小說明模型擬合度越高
y_pred = lr.predict(X_test)
from sklearn import metrics
MSE = metrics.mean_squared_error(y_test, y_pred)
RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
print('MSE:',MSE)
print('RMSE:',RMSE)
圖中可以看到RMSE有4.779,說明擬合度還不夠高,我們通過可視化來看一下訓練后的預測和真實值之間的差異:
plt.figure(figsize=(15,5))
plt.plot(range(len(y_test)), y_test, 'r', label='測試數據')
plt.plot(range(len(y_test)), y_pred, 'b', label='預測數據')
plt.legend()
可以看到許多地方,紅線會明顯超出藍線,說明的確,我們的模型擬合度不夠,再換個散點圖來更直觀地看一下:
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(),y_test.max()], [y_test.min(),y_test.max()], 'k--')
plt.xlabel('真實值')
plt.ylabel('預測值')
圖中我們可以看到,如果完全擬合,散點應該和直線相重合,這里發現,y_test=50的地方,有較多的異常值,而線性回歸模型的一大缺點就是對異常值很敏感,會極大影響模型的準確性,因此,下一步,我們就根據這一點,對模型進行優化
5.模型調優
# 去除MEDV=50的異常值
drop_index = y[y['MEDV']==50].index.values
X = X.drop(drop_index)
y = y.drop(drop_index)
# 這里劃分訓練集和測試集的參數random_state都是1,表示隨機分配的數據是同一組
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)
# 對訓練集進行訓練
lr = LinearRegression()
lr.fit(X_train, y_train)
# 對測試集進行預測
y_pred = lr.predict(X_test)
RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
print('RMSE:',RMSE)
可以看到,該模型的RMSE變成了3.573,大大提高了模型的準確率。這里我對回歸模型的調優主要是兩個方面:1. 增加了訓練集的數量,提高訓練準確度;2. 去除異常值,提高準確度。
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(),y_test.max()], [y_test.min(),y_test.max()], 'k--')
plt.xlabel('真實值')
plt.ylabel('預測值')
總結:
線性回歸模型的評估可以根據RMSE來判斷;調優模型主要通過放大訓練集數量以及排除異常值來進行;LinearRegression本身的參數只有四個,大多數情況下也不需要進行參數調整,默認的就OK。