前言
hello大家好這里是小L??在這里想和大家一起學(xué)習(xí)一起進(jìn)步。??
這次筆記內(nèi)容:學(xué)習(xí)嶺回歸與LASSO回歸模型的sklearn實(shí)現(xiàn)。嶺回歸:平方和(L2正則化);LASSO回歸:絕對(duì)值(L1正則化)。
為了防止線性回歸的過(guò)擬合,加了正則化系數(shù),系數(shù)可能有正有負(fù),因此將他的絕對(duì)值或者平方和加起來(lái),使得誤差平方和最小。
一、嶺回歸
1.嶺回歸介紹
L2正則化
sklearn.linear_model.Ridge(
- alpha=1:正則化因子(系數(shù)theta),入越大,越限制theta(即斜率k)越平緩,系數(shù)越小。系數(shù)越小誤差越小。入越大,絕對(duì)值越接近于0。(限制x的發(fā)展,如果取0,x放飛)
- fit_ intercept=True:截距,是否計(jì)算該模型截距。(除非數(shù)據(jù)標(biāo)準(zhǔn)化之后可false. )
- normalize=False:標(biāo)準(zhǔn)化false,標(biāo)準(zhǔn)化一般在建模之前做(sklearn.preprocessing.StandardScale)。
- copy_X=True:原始的x還在,中間的用另一個(gè)存在。如false不要原來(lái)的x,新數(shù)據(jù)覆蓋舊數(shù)據(jù)。
- max_iter=None: 最大迭代次數(shù)
- tol =0.001:忍耐力,每努力一次提升的效果不大,提升沒(méi)有超過(guò)0.001就停止
- solver =‘a(chǎn)uto’:提供很多方法
![]()
- random_state:隨機(jī)種子
)
屬性
- intercept_ :截距
- coef_ :系數(shù)theta1到thetan,第幾個(gè)自變量前面的系數(shù),沒(méi)有截距,只限制theta1–thetan來(lái)防止過(guò)擬合(決定斜率k),theta0(截距)沒(méi)有關(guān)系
- n_iter_:迭代多少次
方法
- fit 訓(xùn)練
- predict預(yù)測(cè)
- score模型評(píng)估,不大于1,越大越好
- get_params返回超參數(shù)的值
- set_params修改超參數(shù)的值重新訓(xùn)練
2.代碼實(shí)現(xiàn)
from sklearn.datasets import load_diabetes
diabetes=load_diabetes()#以糖尿病模型為例
X=diabetes.data#自變量
y=diabetes.target#因變量
from sklearn.model_selection import train_test_split#數(shù)據(jù)劃分
X_train,X_test,y_train,y_test=train_test_split(X,y,random=8)
from sklearn.linear_model import Ridge#導(dǎo)入嶺回歸模型
ridge=Ridge()#模型實(shí)例化
ridge.fit(X_train,y_train)#模型訓(xùn)練
print("訓(xùn)練集的得分為:{:,2f}".format(ridge.score(X_train,y_train)))
print("測(cè)試集的得分為:{:,2f}".format(ridge.score(X_test,y_test)))
運(yùn)行結(jié)果如下:
訓(xùn)練數(shù)據(jù)集得分:0.43
測(cè)試數(shù)據(jù)集得分:0.43
可以看出效果并不是很好,但是也不能因?yàn)橐淮谓Y(jié)果否定這個(gè)模型,可以通過(guò)調(diào)參的方法,重新進(jìn)行模型訓(xùn)練。
3.嶺回歸參數(shù)調(diào)整
#嶺回歸調(diào)參
#正則化系數(shù)alpha=10
ridge10=Ridge(alpha=10).fit(X_train,y_train)
print("訓(xùn)練數(shù)據(jù)集得分:{:.2f}".format(ridge10.score(X_train,y_train)))
print("測(cè)試數(shù)據(jù)集得分:{:.2f}".format(ridge10.score(X_test,y_test)))
運(yùn)行結(jié)果如下:
訓(xùn)練數(shù)據(jù)集得分:0.15
測(cè)試數(shù)據(jù)集得分:0.16
可以看出結(jié)果更加糟糕
#正則化系數(shù)alpha=0.1
ridge01=Ridge(alpha=0.1).fit(X_train,y_train)
print("訓(xùn)練數(shù)據(jù)集得分:{:.2f}".format(ridge01.score(X_train,y_train)))
print("測(cè)試數(shù)據(jù)集得分:{:.2f}".format(ridge01.score(X_test,y_test)))
運(yùn)行結(jié)果如下:
訓(xùn)練數(shù)據(jù)集得分:0.52
測(cè)試數(shù)據(jù)集得分:0.47
4.嶺跡分析,可視化分析
#嶺跡分析
#10個(gè)特征0-9,在4種回歸的系數(shù)畫(huà)出來(lái)
#模型系數(shù)的可視化比較
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.xlabel("系數(shù)序號(hào)")
plt.ylabel("系數(shù)量級(jí)")
plt.hlines(0,0,len(lr.coef_))#hlines水平線從0到10(查)
plt.legend(loc='best')
plt.grid(linestyle=':')
alpha越大,絕對(duì)值越接近于0。(限制x的發(fā)展,如果取0,x放飛)
#繪制學(xué)習(xí)曲線:取固定alpha的值,改變訓(xùn)練集的數(shù)量
import numpy as np
from sklearn.model_selection import learning_curve,KFold
def plot_learning_curve(est,X,y):
training_set_size,train_scores,test_scores=learning_curve(
est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,random_state=1))
estimator_name=est.__class__.__name__
line=plt.plot(training_set_size,train_scores.mean(axis=1),'--',
label='training'+estimator_name)
plt.plot(training_set_size,test_scores.mean(axis=1),'-',
label='test'+estimator_name,c=line[0].get_color())
plt.xlabel('Training set size')
plt.ylabel('Score')
plt.ylim(0,1.1)
plot_learning_curve(Ridge(alpha=1),X,y)
plot_learning_curve(LinearRegression(),X,y)
plt.legend(loc=(0,1.05),ncol=2,fontsize=11)
plt.grid(linestyle=':')
二、LASSO回歸
1.LASSO回歸介紹
L1正則化
sklearn.linear_model.Lasso(
- alpha=1:正則化因子(系數(shù)theta),入越大,越限制theta(即斜率k)越平緩,系數(shù)越小。系數(shù)越小誤差越小。入越大,絕對(duì)值越接近于0。(限制x的發(fā)展,如果取0,x放飛)
- fit_ intercept=True:截距,是否計(jì)算該模型截距。(除非數(shù)據(jù)標(biāo)準(zhǔn)化之后可false. )
- normalize=False:標(biāo)準(zhǔn)化false,標(biāo)準(zhǔn)化一般在建模之前做(sklearn.preprocessing.StandardScale)。
- precompute=False
- **copy_X=**True:原始的x還在,中間的用另一個(gè)存在。如false不要原來(lái)的x,新數(shù)據(jù)覆蓋舊數(shù)據(jù)。
- max_iter=1000: 最大迭代次數(shù)
- tol =0.0001:忍耐力,每努力一次提升的效果不大,提升沒(méi)有超過(guò)0.001就停止
- warm_start =True:下一次運(yùn)行會(huì)從當(dāng)前的點(diǎn)繼續(xù)往下走,若False每次都重新運(yùn)行一次[重新開(kāi)始](深度學(xué)習(xí)中經(jīng)常有這個(gè)參數(shù))
- positive=False
- random_state=None:隨機(jī)種子
selection=‘cyclic’
)
2.代碼實(shí)現(xiàn)
from sklearn.datasets import load_diabetes
diabetes=load_diabetes()#以糖尿病模型為例
X=diabetes.data#自變量
y=diabetes.target#因變量
from sklearn.model_selection import train_test_split#數(shù)據(jù)劃分
X_train,X_test,y_train,y_test=train_test_split(X,y,random=8)
from sklearn.linear_model import Lasso#導(dǎo)入Lasso回歸模塊
lasso=Lasso()#模型實(shí)例化
lasso.fit(X_train,y_train)#模型訓(xùn)練
print("套索回歸在訓(xùn)練集的得分為:{:,2f}".format(lasso.score(X_train,y_train)))
print("套索回歸在測(cè)試集的得分為:{:,2f}".format(lasso.score(X_test,y_test)))
運(yùn)行結(jié)果如下:
訓(xùn)練數(shù)據(jù)集得分:0.36
測(cè)試數(shù)據(jù)集得分:0.37
可以看出效果并不是很好,但是也不能因?yàn)橐淮谓Y(jié)果否定這個(gè)模型,可以通過(guò)調(diào)參的方法,重新進(jìn)行模型訓(xùn)練。
ps. Lasso回歸的特征選擇
#嶺回歸圈圈(L2范數(shù),里面可以有多個(gè)0,削尖,把很多特征都削成0),Lasso回歸四條直線(L1范數(shù)方形)
lasso和嶺回歸,根據(jù)最小二乘法,最后需要使誤差最小。
由于嶺回歸對(duì)w的限制空間是圓形的,lasso對(duì)w的限制空間是由棱角的。橢圓更容易切在w為某一維的圖形為有棱角的圖形,即Lasso回歸模型。(圓形有凸起會(huì)阻擋切在0的位置)
LASSO回歸相對(duì)于嶺回歸,更適合做特征選擇。(面試問(wèn)題)
怎樣調(diào)節(jié)優(yōu)化多個(gè)特征,選出更重要的特征,使得我們的精度更高
print("套索回歸使用的特征數(shù):{}".format(np.sum(lasso.coef_!=0)))
運(yùn)行結(jié)果如下:
套索回歸使用的特征數(shù):3
比較一下嶺回歸和Lasso回歸中能使用的特征數(shù)
Lasso回歸
lasso.coef_
運(yùn)行結(jié)果如下:
array([ 0. , -0. , 384.73421807, 72.69325545,
0. , 0. , -0. , 0. ,
247.88881314, 0. ])
嶺回歸
ridge.coef_
運(yùn)行結(jié)果如下:
array([ 36.8262072 , -75.80823733, 282.42652716, 207.39314972,
-1.46580263, -27.81750835, -134.3740951 , 98.97724793,
222.67543268, 117.97255343])
3.嶺回歸參數(shù)調(diào)整
#增大最大迭代次數(shù)的默認(rèn)設(shè)置,(默認(rèn)max_iter=1000)
lasso=Lasso(max_iter=100000)
lasso.fit(X_train,y_train)
print("訓(xùn)練數(shù)據(jù)集得分:{:.2f}".format(lasso.score(X_train,y_train)))
print("測(cè)試數(shù)據(jù)集得分:{:.2f}".format(lasso.score(X_test,y_test)))
print("套索回歸中使用的特征數(shù):{}".format(lasso.score(X_test,y_test)))
運(yùn)行結(jié)果如下:
訓(xùn)練數(shù)據(jù)集得分:0.36
測(cè)試數(shù)據(jù)集得分:0.37
套索回歸中使用的特征數(shù):0.36561858962128
可以看出結(jié)果并沒(méi)有什么變化,所以換一個(gè)參數(shù)繼續(xù)調(diào)參
#增加最大迭代次數(shù)的默認(rèn)值設(shè)置,(默認(rèn)max_iter=1000)
#同時(shí)調(diào)整alpha的值
lasso01=Lasso(alpha=0.1,max_iter=100000)
lasso01.fit(X_train,y_train)
print("訓(xùn)練數(shù)據(jù)集得分:{:.2f}".format(lasso01.score(X_train,y_train)))
print("測(cè)試數(shù)據(jù)集得分:{:.2f}".format(lasso01.score(X_test,y_test)))
print("套索回歸中使用的特征數(shù):{}".format(lasso01.score(X_test,y_test)))
運(yùn)行結(jié)果如下:
訓(xùn)練數(shù)據(jù)集得分:0.52
測(cè)試數(shù)據(jù)集得分:0.48
套索回歸中使用的特征數(shù):0.47994757514558173
繼續(xù)嘗試探索規(guī)律
#增加最大迭代次數(shù)的默認(rèn)值設(shè)置,(默認(rèn)max_iter=1000)
#同時(shí)調(diào)整alpha的值
lasso00001=Lasso(alpha=0.0001,max_iter=100000)
lasso00001.fit(X_train,y_train)
print("訓(xùn)練數(shù)據(jù)集得分:{:.2f}".format(lasso00001.score(X_train,y_train)))
print("測(cè)試數(shù)據(jù)集得分:{:.2f}".format(lasso00001.score(X_test,y_test)))
print("套索回歸中使用的特征數(shù):{}".format(lasso00001.score(X_test,y_test)))
結(jié)果如下:
訓(xùn)練數(shù)據(jù)集得分:0.53
測(cè)試數(shù)據(jù)集得分:0.46
套索回歸中使用的特征數(shù):0.4594509683706015
alpha越大,選的特征越少。alpha=0時(shí),普通的線性回歸(限制x的發(fā)展,如果取0,x放飛)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-780230.html
4.模型系數(shù)的數(shù)據(jù)可視化比較
plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.plot(lasso.coef_,'D',label='Lasso alpha=1')
plt.plot(lasso01.coef_,'H',label='Lasso alpha=0.1')
plt.plot(lasso00001.coef_,'p',label='Lasso alpha=0.0001')
plt.xlabel("系數(shù)序號(hào)")
plt.ylabel("系數(shù)量級(jí)")
plt.hlines(0,0,len(lr.coef_))#hlines水平線從0到10(查)
plt.legend(loc='best')
plt.grid(linestyle=':')
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-780230.html
到了這里,關(guān)于python-sklearn嶺回歸與LASSO回歸模型(套索)代碼實(shí)操的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!