【Python機器學習實戰】一個案例迅速入門所有的Scikit-learn迴歸模型

簡介

本文旨在通過經典的波士頓放假預測問題來實戰運行一下sk-learn中所有常見的迴歸算法,因此不涉及過多的算法講解。下面,先對本文中會用到的算法進行簡單的介紹:

  • 線性迴歸器: 線性迴歸器是最簡單、易用的迴歸模型。由於預測目標直接是實數域上的數值,因此優化目標非常簡單,即最小化預測結果和真實值間的差異。本文中我們將使用一種精確計算的解析算法(Linear Regression)和一種快速的隨機梯度下降(Stochastic Gradient Descend)算法。
  • 支持向量機(迴歸): 支持向量機(迴歸)與其分類模型作用機理有些類似,同樣是從訓練數據中選取一部分更有效的支持向量,只是這少部分的訓練樣本提供的不是類別目標,而是具體的預測數值。本文本文將使用三種不同的核函數配置SVM:線性核函數,多項式核函數(Polunomial),徑向基核函數(Radial basis function)。核函數簡單來說,就是通過某種函數計算,將原有的特徵映射到更高維度的空間,從而儘可能達到新的高維度特徵線性可分的程度,因此可以很好發揮支持向量機的模型優勢。
  • K近鄰(迴歸): KNN是一種不需要訓練參數的模型。在迴歸任務中,KNN模型同樣是藉助周圍K個最近訓練樣本的目標數值,對待測樣本的迴歸值進行預測。那麼就衍生出了不同的預測方式,是使用普通的算術平均算法,還是同時考慮距離的差異進行加權平均?因此本文同時使用了平均迴歸和根據距離加權迴歸的兩種配置的KNN。
  • 迴歸樹: 迴歸樹在選擇不同特徵作爲分裂節點的策略上與決策樹的思路類似。不同之處在於,迴歸樹的葉節點的數據類型不是離散型(即類別)而是連續型。決策樹每個葉節點依照訓練數據表現的概率傾向決定了其最終的預測類別,而回歸樹的葉節點卻是一個個具體的值。嚴格上來說,迴歸樹葉節點返回的是“一團”訓練數據的均值,而不是具體的、連續的預測值,因此嚴格的講,迴歸樹並不能算“迴歸算法”。
  • 隨機森林和極端隨機樹(Extremely Randomized Trees),ET是普通隨機森林的一個變種,與之不同的是,ET在每當構建一棵樹的分裂節點(node)的時候,不會任意的選取特徵,而是先隨機選取一些特徵,然後利用信息熵和基尼不純性等指標選擇最佳的節點特徵。本文將使用sklearn中三種集成模型:RandomForestRegressor,ExtraTreesRegressor,Gradient Boosting Regressor。

問題引出

本文使用的是sklearn集成的‘美國波士頓地區房價預測’的數據,下面我們先通過代碼看下數據描述:

from sklearn import datasets

boston = datasets.load_boston()
print(boston.DESCR)

輸出結果如下:

**Data Set Characteristics:**  

    :Number of Instances: 506 

    :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.

    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's

    :Missing Attribute Values: None

從數據描述中可以看出,該數據共有506條數據樣本,每條數據包括13項特徵,沒有缺失的屬性/特徵值(Missing Attribute Values),方便了進一步的分析。

代碼實例

數據也瞭解了,下面我們將通過上述介紹的算法,對波士頓房價數據進行擬合和預測,下面直接上代碼:

import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from sklearn.svm import SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, GradientBoostingRegressor

boston = datasets.load_boston()
# print(boston.DESCR)

X = boston.data
y = boston.target
# print(X.shape, y.shape)

#將X,y標準化,後面可以通過標準化器中的inverse_transform還原
ss_X = StandardScaler()
ss_y = StandardScaler()
X = ss_X.fit_transform(X)
y = ss_y.fit_transform(y.reshape(-1, 1)) #這裏必須用reshape(-1,1)不然會報錯
y = y.ravel()   #把y從一列變爲一行,不然下面會報錯

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=2)

#創建一個Series對象用於儲存不同迴歸模型的性能即R-Squared
r_squared = pd.Series()

#使用線性迴歸擬合數據並預測
lr = LinearRegression()
lr.fit(X_train, y_train)
y_lr_predict = lr.predict(X_test)
r_squared['linear Regression'] = lr.score(X_test, y_test)

#使用隨機梯度下降回歸擬合數據分類器
sgdr = SGDRegressor()
sgdr.fit(X_train, y_train)
y_sgdr_predict = sgdr.predict(X_test)
r_squared['SGD Regressor'] = sgdr.score(X_test, y_test)

#使用線性核函數配置的SVM進行迴歸訓練
linear_svr = SVR(kernel='linear')
linear_svr.fit(X_train, y_train)
y_linear_svr_predict = linear_svr.predict(X_test)
r_squared['linear SVM'] = linear_svr.score(X_test, y_test)

#使用多項式核函數配置的SVM進行迴歸訓練
poly_svr = SVR(kernel='poly')
poly_svr.fit(X_train, y_train)
y_poly_svr_predict = poly_svr.predict(X_train)
r_squared['Polynomial SVM'] = poly_svr.score(X_test, y_test)

