【机器学习】九种顶流回归算法及实例总结
線性回歸通常是人們?yōu)闄C(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)學(xué)習(xí)的第一個(gè)算法。它簡(jiǎn)單易懂,但是由于其功能有限,在實(shí)際業(yè)務(wù)中并不是最佳選擇。大多數(shù)情況下,線性回歸被用作基線模型來評(píng)估和比較研究中的新方法。
在處理實(shí)際問題時(shí),我們應(yīng)該了解并嘗試過許多其他回歸算法。在本文中,將通過使用Scikit-learn和 XGBoost 的動(dòng)手練習(xí)來學(xué)習(xí) 9 種流行的回歸算法。本文的結(jié)構(gòu)如下:
寫在前面
本次數(shù)據(jù)使用的是一個(gè)藏在Python第三方vega_datasets模塊中的著名的數(shù)據(jù)科學(xué)公開數(shù)據(jù)集。
vega_datasets里的數(shù)據(jù)集內(nèi)容挺多,有統(tǒng)計(jì)數(shù)據(jù)也有地理數(shù)據(jù),還有不同數(shù)據(jù)量的版本,例如flights數(shù)據(jù)集包含了2k、5k、200k、3m等多個(gè)版本。調(diào)用是寫:df = data('iris')或者df = data.iris(),數(shù)據(jù)存在在Anaconda3/Lib/site-packages/vega_datasets目錄下,存本地的在local_datasets.json里有描述。本地存的有csv格式的也有json格式的。當(dāng)然你可以在公眾號(hào)『機(jī)器學(xué)習(xí)研習(xí)院』后臺(tái)回復(fù) vega_datasets 自助獲取。
導(dǎo)入和使用數(shù)據(jù)集
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數(shù)據(jù)處理
#?過濾特定列中的NaN行 df.dropna(subset=['Horsepower',?'Miles_per_Gallon'],?inplace=True) df.sort_values(by='Horsepower',?inplace=True) #?數(shù)據(jù)轉(zhuǎn)換 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 線性回歸
線性回歸通常學(xué)習(xí)機(jī)器學(xué)習(xí)與數(shù)據(jù)科學(xué)的第一個(gè)算法。線性回歸是一種線性模型,它假設(shè)輸入變量 ( X) 和單個(gè)輸出變量 ( y)之間存在線性關(guān)系。一般來說,有兩種情況:
單變量線性回歸:它表示單個(gè)輸入變量和單個(gè)的輸出變量模型之間的關(guān)系。
多變量線性回歸(也稱為多元線性回歸):它對(duì)多個(gè)輸入變量和單個(gè)輸出變量之間的關(guān)系進(jìn)行建模。
這個(gè)算法很常見,Scikit-learn[2]內(nèi)置簡(jiǎn)單線性回歸LinearRegression()算法。接下來就和小猴子一起創(chuàng)建一個(gè)LinearRegression對(duì)象,并使用訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練。
from?sklearn.linear_model?import?LinearRegression?#?創(chuàng)建和訓(xùn)練模型 linear_regressor?=?LinearRegression() linear_regressor.fit(X,?y)訓(xùn)練完成后,可以使用LinearRegression的coef_屬性中查看模型系數(shù)參數(shù):
linear_regressor.coef_array([[-0.15784473]])現(xiàn)在使用訓(xùn)練好的模型并為訓(xùn)練數(shù)據(jù)擬合一條線
#?為訓(xùn)練數(shù)據(jù)繪制點(diǎn)和擬合線 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()小結(jié)
關(guān)于線性回歸的幾個(gè)關(guān)鍵點(diǎn):
快速且易于建模
當(dāng)要建模的關(guān)系不是非常復(fù)雜并且沒有大量數(shù)據(jù)時(shí),線性回歸特別有用。
非常直觀的理解和解釋。
它對(duì)異常值非常敏感。
02 多項(xiàng)式回歸
當(dāng)想要為非線性可分?jǐn)?shù)據(jù)創(chuàng)建模型時(shí),多項(xiàng)式回歸是最受歡迎的選擇之一。它類似于線性回歸,但使用變量X和y之間的關(guān)系并為數(shù)據(jù)點(diǎn)找到繪制適合曲線的最佳方法。
對(duì)于多項(xiàng)式回歸,一些自變量的冪大于 1。例如,可能提出如下的二次模型:
β_0, β_1, 和β_2是系數(shù)
x 是一個(gè)變量/特征
ε 是殘差
Scikit-learn內(nèi)置多項(xiàng)式回歸PolynomialFeatures。首先,我們需要生成一個(gè)由所有具有指定次數(shù)的多項(xiàng)式特征組成的特征矩陣:
from?sklearn.preprocessing?import?PolynomialFeatures #?為二次模型生成矩陣 #?這里只是簡(jiǎn)單地生成X^0?X^1和X^2的矩陣 poly_reg?=?PolynomialFeatures(degree?=?2?)? X_poly?=?poly_reg.fit_transform(X)接下來,讓我們創(chuàng)建一個(gè)LinearRegression對(duì)象并將其擬合到X_poly我們剛剛生成的特征矩陣中。
#?多項(xiàng)式回歸模型 poly_reg_model?=?LinearRegression() poly_reg_model.fit(X_poly,?y)現(xiàn)在采用該模型并為訓(xùn)練數(shù)據(jù)擬合一條線,X_plot如下所示:
#?為訓(xùn)練數(shù)據(jù)繪制點(diǎn)和擬合線 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()小結(jié)
關(guān)于多項(xiàng)式回歸的幾個(gè)關(guān)鍵點(diǎn):
能夠?qū)Ψ蔷€性可分?jǐn)?shù)據(jù)進(jìn)行建模;而線性回歸不能做到這一點(diǎn)。它總體上更加靈活,可以對(duì)一些相當(dāng)復(fù)雜的關(guān)系進(jìn)行建模。
完全控制特征變量的建模(可指定設(shè)置指數(shù))。
需要精心設(shè)計(jì),需要一些數(shù)據(jù)知識(shí)才能選擇最佳指數(shù)。
如果指數(shù)選擇不當(dāng),則容易過度擬合。
03 支持向量回歸
眾所周知的支持向量機(jī)在處理分類問題時(shí)非常有效。其實(shí),SVM 也經(jīng)常用在回歸問題中,被稱為支持向量回歸(SVR)。同樣,Scikit-learn內(nèi)置了這種方法SVR()。
在擬合 SVR 模型之前,通常較好的做法是對(duì)數(shù)據(jù)進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化操作,及對(duì)特征進(jìn)行縮放。數(shù)據(jù)標(biāo)準(zhǔn)化的目的是為了確保每個(gè)特征都具有相似的重要性。我們通過StandardScaler()方法對(duì)訓(xùn)練數(shù)據(jù)操作。
from?sklearn.svm?import?SVR from?sklearn.preprocessing?import?StandardScaler?#?執(zhí)行特征縮放 scaled_X?=?StandardScaler() scaled_y?=?StandardScaler()scaled_X?=?scaled_X.fit_transform(X) scaled_y?=?scaled_y.fit_transform(y)接下來,我們創(chuàng)建了一個(gè)SVR與對(duì)象的內(nèi)核設(shè)置為'rbf'和伽瑪設(shè)置為'auto'。之后,我們調(diào)用fit()使其適合縮放的訓(xùn)練數(shù)據(jù):
svr_regressor?=?SVR(kernel='rbf',?gamma='auto') svr_regressor.fit(scaled_X,?scaled_y.ravel())現(xiàn)在采用該模型并為訓(xùn)練數(shù)據(jù)擬合一條線,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()小結(jié)
支持向量回歸的幾個(gè)關(guān)鍵點(diǎn)
它對(duì)異常值具有魯棒性并且在高維空間中有效
它具有出色的泛化能力(能夠正確適應(yīng)新的、以前看不見的數(shù)據(jù))
如果特征數(shù)量遠(yuǎn)大于樣本數(shù)量,則容易過擬合
04 決策樹回歸
決策樹 (DT) 是一種用于分類和回歸的非參數(shù)監(jiān)督學(xué)習(xí)方法 。目標(biāo)是創(chuàng)建一個(gè)樹模型,通過學(xué)習(xí)從數(shù)據(jù)特征推斷出的簡(jiǎn)單決策規(guī)則來預(yù)測(cè)目標(biāo)變量的值。一棵樹可以看作是分段常數(shù)近似。
決策樹回歸也很常見,以至于Scikit-learn內(nèi)置了DecisionTreeRegressor. 甲DecisionTreeRegressor對(duì)象可以在沒有特征縮放如下創(chuàng)建:
from?sklearn.tree?import?DecisionTreeRegressor#?不需要進(jìn)行特性縮放,因?yàn)樗鼘⒆约禾幚怼?tree_regressor?=?DecisionTreeRegressor(random_state?=?0) tree_regressor.fit(X,?y)下面使用訓(xùn)練好的模型,繪制一條擬合曲線。
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()小結(jié)
關(guān)于決策樹的幾個(gè)關(guān)鍵點(diǎn):
易于理解和解釋,并且決策樹可以被可視化顯示。
適用于離散值和連續(xù)值。
使用 DT預(yù)測(cè)數(shù)據(jù)的成本是訓(xùn)練樹的訓(xùn)練數(shù)據(jù)對(duì)數(shù)量的對(duì)數(shù)。
決策樹的預(yù)測(cè)既不平滑也不連續(xù)(顯示為分段常數(shù)近似值,如上圖所示)。
05 隨機(jī)森林回歸
一般地,隨機(jī)森林回歸與決策樹回歸非常相似,它是一個(gè)元估計(jì)器,在數(shù)據(jù)集的各種子樣本集上擬合許多決策樹,并使用平均方法來提高預(yù)測(cè)準(zhǔn)確性和控制過擬合。
隨機(jī)森林回歸器在回歸中的性能可能比決策樹好,也可能不比決策樹好(雖然它通常在分類中表現(xiàn)更好),因?yàn)闃錁?gòu)造算法本質(zhì)上存在微妙的過度擬合-欠擬合權(quán)衡。
隨機(jī)森林回歸很常見,以至于Scikit-learn內(nèi)置了RandomForestRegressor. 首先,我們需要?jiǎng)?chuàng)建一個(gè)RandomForestRegressor具有指定數(shù)量估計(jì)器的對(duì)象,如下所示:
from?sklearn.ensemble?import?RandomForestRegressorforest_regressor?=?RandomForestRegressor(n_estimators?=?300,?random_state?=?0 ) forest_regressor.fit(X,?y.ravel())下面使用訓(xùn)練好的模型,繪制一條擬合曲線。
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()小結(jié)
關(guān)于隨機(jī)森林回歸的幾個(gè)關(guān)鍵點(diǎn):
需要注意減少?zèng)Q策樹中的過擬合并提高準(zhǔn)確性
它也適用于離散值和連續(xù)值
需要大量的計(jì)算能力和資源,因?yàn)樗m合許多決策樹來組合它們的輸出
06 LASSO 回歸
LASSO 回歸是使用收縮的線性回歸的變體。收縮是數(shù)據(jù)值向中心點(diǎn)收縮作為均值的過程。這種類型的回歸非常適合顯示重度多重共線性(特征彼此之間的重度相關(guān)性)的模型。
Scikit-learn內(nèi)置了LassoCV.
from?sklearn.linear_model?import?LassoCV lasso?=?LassoCV() lasso.fit(X,?y.ravel())下面使用訓(xùn)練好的模型,繪制一條擬合曲線。
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()小結(jié)
關(guān)于套索回歸的幾點(diǎn):
它最常用于消除自動(dòng)化變量和選擇特征。
它非常適合顯示嚴(yán)重多重共線性(特征彼此高度相關(guān))的模型。
LASSO 回歸利用 L1 正則化
LASSO 回歸被認(rèn)為比 Ridge 更好,因?yàn)樗贿x擇一些特征并將其他特征的系數(shù)降低到零。
07 嶺回歸
嶺回歸與 LASSO 回歸非常相似,因?yàn)檫@兩種技術(shù)都使用收縮。Ridge 回歸和 LASSO 回歸都非常適合顯示重度多重共線性(特征彼此之間的高度相關(guān)性)的模型。它們之間的主要區(qū)別在于 Ridge 使用 L2 正則化,這意味著沒有一個(gè)系數(shù)像在 LASSO 回歸中那樣變?yōu)榱?#xff08;而是接近零)。
Scikit-learn內(nèi)置了RidgeCV.
from?sklearn.linear_model?import?RidgeCV ridge?=?RidgeCV() ridge.fit(X,?y)下面使用訓(xùn)練好的模型,繪制一條擬合曲線。
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()小結(jié)
關(guān)于嶺回歸的幾個(gè)關(guān)鍵點(diǎn):
它非常適合顯示嚴(yán)重多重共線性(特征彼此高度相關(guān))的模型。
嶺回歸使用 L2 正則化,貢獻(xiàn)較小的特征將具有接近零的系數(shù)。
由于 L2 正則化的性質(zhì),嶺回歸被認(rèn)為比 LASSO 差
08 ElasticNet 回歸
ElasticNet 是另一個(gè)使用 L1 和 L2 正則化訓(xùn)練的線性回歸模型。它是 LASSO 和嶺回歸技術(shù)的混合體,因此它也非常適合顯示嚴(yán)重多重共線性(特征彼此高度相關(guān))的模型。
Lasso 和 Ridge 之間權(quán)衡的一個(gè)實(shí)際優(yōu)勢(shì)是它允許 Elastic-Net 在旋轉(zhuǎn)時(shí)繼承一些 Ridge 的穩(wěn)定性。
Scikit-learn內(nèi)置了ElasticNetCV模型.
from?sklearn.linear_model?import?ElasticNetCV elasticNet?=?ElasticNetCV() elasticNet.fit(X,?y.ravel())下面使用訓(xùn)練好的模型,繪制一條擬合曲線。
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()小結(jié)
ElasticNet 回歸的幾個(gè)關(guān)鍵點(diǎn):
ElasticNet 總是優(yōu)于 LASSO 和 Ridge,因?yàn)樗鉀Q了兩種算法的缺點(diǎn)
ElasticNet 帶來了額外的開銷,用于確定最佳解決方案的兩個(gè) lambda 值。
09 XGBoost 回歸
極限梯度提升( XGBoost ) 是梯度提升算法的高效實(shí)現(xiàn)。梯度提升是指一類可用于分類或回歸問題的集成機(jī)器學(xué)習(xí)算法。
XGBoost是由最初開發(fā)的開放源碼庫(kù)tianqi-chen[3]在他的題為“2016論文XGBoost:可擴(kuò)展樹增壓系統(tǒng)[4]”。該算法被設(shè)計(jì)為具有計(jì)算效率和高效性。
第一步是安裝 XGBoost 庫(kù)(如果尚未安裝)。
pip?install?xgboost可以通過創(chuàng)建以下實(shí)例來定義 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:整體中的樹木數(shù)量,通常會(huì)增加,直到看不到進(jìn)一步的改進(jìn)。
max_depth:每棵樹的最大深度,通常值在 1 到 10 之間。
eta:用于對(duì)每個(gè)模型進(jìn)行加權(quán)的學(xué)習(xí)率,通常設(shè)置為較小的值,例如 0.3、0.1、0.01 或更小。
subsample:每棵樹使用的樣本數(shù),設(shè)置為0到1之間的值,通常為1.0以使用所有樣本。
colsample_bytree:每棵樹中使用的特征(列)數(shù),設(shè)置為 0 到 1 之間的值,通常為 1.0 以使用所有特征。
下面使用訓(xùn)練好的模型,繪制一條擬合曲線。
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()小結(jié)
關(guān)于 XGBoost 的幾個(gè)關(guān)鍵點(diǎn):
XGBoost 在稀疏和非結(jié)構(gòu)化數(shù)據(jù)上表現(xiàn)不佳。
該算法旨在計(jì)算高效且高效,但對(duì)于大型數(shù)據(jù)集而言,訓(xùn)練時(shí)間仍然相當(dāng)長(zhǎng)
對(duì)異常值很敏感
寫在最后
到這里本文就結(jié)束啦,本文我們通過使用Scikit-learn和 XGBoost 的動(dòng)手實(shí)踐介紹了 九種流行的回歸算法。在解決實(shí)際問題時(shí),可以嘗試不同的算法并找到解決實(shí)際問題的最佳回歸模型。
參考資料
[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]可擴(kuò)展樹增壓系統(tǒng): https://arxiv.org/abs/1603.02754
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載(圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載中國(guó)大學(xué)慕課《機(jī)器學(xué)習(xí)》(黃海廣主講)機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【机器学习】九种顶流回归算法及实例总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集成 websocket 的四种方案
- 下一篇: CAS和Synchronized知识