【机器学习】九种顶流回归算法及实例总结
線性回歸通常是人們為機器學習和數據科學學習的第一個算法。它簡單易懂,但是由于其功能有限,在實際業務中并不是最佳選擇。大多數情況下,線性回歸被用作基線模型來評估和比較研究中的新方法。
在處理實際問題時,我們應該了解并嘗試過許多其他回歸算法。在本文中,將通過使用Scikit-learn和 XGBoost 的動手練習來學習 9 種流行的回歸算法。本文的結構如下:
寫在前面
本次數據使用的是一個藏在Python第三方vega_datasets模塊中的著名的數據科學公開數據集。
vega_datasets里的數據集內容挺多,有統計數據也有地理數據,還有不同數據量的版本,例如flights數據集包含了2k、5k、200k、3m等多個版本。調用是寫:df = data('iris')或者df = data.iris(),數據存在在Anaconda3/Lib/site-packages/vega_datasets目錄下,存本地的在local_datasets.json里有描述。本地存的有csv格式的也有json格式的。當然你可以在公眾號『機器學習研習院』后臺回復 vega_datasets 自助獲取。
導入和使用數據集
df?=?data.cars() df.head()df.info()<class 'pandas.core.frame.DataFrame'> RangeIndex: 406 entries, 0 to 405 Data columns (total 9 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 Name 406 non-null object 1 Miles_per_Gallon 398 non-null float64 2 Cylinders 406 non-null int64 3 Displacement 406 non-null float64 4 Horsepower 400 non-null float64 5 Weight_in_lbs 406 non-null int64 6 Acceleration 406 non-null float64 7 Year 406 non-null datetime64[ns]8 Origin 406 non-null object dtypes: datetime64[ns](1 "ns"), float64(4), int64(2), object(2) memory usage: 28.7+ KB數據處理
#?過濾特定列中的NaN行 df.dropna(subset=['Horsepower',?'Miles_per_Gallon'],?inplace=True) df.sort_values(by='Horsepower',?inplace=True) #?數據轉換 X?=?df['Horsepower'].to_numpy().reshape(-1,?1) y?=?df['Miles_per_Gallon'].to_numpy().reshape(-1,?1) plt.scatter(X,?y,?color='teal',?edgecolors='black',?label='Horsepower?vs.?Miles_per_Gallon') plt.legend() plt.show()01 線性回歸
線性回歸通常學習機器學習與數據科學的第一個算法。線性回歸是一種線性模型,它假設輸入變量 ( X) 和單個輸出變量 ( y)之間存在線性關系。一般來說,有兩種情況:
單變量線性回歸:它表示單個輸入變量和單個的輸出變量模型之間的關系。
多變量線性回歸(也稱為多元線性回歸):它對多個輸入變量和單個輸出變量之間的關系進行建模。
這個算法很常見,Scikit-learn[2]內置簡單線性回歸LinearRegression()算法。接下來就和小猴子一起創建一個LinearRegression對象,并使用訓練數據進行訓練。
from?sklearn.linear_model?import?LinearRegression?#?創建和訓練模型 linear_regressor?=?LinearRegression() linear_regressor.fit(X,?y)訓練完成后,可以使用LinearRegression的coef_屬性中查看模型系數參數:
linear_regressor.coef_array([[-0.15784473]])現在使用訓練好的模型并為訓練數據擬合一條線
#?為訓練數據繪制點和擬合線 plt.scatter(X,?y,?color='RoyalBlue',?edgecolors='black',?label='Horsepower?vs.?Miles_per_Gallon') plt.plot(X,?linear_regressor.predict(X),?color='orange',?label='Linear?regressor') plt.title('Linear?Regression') plt.legend() plt.show()小結
關于線性回歸的幾個關鍵點:
快速且易于建模
當要建模的關系不是非常復雜并且沒有大量數據時,線性回歸特別有用。
非常直觀的理解和解釋。
它對異常值非常敏感。
02 多項式回歸
當想要為非線性可分數據創建模型時,多項式回歸是最受歡迎的選擇之一。它類似于線性回歸,但使用變量X和y之間的關系并為數據點找到繪制適合曲線的最佳方法。
對于多項式回歸,一些自變量的冪大于 1。例如,可能提出如下的二次模型:
β_0, β_1, 和β_2是系數
x 是一個變量/特征
ε 是殘差
Scikit-learn內置多項式回歸PolynomialFeatures。首先,我們需要生成一個由所有具有指定次數的多項式特征組成的特征矩陣:
from?sklearn.preprocessing?import?PolynomialFeatures #?為二次模型生成矩陣 #?這里只是簡單地生成X^0?X^1和X^2的矩陣 poly_reg?=?PolynomialFeatures(degree?=?2?)? X_poly?=?poly_reg.fit_transform(X)接下來,讓我們創建一個LinearRegression對象并將其擬合到X_poly我們剛剛生成的特征矩陣中。
#?多項式回歸模型 poly_reg_model?=?LinearRegression() poly_reg_model.fit(X_poly,?y)現在采用該模型并為訓練數據擬合一條線,X_plot如下所示:
#?為訓練數據繪制點和擬合線 plt.scatter(X,?y,?color='DarkTurquoise',?edgecolors='black',?label='Horsepower?vs.?Miles_per_Gallon') plt.plot(X,?poly_reg_model.predict(X_poly),?color='orange',?label='Polynmial?regressor') plt.title('Polynomial?Regression') plt.legend() plt.show()小結
關于多項式回歸的幾個關鍵點:
能夠對非線性可分數據進行建模;而線性回歸不能做到這一點。它總體上更加靈活,可以對一些相當復雜的關系進行建模。
完全控制特征變量的建模(可指定設置指數)。
需要精心設計,需要一些數據知識才能選擇最佳指數。
如果指數選擇不當,則容易過度擬合。
03 支持向量回歸
眾所周知的支持向量機在處理分類問題時非常有效。其實,SVM 也經常用在回歸問題中,被稱為支持向量回歸(SVR)。同樣,Scikit-learn內置了這種方法SVR()。
在擬合 SVR 模型之前,通常較好的做法是對數據進行數據標準化操作,及對特征進行縮放。數據標準化的目的是為了確保每個特征都具有相似的重要性。我們通過StandardScaler()方法對訓練數據操作。
from?sklearn.svm?import?SVR from?sklearn.preprocessing?import?StandardScaler?#?執行特征縮放 scaled_X?=?StandardScaler() scaled_y?=?StandardScaler()scaled_X?=?scaled_X.fit_transform(X) scaled_y?=?scaled_y.fit_transform(y)接下來,我們創建了一個SVR與對象的內核設置為'rbf'和伽瑪設置為'auto'。之后,我們調用fit()使其適合縮放的訓練數據:
svr_regressor?=?SVR(kernel='rbf',?gamma='auto') svr_regressor.fit(scaled_X,?scaled_y.ravel())現在采用該模型并為訓練數據擬合一條線,scaled_X如下所示:
plt.scatter(scaled_X,?scaled_y,?color='DarkTurquoise',?edgecolors='black',?label='Train') plt.plot(scaled_X,?svr_regressor.predict(scaled_X),?color='orange',?label='SVR') plt.title('Simple?Vector?Regression') plt.legend() plt.show()小結
支持向量回歸的幾個關鍵點
它對異常值具有魯棒性并且在高維空間中有效
它具有出色的泛化能力(能夠正確適應新的、以前看不見的數據)
如果特征數量遠大于樣本數量,則容易過擬合
04 決策樹回歸
決策樹 (DT) 是一種用于分類和回歸的非參數監督學習方法 。目標是創建一個樹模型,通過學習從數據特征推斷出的簡單決策規則來預測目標變量的值。一棵樹可以看作是分段常數近似。
決策樹回歸也很常見,以至于Scikit-learn內置了DecisionTreeRegressor. 甲DecisionTreeRegressor對象可以在沒有特征縮放如下創建:
from?sklearn.tree?import?DecisionTreeRegressor#?不需要進行特性縮放,因為它將自己處理。 tree_regressor?=?DecisionTreeRegressor(random_state?=?0) tree_regressor.fit(X,?y)下面使用訓練好的模型,繪制一條擬合曲線。
X_grid?=?np.arange(min(X),?max(X),?0.01) X_grid?=?X_grid.reshape(len(X_grid),?1)plt.scatter(X,?y,?color='DarkTurquoise',?edgecolors='black',?label='Train') plt.plot(X_grid,?tree_regressor.predict(X_grid),?color='orange',?label='Tree?regressor') plt.title('Tree?Regression') plt.legend() plt.show()小結
關于決策樹的幾個關鍵點:
易于理解和解釋,并且決策樹可以被可視化顯示。
適用于離散值和連續值。
使用 DT預測數據的成本是訓練樹的訓練數據對數量的對數。
決策樹的預測既不平滑也不連續(顯示為分段常數近似值,如上圖所示)。
05 隨機森林回歸
一般地,隨機森林回歸與決策樹回歸非常相似,它是一個元估計器,在數據集的各種子樣本集上擬合許多決策樹,并使用平均方法來提高預測準確性和控制過擬合。
隨機森林回歸器在回歸中的性能可能比決策樹好,也可能不比決策樹好(雖然它通常在分類中表現更好),因為樹構造算法本質上存在微妙的過度擬合-欠擬合權衡。
隨機森林回歸很常見,以至于Scikit-learn內置了RandomForestRegressor. 首先,我們需要創建一個RandomForestRegressor具有指定數量估計器的對象,如下所示:
from?sklearn.ensemble?import?RandomForestRegressorforest_regressor?=?RandomForestRegressor(n_estimators?=?300,?random_state?=?0 ) forest_regressor.fit(X,?y.ravel())下面使用訓練好的模型,繪制一條擬合曲線。
X_grid?=?np.arange(min(X),?max(X),?0.01) X_grid?=?X_grid.reshape(len(X_grid),?1)plt.scatter(X,?y,?color='DarkTurquoise',?edgecolors='black',?label='Train') plt.plot(X_grid,?forest_regressor.predict(X_grid),?color='orange',?label='Random?Forest?regressor') plt.title('Random?Forest?Regression') plt.legend() plt.show()小結
關于隨機森林回歸的幾個關鍵點:
需要注意減少決策樹中的過擬合并提高準確性
它也適用于離散值和連續值
需要大量的計算能力和資源,因為它適合許多決策樹來組合它們的輸出
06 LASSO 回歸
LASSO 回歸是使用收縮的線性回歸的變體。收縮是數據值向中心點收縮作為均值的過程。這種類型的回歸非常適合顯示重度多重共線性(特征彼此之間的重度相關性)的模型。
Scikit-learn內置了LassoCV.
from?sklearn.linear_model?import?LassoCV lasso?=?LassoCV() lasso.fit(X,?y.ravel())下面使用訓練好的模型,繪制一條擬合曲線。
plt.scatter(X,?y,?color='teal',?edgecolors='black',?label='Actual?observation?points') plt.plot(X,?lasso.predict(X),?color='orange',label='LASSO?regressor') plt.title('LASSO?Regression') plt.legend() plt.show()小結
關于套索回歸的幾點:
它最常用于消除自動化變量和選擇特征。
它非常適合顯示嚴重多重共線性(特征彼此高度相關)的模型。
LASSO 回歸利用 L1 正則化
LASSO 回歸被認為比 Ridge 更好,因為它只選擇一些特征并將其他特征的系數降低到零。
07 嶺回歸
嶺回歸與 LASSO 回歸非常相似,因為這兩種技術都使用收縮。Ridge 回歸和 LASSO 回歸都非常適合顯示重度多重共線性(特征彼此之間的高度相關性)的模型。它們之間的主要區別在于 Ridge 使用 L2 正則化,這意味著沒有一個系數像在 LASSO 回歸中那樣變為零(而是接近零)。
Scikit-learn內置了RidgeCV.
from?sklearn.linear_model?import?RidgeCV ridge?=?RidgeCV() ridge.fit(X,?y)下面使用訓練好的模型,繪制一條擬合曲線。
plt.scatter(X,?y,?color='teal',?edgecolors='black',?label='Train') plt.plot(X,?ridge.predict(X),?color='orange',?label='Ridge?regressor') plt.title('Ridge?Regression') plt.legend() plt.show()小結
關于嶺回歸的幾個關鍵點:
它非常適合顯示嚴重多重共線性(特征彼此高度相關)的模型。
嶺回歸使用 L2 正則化,貢獻較小的特征將具有接近零的系數。
由于 L2 正則化的性質,嶺回歸被認為比 LASSO 差
08 ElasticNet 回歸
ElasticNet 是另一個使用 L1 和 L2 正則化訓練的線性回歸模型。它是 LASSO 和嶺回歸技術的混合體,因此它也非常適合顯示嚴重多重共線性(特征彼此高度相關)的模型。
Lasso 和 Ridge 之間權衡的一個實際優勢是它允許 Elastic-Net 在旋轉時繼承一些 Ridge 的穩定性。
Scikit-learn內置了ElasticNetCV模型.
from?sklearn.linear_model?import?ElasticNetCV elasticNet?=?ElasticNetCV() elasticNet.fit(X,?y.ravel())下面使用訓練好的模型,繪制一條擬合曲線。
plt.scatter(X,?y,?color='DarkTurquoise',?edgecolors='black',?label='Train') plt.plot(X,?elasticNet.predict(X),?color='orange',label='ElasticNet?regressor') plt.title('ElasticNet?Regression') plt.legend() plt.show()小結
ElasticNet 回歸的幾個關鍵點:
ElasticNet 總是優于 LASSO 和 Ridge,因為它解決了兩種算法的缺點
ElasticNet 帶來了額外的開銷,用于確定最佳解決方案的兩個 lambda 值。
09 XGBoost 回歸
極限梯度提升( XGBoost ) 是梯度提升算法的高效實現。梯度提升是指一類可用于分類或回歸問題的集成機器學習算法。
XGBoost是由最初開發的開放源碼庫tianqi-chen[3]在他的題為“2016論文XGBoost:可擴展樹增壓系統[4]”。該算法被設計為具有計算效率和高效性。
第一步是安裝 XGBoost 庫(如果尚未安裝)。
pip?install?xgboost可以通過創建以下實例來定義 XGBoost 模型XGBRegressor:
from?xgboost?import?XGBRegressor #?create?an?xgboost?regression?model model?=?XGBRegressor(n_estimators=1000,?max_depth=7,?eta=0.1,?subsample=0.7,?colsample_bytree=0.8, )n_estimators:整體中的樹木數量,通常會增加,直到看不到進一步的改進。
max_depth:每棵樹的最大深度,通常值在 1 到 10 之間。
eta:用于對每個模型進行加權的學習率,通常設置為較小的值,例如 0.3、0.1、0.01 或更小。
subsample:每棵樹使用的樣本數,設置為0到1之間的值,通常為1.0以使用所有樣本。
colsample_bytree:每棵樹中使用的特征(列)數,設置為 0 到 1 之間的值,通常為 1.0 以使用所有特征。
下面使用訓練好的模型,繪制一條擬合曲線。
plt.scatter(X,?y,?color='DarkTurquoise',?edgecolors='black',?label='Train') plt.plot(X,?model.predict(X),?color='orange',label='XGBoost?regressor') plt.title('XGBoost?Regression') plt.legend() plt.show()小結
關于 XGBoost 的幾個關鍵點:
XGBoost 在稀疏和非結構化數據上表現不佳。
該算法旨在計算高效且高效,但對于大型數據集而言,訓練時間仍然相當長
對異常值很敏感
寫在最后
到這里本文就結束啦,本文我們通過使用Scikit-learn和 XGBoost 的動手實踐介紹了 九種流行的回歸算法。在解決實際問題時,可以嘗試不同的算法并找到解決實際問題的最佳回歸模型。
參考資料
[1]
參考原文: https://towardsdatascience.com/a-practical-introduction-to-9-regression-algorithms-389057f86eb9
[2]Scikit-learn: https://scikit-learn.org/stable/
[3]tianqi-chen: https://www.linkedin.com/in/tianqi-chen-679a9856/
[4]可擴展樹增壓系統: https://arxiv.org/abs/1603.02754
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习】九种顶流回归算法及实例总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集成 websocket 的四种方案
- 下一篇: CAS和Synchronized知识