轉自:https://blog.csdn.net/weixin_43374551/article/details/83688913
一、嶺迴歸
1.參數推導
線性迴歸模型的目標函數λ值。
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)交叉驗證法確定λ下交叉驗證的評估信息,默認爲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:用於指定λ值參數,默認爲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(β)=∑(y−Xβ)2+λ∣∣β∣∣1=∑(y−Xβ)2+∑λ∣β∣=ESS(β)+λl1(β)其中