Python用正則化Lasso、嶺回歸預(yù)測房價、隨機森林交叉驗證鳶尾花數(shù)據(jù)可視化2案例
全文鏈接:https://tecdat.cn/?p=33632
原文出處:拓端數(shù)據(jù)部落公眾號
機器學(xué)習(xí)模型的表現(xiàn)不佳通常是由于過度擬合或欠擬合引起的,我們將重點關(guān)注客戶經(jīng)常遇到的過擬合情況。過度擬合是指學(xué)習(xí)的假設(shè)在訓(xùn)練數(shù)據(jù)上擬合得非常好,以至于對未見數(shù)據(jù)的模型性能造成負(fù)面影響。該模型對于訓(xùn)練數(shù)據(jù)中沒有的新實例的泛化能力較差。
復(fù)雜模型,如隨機森林、神經(jīng)網(wǎng)絡(luò)和XGBoost,更容易出現(xiàn)過度擬合。簡單模型,如線性回歸,也可能出現(xiàn)過度擬合——這通常發(fā)生在訓(xùn)練數(shù)據(jù)中的特征數(shù)量多于實例數(shù)量時。
如何檢測過度擬合?
最基本的交叉驗證實現(xiàn)類型是基于保留數(shù)據(jù)集的交叉驗證。該實現(xiàn)將可用數(shù)據(jù)分為訓(xùn)練集和測試集。要使用基于保留數(shù)據(jù)集的交叉驗證評估我們的模型,我們首先需要在保留集的訓(xùn)練部分上構(gòu)建和訓(xùn)練模型,然后使用該模型對測試集進(jìn)行預(yù)測,以評估其性能。
我們了解了過度擬合是什么,以及如何使用基于保留數(shù)據(jù)集的交叉驗證技術(shù)來檢測模型是否過度擬合。讓我們獲取一些數(shù)據(jù),并在數(shù)據(jù)上實施這些技術(shù),以檢測我們的模型是否過度擬合。
python
# 導(dǎo)入庫import pandas as pdfrom sklearn.model_selection import train_test_split# 加載數(shù)據(jù)集df = pd.DataFrame(data= dataset.data)# 將目標(biāo)標(biāo)簽添加到數(shù)據(jù)框中df["target"] = dataset.target# 分離特征和目標(biāo)標(biāo)簽X = df.iloc[:, :-1]# 分割訓(xùn)練集和測試集(基于保留數(shù)據(jù)集的交叉驗證)X_train, X_test, y_train, y_test = train_test_split(X, y, ? ? ? ? ? ? ? ? ? ? ?# 實例化模型clf = RandomForestClassifier(random_state=24)# 繪制學(xué)習(xí)曲線plot_learning_curves(X_train=X_train, ? ? ? ? ? ? ? ? ? ? y_train=y_train, ? ? ? ?

在上面的圖片中,我們可以清楚地看到我們的隨機森林模型對訓(xùn)練數(shù)據(jù)過度擬合。我們的隨機森林模型在訓(xùn)練集上有完美的分類錯誤率,但在測試集上有0.05的分類錯誤率。這可以通過散點圖上兩條線之間的間隙來說明。
另外,我們可以通過改進(jìn)模型來對抗過度擬合。我們可以通過減少隨機森林或XGBoost中的估計器數(shù)量,或者減少神經(jīng)網(wǎng)絡(luò)中的參數(shù)數(shù)量來簡化模型。我們還可以引入一種稱為“提前停止”的技術(shù),即在達(dá)到設(shè)定的訓(xùn)練輪次之前提前停止訓(xùn)練過程。
另一種簡化模型的方法是通過正則化向模型中添加偏差。
正則化是什么,為什么我們需要它?
正則化技術(shù)在機器學(xué)習(xí)模型的開發(fā)中起著至關(guān)重要的作用。尤其是復(fù)雜模型,如神經(jīng)網(wǎng)絡(luò),容易過擬合訓(xùn)練數(shù)據(jù)。從數(shù)學(xué)或機器學(xué)習(xí)的角度來看,"regularize"一詞表示我們正在使某個東西規(guī)則化。在數(shù)學(xué)或機器學(xué)習(xí)的上下文中,我們通過添加信息來使某個東西規(guī)則化,以創(chuàng)建一個可以防止過擬合的解決方案。在我們的機器學(xué)習(xí)上下文中,我們要使某個東西規(guī)則化的是"目標(biāo)函數(shù)",即我們在優(yōu)化問題中嘗試最小化的東西。
優(yōu)化問題
為了獲得我們模型的"最佳"實現(xiàn),我們可以使用優(yōu)化算法來確定最大化或最小化目標(biāo)函數(shù)的一組輸入。通常,在機器學(xué)習(xí)中,我們希望最小化目標(biāo)函數(shù)以降低模型的誤差。這就是為什么目標(biāo)函數(shù)在從業(yè)者中被稱為損失函數(shù)的原因,但也可以稱為成本函數(shù)。
有大量流行的優(yōu)化算法,包括:
斐波那契搜索
二分法
線性搜索
梯度下降
...等等
沒有正則化的梯度下降
梯度下降是一種一階優(yōu)化算法。它涉及采取與梯度相反方向的步驟,以找到目標(biāo)函數(shù)的全局最小值(或非凸函數(shù)的局部最小值)。
要用數(shù)學(xué)方式表達(dá)梯度下降的工作原理,假設(shè)N是觀測值的數(shù)量,Y_hat是實例的預(yù)測值,Y是實例的實際值。

