機器學習 嶺迴歸和lasso中乘調優參數λ的確定

轉自:https://blog.csdn.net/weixin_43374551/article/details/83688913

一、嶺迴歸

1.參數推導

線性迴歸模型的目標函數J(β)=(yXβ)2J(β)=(yXβ)2J(β)=(yXβ)2J(β)=∑(y−Xβ)2J(β)=∑(y−Xβ)2 J(\beta)=\sum(y-X\beta)^2λ值。

import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge
import matplotlib.pyplot as plt

data=pd.read_excel(r’C:\Users\Administrator\Desktop\diabetes.xlsx’)
#拆分爲訓練集和測試集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#構造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#存放偏回歸係數
ridge_cofficients=[]
for Lambda in Lambdas:
ridge=Ridge(alpha=Lambda,normalize=True)
ridge.fit(x_train,y_train)
ridge_cofficients.append(ridge.coef_)

#繪製嶺跡曲線
plt.rcParams[‘font.sans-serif’]=[‘Microsoft YaHei’]
plt.rcParams[‘axes.unicode_minus’]=False
plt.style.use(‘ggplot’)
plt.plot(Lambdas,ridge_cofficients)
#x軸做對數處理
plt.xscale(‘log’)
plt.xlabel(‘Log(Lambda)’)
plt.ylabel(‘Cofficients’)
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在這裏插入圖片描述
書上說在0.01附近大多數迴歸係數就趨於穩定,這哪看得出?所以定性的方法一般不太靠譜,還是用定量的方法吧!
(2)交叉驗證法確定λλλλλ \lambdaλ下交叉驗證的評估信息,默認爲False,只有cv爲None時有效。

import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import RidgeCV

data=pd.read_excel(r’C:\Users\Administrator\Desktop\diabetes.xlsx’)
#拆分爲訓練集和測試集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#構造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#設置交叉驗證的參數,使用均方誤差評估
ridge_cv=RidgeCV(alphas=Lambdas,normalize=True,scoring=‘neg_mean_squared_error’,cv=10)
ridge_cv.fit(x_train,y_train)
print(ridge_cv.alpha_)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在這裏插入圖片描述
得到的結果是0.135

3.代碼實現

Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver=‘auto’, random_state=None)
• alpha:用於指定λλλλλ \lambdaλ值參數,默認爲1。
• fit_intercept:bool類型,是否需要擬合截距項,默認爲True。
• normalize:bool類型,建模時是否對數據集做標準化處理,默認爲False。
• copy_X:bool類型,是否複製自變量X的數值,默認爲True。
• max_iter:指定模型的最大迭代次數。
• solver:指定模型求解最優化問題的算法,默認爲’auto’。
• random_state:指定隨機生成器的種子。

import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge,RidgeCV
from sklearn.metrics import mean_squared_error

data=pd.read_excel(r’C:\Users\Administrator\Desktop\diabetes.xlsx’)
data=data.drop([‘AGE’,‘SEX’],axis=1)
#拆分爲訓練集和測試集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#構造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#設置交叉驗證的參數,使用均方誤差評估
ridge_cv=RidgeCV(alphas=Lambdas,normalize=True,scoring=‘neg_mean_squared_error’,cv=10)
ridge_cv.fit(x_train,y_train)

#基於最佳lambda值建模
ridge=Ridge(alpha=ridge_cv.alpha_,normalize=True)
ridge.fit(x_train,y_train)
#打印迴歸係數
print(pd.Series(index=[‘Intercept’]+x_train.columns.tolist(),
data=[ridge.intercept_]+ridge.coef_.tolist()))

#模型評估
ridge_pred=ridge.predict(x_test)
#均方誤差
MSE=mean_squared_error(y_test,ridge_pred)
print(MSE)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在這裏插入圖片描述

二、LASSO迴歸

1.參數推導

嶺迴歸無法剔除變量,而LASSO迴歸模型,將懲罰項由L2範數變爲L1範數,可以將一些不重要的迴歸係數縮減爲0,達到剔除變量的目的。
KaTeX parse error: Expected 'EOF', got '&' at position 24: …ed text node: '&̲ThickSpace;&Thi…J(β)=(yXβ)2+λβ1=(yXβ)2+λβ=ESS(β)+λl1(β)其中ESS(β)=</span>ESS(β)=<原文練接/span>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章