五種回歸方法的比較
引言
線性和邏輯回歸通常是人們為機器學習和數據科學學習的第一個建模算法。 兩者都很棒,因為它們易於使用和解釋。 然而,它們固有的簡單性也有一些缺點,在許多情況下它們並不是回歸模型的最佳選擇。 實際上有幾種不同類型的回歸,每種都有自己的優點和缺點。
在這篇文章中,我們將討論5種最常見的回歸算法及其屬性,同時評估他們的性能。 最後,希望讓您更全面地了解回歸模型!
目錄
- 線性回歸
- 多項式回歸
- 嶺回歸
- 套索回歸
- 彈性網絡回歸
線性回歸(Linear Regression)
回歸是一種用於建模和分析變量之間關系的技術,通常是它們如何結合並且與一起產生特定結果相關。 線性回歸指的是完全由線性變量組成的回歸模型。 從簡單的情況開始,單變量線性回歸是一種技術,用於使用線性模型對單個輸入自變量和輸出因變量之間的關系進行建模。
更一般的情況是多變量線性回歸,其中為多個獨立輸入變量(特征變量)和輸出因變量之間的關系創建模型。 模型保持線性,輸出是輸入變量的線性組合。 我們可以建模多變量線性回歸,如下所示:
其中a_n是系數,X_n是變量,b是偏差。 我們可以看到,此函數不包含任何非線性,因此僅適用於對線性可分離數據進行建模,因為我們只是使用系數權重a_n來加權每個特征變量X_n的重要性。
關於線性回歸的幾個關鍵點:
- 建模快速簡便,當要建模的關系不是非常復雜且沒有大量數據時尤其有用。
- 非常直觀地理解和解釋。
- 線性回歸對異常值非常敏感。
python實例:
import numpy as np import pandas as pd from sklearn import datasets from sklearn import metrics data=datasets.load_boston()# load data #定義評估函數 def evaluation(y_true,y_pred,index_name=[‘OLS‘]): df=pd.DataFrame(index=[index_name],columns=[‘平均絕對誤差‘,‘均方誤差‘,‘r2‘]) df[‘平均絕對誤差‘]=metrics.mean_absolute_error(y_true, y_pred).round(4) df[‘均方誤差‘]=metrics.mean_squared_error(y_true,y_pred) df[‘r2‘]=metrics.r2_score(y_true,y_pred) return df
df=pd.DataFrame(data.data,columns=data.feature_names) target=pd.DataFrame(data.target,columns=[‘MEDV‘])
簡單的可視化分析:
import matplotlib.pyplot as plt import seaborn as sns sns.set(style="whitegrid", color_codes=True) g=sns.pairplot(data[list(data.columns)[:5]], hue=‘ZN‘,palette="husl",diag_kind="hist",size=2.5) for ax in g.axes.flat: plt.setp(ax.get_xticklabels(), rotation=45) plt.tight_layout()
特征的相關系數圖:
cm = np.corrcoef(data[list(data.columns)[:5]].values.T) #corrcoef方法按行計算皮爾遜相關系數,cm是對稱矩陣 #使用np.corrcoef(a)可計算行與行之間的相關系數,np.corrcoef(a,rowvar=0)用於計算各列之間的相關系數,輸出為相關系數矩陣。 sns.set(font_scale=1.5) #font_scale設置字體大小 cols=list(data.columns)[:5] hm = sns.heatmap(cm,cbar=True,annot=True,square=True,fmt=‘.2f‘,annot_kws={‘size‘: 15},yticklabels=cols,xticklabels=cols) # plt.tight_layout() # plt.savefig(‘./figures/corr_mat.png‘, dpi=300)
用statsmodels模塊的OLS
import statsmodels.api as sm X=df[df.columns].values y=target[‘MEDV‘].values #add constant X=sm.add_constant(X) # build model model=sm.OLS(y,X).fit() prediction=model.predict(X) print(model.summary())
也可以用sklearn模塊:
from sklearn import linear_model lm = linear_model.LinearRegression() model = lm.fit(X,y) y_pred = lm.predict(X) lm.score(X,y) #系數 lm.coef_ #截距 lm.intercept_
evaluation(y,y_pred)
多項式回歸(Polynomial Regression)
當我們想要創建一個適合處理非線性可分數據的模型時,我們需要使用多項式回歸。 在這種回歸技術中,最佳擬合線不是直線。 它是一條適合數據點的曲線。 對於多項式回歸,一些自變量的冪大於1.例如:
我們可以讓一些變量具有指數,其他變量沒有指數,並且還為每個變量選擇我們想要的精確指數。 但是,選擇每個變量的精確指數自然需要了解數據如何與輸出相關。
note:
- 能夠建模非線性可分離數據; 線性回歸不能做到這一點。 它通常更靈活,可以建立一些相當復雜的關系。
- 完全控制特征變量的建模(指定要設置)。
- 需要仔細設計。 需要一些數據知識才能選擇最佳指數。
- 如果指數選擇不當,容易過度擬合。
python實例:
from sklearn.preprocessing import PolynomialFeatures poly_reg = PolynomialFeatures(degree = 4) X_Poly = poly_reg.fit_transform(X) lin_reg_2 =linear_model.LinearRegression() lin_reg_2.fit(X_Poly, y) y_pred=lin_reg_2.predict(poly_reg.fit_transform(X)) evaluation(y,y_pred,index_name=[‘poly_reg‘])
可以看到,誤差很小,r2很大,模型已經過擬合。
嶺回歸(ride regression)
在特征變量之間存在高共線性的情況下,標準線性或多項式回歸將失敗。 共線性是獨立變量之間存在近線性關系。 高共線性的存在可以通過幾種不同的方式確定:
- 即使理論上該變量應該與Y高度相關,回歸系數也不顯著。
- 添加或刪除X特征變量時,回歸系數會發生顯著變化。
- X特征變量具有高成對相關性(檢查相關矩陣)。
我們首先可以看一下標準線性回歸的優化函數,以獲得有關嶺回歸如何幫助的一些見解:
其中X代表特征變量,w代表權重,y代表實際值。 嶺回歸是一種補救措施,用於緩解回歸模型中預測變量之間的共線性。 由於特征變量存在共線性,因此最終回歸模型具有高方差。
為了緩解這個問題,Ridge Regression為變量添加了一個小的平方偏差因子:
在模型中引入少量偏差,但大大減小了方差。
note:
- 該回歸的假設與最小二乘回歸類似,但沒有正態性假設。
- 它會縮小系數的值,但不會達到零,這表明沒有特征選擇功能
python實例:
from sklearn.linear_model import Ridge ridge_reg = Ridge(alpha=1, solver="cholesky") ridge_reg.fit(X, y) y_pred=ridge_reg.predict(X evaluation(y,y_pred,index_name=‘ridge_reg‘)
套索回歸(lasso regression)
套索回歸與嶺回歸非常相似,因為兩種技術都具有相同的前提。 我們再次為回歸優化函數添加一個偏置項,以減少共線性的影響,從而減小模型方差。 然而,不是使用像嶺回歸那樣的平方偏差,而套索回歸使用絕對值偏差:
Ridge和Lasso回歸之間存在一些差異,這些差異基本上可以回歸到L2和L1正則化的屬性差異:
- 內置特征選擇:經常被提及為L1範數的有用屬性,而L2範數則不然。這實際上是L1範數的結果,它傾向於產生稀疏系數。例如,假設模型有100個系數,但只有10個系數具有非零系數,這實際上是說“其他90個預測變量在預測目標值方面毫無用處”。 L2範數產生非稀疏系數,因此不具有此屬性。因此,可以說Lasso回歸做了一種“參數選擇”,因為未選擇的特征變量的總權重為0。
- 稀疏性:指矩陣(或向量)中只有極少數條目為非零。 L1範數具有產生許多具有零值的系數或具有很少大系數的非常小的值的特性。這與Lasso執行一種特征選擇的前一點相關聯。
- 計算效率:L1範數沒有解析解,但L2有。在計算上可以有效地計算L2範數解。然而,L1範數具有稀疏性屬性,允許它與稀疏算法一起使用,這使得計算在計算上更有效。
from sklearn.linear_model import Lasso lasso_reg = Lasso(alpha=0.1) lasso_reg.fit(X, y) y_pred=lasso_reg.predict(X) evaluation(y,y_pred,index_name=‘lasso_reg‘)
彈性網絡回歸(ElasticNet Regression)
ElasticNet是Lasso和Ridge Regression技術的混合體。 它使用L1和L2正則化來考慮兩種技術的影響:
在Lasso和Ridge之間進行權衡的一個實際優勢是:它允許Elastic-Net在旋轉下繼承Ridge的一些穩定性。
note:
- 它在高度相關的變量的情況下鼓勵群體效應,而不是像Lasso那樣將其中的一些歸零。
- 所選變量的數量沒有限制。
python實例:
enet_reg = linear_model.ElasticNet(l1_ratio=0.7) enet_reg.fit(X,y) y_pred=enet_reg.predict(X) evaluation(y,y_pred,index_name=‘enet_reg ‘)
小結:
這篇文章簡單總結了5種常見類型的回歸及其屬性。 所有這些回歸正則化方法(Lasso,Ridge和ElasticNet)在數據集中變量之間的高維度和多重共線性的情況下都能很好地工作。 希望對大家有幫助!
五種回歸方法的比較