為了確定要采取的步長(大小)以及方向,我們計算:

其中η是學(xué)習(xí)率 - 學(xué)習(xí)率是優(yōu)化算法中的一個調(diào)節(jié)參數(shù),它確定每次迭代時向最小損失函數(shù)的最小值移動的步長[來源: Wikipedia]。然后,在每次迭代之后,更新模型的權(quán)重,更新規(guī)則如下:

其中Δw是一個包含每個權(quán)重系數(shù)w的權(quán)重更新的向量。下面的函數(shù)演示了如何在Python中實現(xiàn)不帶任何正則化的梯度下降優(yōu)化算法。
為了更好地理解這一點,讓我們構(gòu)建一個人工數(shù)據(jù)集和一個沒有正則化的線性回歸模型來預(yù)測訓(xùn)練數(shù)據(jù)。
python
# 導(dǎo)入所需模塊import matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error# 加載數(shù)據(jù)df = pd.read_csv# 選擇一個特征# 為了簡單起見,只使用100個實例X = df.loc[:100, 5]y = df.loc[:100, 13] # 目標(biāo)標(biāo)簽# 重塑數(shù)據(jù)X_reshaped = X[:, np.newaxis]y_reshaped = y[:, np.newaxis]# 實例化線性回歸模型linear_regression = LinearRegression()# 訓(xùn)練模型linea# 進(jìn)行預(yù)測y_p# 評估模型mse = mea_squared_rrr(_esaped y_red)print(f"均方誤差:{mse}\n")# 繪制最佳擬合線sns.sca>>>> 均方誤差:9.7

在接下來的部分,我們將深入探討L1和L2正則化背后的直覺。
L1 正則化
L1 正則化,也被稱為 L1 范數(shù)或 Lasso(在回歸問題中),通過將參數(shù)收縮到0來防止過擬合。這使得某些特征變得不相關(guān)。
例如,假設(shè)我們想使用機器學(xué)習(xí)來預(yù)測房價??紤]以下特征:
Street?– 道路通行能力,
Neighborhood?– 物業(yè)位置,
Accessibility?– 交通便利程度,
Year Built?– 房屋建造年份,
Rooms?– 房間數(shù)量,
Kitchens?– 廚房數(shù)量,
Fireplaces?– 房屋中的壁爐數(shù)量。
當(dāng)預(yù)測房屋價值時,直覺告訴我們不同的輸入特征對價格的影響不同。例如,與火爐數(shù)量相比,社區(qū)或房間數(shù)量對房價的影響更大。
數(shù)學(xué)上,我們通過擴展損失函數(shù)來表達(dá) L1 正則化:

實質(zhì)上,當(dāng)我們使用L1正則化時,我們對權(quán)重的絕對值進(jìn)行懲罰。
盡管如此,在我們的示例回歸問題中,Lasso回歸(帶有L1正則化的線性回歸)將產(chǎn)生一個高度可解釋的模型,并且只使用了輸入特征的子集,從而降低了模型的復(fù)雜性。
以下是Python中使用Lasso回歸的示例代碼:
python
import warningswarnings.filterwarnings("ignore")import numpy as npfrom sklearn.metrics import mean_squared_error# 加載數(shù)據(jù)df = pd.read_csv(URL, header=None)# 選擇單個特征(為簡單起見,僅使用100個實例)y = df.loc[:100, 13] # 目標(biāo)標(biāo)簽 # 重塑數(shù)據(jù)y_reshaped = y[:, np.newaxis]# 實例化Lasso回歸模型lasso = Lasso# 訓(xùn)練模型lassped)# 進(jìn)行預(yù)測y_predict(X_eshed)# 評估模型print(f"均方誤差:{mse}")print(f"模型系數(shù):{lasso.coef_}\n")# 繪制最佳擬合線plt.show()
輸出結(jié)果為:
均方誤差:34.7模型系數(shù):[0.]