#用徑向基核函數配置的SVM進行迴歸訓練
rbf_svr = SVR(kernel='rbf')
rbf_svr.fit(X_train, y_train)
y_rbf_svr_predict = rbf_svr.predict(X_test)
r_squared['RBF SVM'] = rbf_svr.score(X_test, y_test)

#使用KNN迴歸模型擬合數據,調整參數,使得預測方式爲平均迴歸
uni_knr = KNeighborsRegressor(weights='uniform')
uni_knr.fit(X_train, y_train)
y_uni_knr_predict = uni_knr.predict(X_test)
r_squared['uniform weighted KNN'] = uni_knr.score(X_test, y_test)

#使用KNN迴歸模型擬合數據,調整參數,使得預測方式爲根據距離加權迴歸
dis_knr = KNeighborsRegressor(weights='distance')
dis_knr.fit(X_train, y_train)
y_dis_knr_predict = dis_knr.predict(X_test)
r_squared['distance weighted KNN'] = dis_knr.score(X_test, y_test)

#用迴歸樹模型擬合數據並預測
dtr = DecisionTreeRegressor()
dtr.fit(X_train, y_train)
y_dtr_predict = dtr.predict(X_test)
r_squared['Dicision Tree Regressor'] = dtr.score(X_test, y_test)

#使用集成模型——隨機森林迴歸器擬合數據並預測
rfr = RandomForestRegressor()
rfr.fit(X_train, y_train)
y_rfr_predict = rfr.predict(X_test)
r_squared['Random Forest Regressor'] = rfr.score(X_test, y_test)

#使用集成模型——極端隨機樹(Extremely Randomized Trees)擬合數據並預測
etr = ExtraTreesRegressor()
etr.fit(X_train, y_train)
y_etr_predict = etr.predict(X_test)
r_squared['Extra Trees Rrgressor'] = etr.score(X_test, y_test)

#使用集成模型——梯度提升迴歸樹擬合數據並預測
gbr = GradientBoostingRegressor()
gbr.fit(X_train, y_train)
y_gbr_predict = gbr.predict(X_test)
r_squared['Gradient Boosting Regressor'] = gbr.score(X_test, y_test)

#輸出線性迴歸模型的性能,有以下三種評估方式,排序用的是R-Squared
print('R-Squared of Linear Regression:', lr.score(X_test, y_test))
print('Mean Squared Error of Linear Regression:', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(y_lr_predict)))
print('Mean Absolute Error of Linear Regression:', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(y_lr_predict)))

#輸出所有的迴歸模型的預測性能,並倒序排序
print('------------迴歸模型的R-Squared排序-------------')
print(r_squared.sort_values(ascending=False))

輸出結果:

線性迴歸模型的性能,有以下三種評估方式:
R-Squared of Linear Regression: 0.7503116174489232
Mean Squared Error of Linear Regression: 22.160198304875518
Mean Absolute Error of Linear Regression: 3.241656596795042

------------迴歸模型的R-Squared排序-------------
Gradient Boosting Regressor    0.901122
Random Forest Regressor        0.869124
Extra Trees Rrgressor          0.863499
RBF SVM                        0.834929
Polynomial SVM                 0.796276
linear Regression              0.750312
SGD Regressor                  0.741797
linear SVM                     0.733410
distance weighted KNN          0.718520
Dicision Tree Regressor        0.704389
uniform weighted KNN           0.669170
dtype: float64

小結

從上述結果我們可以看出來,使用非線性迴歸樹模型,特別是集成模型,能夠取得更高的性能表現。

  • 線性迴歸器雖然簡單易用,但是其對特徵與迴歸的線性假設侷限了其應用範圍,特別是現實生活中絕大多數實例數據不能保證嚴格的線性關係。但儘管如此,在不清楚特徵間關係的前提下,我們仍然可以使用線性迴歸模型作爲大多數科學實驗的基線系統(Baseline System)
  • 隨機梯度下降法雖然性能比解析方法的線性迴歸要差,但是在面對數據規模十分龐大的任務時,隨機梯度法不論面對迴歸還是分類表現都十分高效,在不損失過多性能的前提下,節省了大量的運算時間。因此如果數據規模大於10萬,建議選擇隨機梯度法。
  • SVM在不同的核函數配置模型下性能表現不同,因此可以在實際使用中多嘗試幾種配置,進而獲得更好的性能。
  • K近鄰(迴歸)和K近鄰(分類)一樣,均屬於無參數模型,沒有參數訓練過程,由於其模型計算方法非常直觀,因此深受初學者喜愛。
  • 對於決策樹和迴歸樹來說,樹模型的優點在於可以解決非線性特徵問題,不要求特徵標準化和統一量化,即數值和類別型特徵都可以直接用於模型構建和預測;而其缺點在於,容易由於模型搭建過於複雜而過擬合導致泛化能力差,同時,由於樹模型從上至下的預測流程會因爲數據細微的更改而發生較大的結構變化,因此預測穩定性較差。
  • 集成模型往往在工業界被用作基準的性能表現,與新設計的其他模型性能進行比對。雖然集成模型在訓練過程中要耗費更多的時間,但是往往可以提供更高的表現性能和更好的穩定性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章