當前位置:網站首頁>【機器學習05】LASSO回歸與ElasticNet(彈性網)

【機器學習05】LASSO回歸與ElasticNet(彈性網)

2022-05-14 15:26:33執志@*飛揚か

5 LASSO回歸

5.1 簡介

LASSO回歸:在模型迭代過程所依據的代價函數中增加了正則懲罰項(L1範數正則化),以限制模型參數對异常樣本的匹配程度,進而提高模型面對多數正常樣本的擬合精度,解决過擬合問題

代價函數

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∥ θ ∥ 1 = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \left\|\theta\right\|_1=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum\limits_{j=1}^n\left|{ {\theta _j}}\right| J(θ)=2m1i=1m(hθ(x(i))y(i))2+λθ1=2m1i=1m(hθ(x(i))y(i))2+λj=1nθj

說明:λ>0

  1. L1範數:向量中的各個元素絕對值之和,即 ∥ θ ∥ 1 = ∑ j = 1 n ∣ θ j ∣ {\left\| \theta \right\|_1} = \sum\limits_{j = 1}^n {\left| { {\theta _j}} \right|} θ1=j=1nθj
  2. 正則强度λ(懲罰因子)越大,曲線的擬合度越低,忽略异常樣本(噪音)的效果越好

5.2 Sklearn之LASSO回歸

LASSO回歸相關API:

# sklearn庫
import sklearn.linear_model as lm

# 創建模型
model=lm.Lasso(正則强度,fit_intercept=是否訓練截距,max_iter=最大迭代次數,normalize=是否特征歸一化)
# 訓練模型
# 輸入:一個二維數組錶示的樣本矩陣
# 輸出:每個樣本最終的結果
model.fit(輸入,輸出)
# 預測輸出
# 輸入array是一個二維數組,每一行是一個樣本,每一列是一個特征
result=model.predict(array)

案例:加載abnormal.txt文件中的數據,基於LASSO回歸算法訓練回歸模型

import numpy as np
import matplotlib.pyplot as plt
# sklearn庫
import sklearn.linear_model as lm

# 加載數據:讀文本
def loaddata():
    # x,y=np.loadtxt("data/abnormal.txt",delimiter=",",unpack=True)
    data=np.loadtxt("data/abnormal.txt",delimiter=",")
    cols=data.shape[1]    # data.shape[1]:列數
    x=data[:,0:cols-1] 
    y=data[:,-1].reshape(-1,1)          # data[:,-1]:獲取所有行的最後一列
    return x,y

x,y=loaddata()

## LASSO回歸
model=lm.Lasso(0.01,fit_intercept=True,max_iter=1000,normalize=True)  # 模型構建
model.fit(x,y)  # 模型訓練 
print("\n")
print("系數:",model.coef_)
print("截距:",model.intercept_)
pred_y=model.predict(x)     # 模型預測
plt.title("modelLASSO Regression")
plt.scatter(x,y)
plt.plot(x,pred_y)

6 ElasticNet(彈性網)

6.1 簡介

ElasticNet(彈性網):在模型迭代過程所依據的代價函數中結合了L1範數正則化與L2範數正則化,以限制模型參數對异常樣本的匹配程度,進而提高模型面對多數正常樣本的擬合精度,解决過擬合問題

代價函數

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ( ρ ∥ θ ∥ 1 + ( 1 − ρ ) ∥ θ ∥ 2 2 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ( ρ ∑ j = 1 n ∣ θ j ∣ + ( 1 − ρ ) ∑ j = 1 n θ j 2 ) J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \left( {\rho { {\left\| \theta \right\|}_1} + \left( {1 - \rho } \right)\left\| \theta \right\|_2^2} \right)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \left( {\rho \sum\limits_{j = 1}^n {\left| { {\theta _j}} \right|} + \left( {1 - \rho } \right)\sum\limits_{j = 1}^n {\theta _j^2} } \right) J(θ)=2m1i=1m(hθ(x(i))y(i))2+λ(ρθ1+(1ρ)θ22)=2m1i=1m(hθ(x(i))y(i))2+λ(ρj=1nθj+(1ρ)j=1nθj2)

說明:λ>0,0≤ρ≤1(權重占比)

  1. L1範數:向量中的各個元素絕對值之和
  2. L2範數:向量中的各個元素平方之和的開平方
  3. 正則强度λ(懲罰因子)越大,曲線的擬合度越低,忽略异常樣本(噪音)的效果越好

5.2 Sklearn之ElasticNet

ElasticNet相關API:

# sklearn庫
import sklearn.linear_model as lm

# 創建模型
model=lm.ElasticNet(正則强度,l1_ratio=L1正則懲罰項權重占比,fit_intercept=是否訓練截距,max_iter=最大迭代次數,normalize=是否特征歸一化)
# 訓練模型
# 輸入:一個二維數組錶示的樣本矩陣
# 輸出:每個樣本最終的結果
model.fit(輸入,輸出)
# 預測輸出
# 輸入array是一個二維數組,每一行是一個樣本,每一列是一個特征
result=model.predict(array)

案例:加載abnormal.txt文件中的數據,基於ElasticNet訓練回歸模型

import numpy as np
import matplotlib.pyplot as plt
# sklearn庫
import sklearn.linear_model as lm

# 加載數據:讀文本
def loaddata():
    # x,y=np.loadtxt("data/abnormal.txt",delimiter=",",unpack=True)
    data=np.loadtxt("data/abnormal.txt",delimiter=",")
    cols=data.shape[1]    # data.shape[1]:列數
    x=data[:,0:cols-1] 
    y=data[:,-1].reshape(-1,1)          # data[:,-1]:獲取所有行的最後一列
    return x,y

x,y=loaddata()

## ElasticNet(彈性網)
model4=lm.ElasticNet(0.01,l1_ratio=0.2,fit_intercept=True,max_iter=1000,normalize=True)  # 模型構建
model4.fit(x,y)  # 模型訓練 
print("\n")
print("系數:",model4.coef_)
print("截距:",model4.intercept_)
pred_y=model4.predict(x)     # 模型預測
plt.title("ElasticNet")
plt.scatter(x,y)
plt.plot(x,pred_y)

版權聲明
本文為[執志@*飛揚か]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/134/202205141525579701.html

隨機推薦