L2正則化
L2正則化,也被稱為L2范數(shù)或Ridge(在回歸問題中),通過將權(quán)重強制變小來防止過擬合,但不會使其完全為0。
在執(zhí)行L2正則化時,我們在損失函數(shù)中添加的正則化項是所有特征權(quán)重的平方和:

L2正則化返回的解決方案是非稀疏的,因為權(quán)重不會為零(盡管某些權(quán)重可能接近于0)。
L1正則化和L2正則化的區(qū)別:
L1正則化對權(quán)重的絕對值之和進(jìn)行懲罰,而L2正則化對權(quán)重的平方和進(jìn)行懲罰。
L1正則化的解是稀疏的,而L2正則化的解是非稀疏的。
L2正則化不進(jìn)行特征選擇,因為權(quán)重只會被減小到接近于0的值,而不是變?yōu)?。L1正則化內(nèi)置了特征選擇功能。
L1正則化對異常值具有魯棒性,而L2正則化沒有。
Python中Ridge回歸的示例代碼:
python
from sklearn.linear_model import LinearRegression, Lasso, Ridgefrom sklearn.metrics import mean_squared_error# 加載數(shù)據(jù)df = pd.read_csv(URL, header=None)# 為簡單起見,選擇一個特征和100個實例y = df.loc[:100, 13] # 目標(biāo)標(biāo)簽# 重塑數(shù)據(jù)X_reshaped = X[:, np.newaxis]# 實例化、訓(xùn)練和推斷ridge = Rdge(apha=100)print(f"均方誤差:{mse}")print(f"模型系數(shù):{ridge.coef_}\n")sns.scatterplot(X,y)plt.show()>>>> 均方誤差:25.96309109305436模型系數(shù):[[1.98542524]]

觀察Ridge回歸模型中的alpha值,它為100。超參數(shù)alpha值越大,權(quán)重值越接近于0,但不會變?yōu)?。
L1正則化和L2正則化哪個更好?
哪種正則化方法更好是一個供學(xué)者們爭論的問題。然而,作為實踐者,在選擇L1和L2正則化之間需要考慮一些重要因素。我將它們分為6個類別,并告訴你每個類別哪個解決方案更好。
哪個解決方案更魯棒? L1
L1正則化比L2正則化更具魯棒性,原因是L2正則化對權(quán)重進(jìn)行平方處理,因此數(shù)據(jù)中的異常值的代價呈指數(shù)增長。L1正則化對權(quán)重取絕對值,所以代價只會線性增長。
哪個解決方案具有更多可能性? L1
我指的是到達(dá)一個點的解決方案的數(shù)量。L1正則化使用曼哈頓距離到達(dá)一個點,所以有很多路線可以走到達(dá)一個點。L2正則化使用歐幾里得距離,這將告訴您最快到達(dá)某個點的方法。這意味著L2范數(shù)只有一個可能的解決方案。
如前所述,L2正則化僅將權(quán)重縮小到接近于0的值,而不是真正變?yōu)?。另一方面,L1正則化將值收縮到0。這實際上是一種特征選擇的形式,因為某些特征完全從模型中刪除了。
總結(jié)
在本文中,我們探討了過擬合是什么,如何檢測過擬合,損失函數(shù)是什么,正則化是什么,為什么需要正則化,L1和L2正則化的工作原理以及它們之間的區(qū)別。
最受歡迎的見解
1.R語言多元Logistic邏輯回歸 應(yīng)用案例
2.面板平滑轉(zhuǎn)移回歸(PSTR)分析案例實現(xiàn)
3.matlab中的偏最小二乘回歸(PLSR)和主成分回歸(PCR)
4.R語言泊松Poisson回歸模型分析案例
5.R語言回歸中的Hosmer-Lemeshow擬合優(yōu)度檢驗
6.r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現(xiàn)
7.在R語言中實現(xiàn)Logistic邏輯回歸
8.python用線性回歸預(yù)測股票價格
9.R語言如何在生存分析與Cox回歸中計算IDI,NRI指標(biāo)