python多维数据划分_【python+机器学习(4)】多维数据的特征选取(RidgeLasso)...
歡迎關(guān)注哈希大數(shù)據(jù)微信公眾號(hào)【哈希大數(shù)據(jù)】
在之前我們介紹了直接使用線性回歸進(jìn)行波士頓房價(jià)的預(yù)測(cè),但是預(yù)測(cè)準(zhǔn)確率僅有60%左右。預(yù)測(cè)準(zhǔn)確率不高一方面是我們未對(duì)數(shù)據(jù)進(jìn)行一定的預(yù)處理(包括歸一化和標(biāo)準(zhǔn)化等),這樣不能確保在使用優(yōu)化方式時(shí),對(duì)不同特征參數(shù)起到同樣的影響。 其次是未深入挖掘數(shù)據(jù)特征間關(guān)系,比如當(dāng)原始數(shù)據(jù)某些特征與目標(biāo)值不具有線性關(guān)系時(shí),不應(yīng)當(dāng)納入訓(xùn)練模型中。而且數(shù)據(jù)特征之間可能存在共線性等其他問題,不完全適合使用線性回歸模型進(jìn)行擬合。
因此,本節(jié)我們將介紹Ridge Regression(嶺回歸)和Lasso Regression(拉索回歸),進(jìn)行波士頓房價(jià)數(shù)據(jù)集中的特征選取和共線性問題的處理,從而更加準(zhǔn)確的構(gòu)建模型實(shí)現(xiàn)房價(jià)預(yù)測(cè)。
算法理論介紹
機(jī)器學(xué)習(xí)機(jī)制回顧
在之前Linear Regression普通線性回歸的應(yīng)用中(忘記的小伙伴可拉到文末查看線性回歸詳情內(nèi)容),我們的輸入數(shù)據(jù)是具有13個(gè)特征屬性的波士頓房價(jià)數(shù)據(jù)集。
回歸模型的構(gòu)建就是實(shí)現(xiàn)這13個(gè)特征屬性值的線性加權(quán)之和,用于與實(shí)際的房價(jià)進(jìn)行擬合。
image
然后通過機(jī)器學(xué)習(xí)功能來訓(xùn)練數(shù)據(jù)集進(jìn)而獲取該模型的參數(shù)也就是每個(gè)特征屬性之前的權(quán)值系數(shù)(即權(quán)值a的確定)。
機(jī)器學(xué)習(xí)是如何得到權(quán)值呢?是通過定義的一個(gè)損失函數(shù),實(shí)現(xiàn)將訓(xùn)練數(shù)據(jù)代入我們模型的預(yù)測(cè)房價(jià)和真實(shí)房價(jià)的差的平方,然后再將這些平方求和,即普通最小二乘法。
image
因此求權(quán)值a的問題,就成了損失函數(shù)求和的最小化的最優(yōu)化問題。
通過一定的理論推導(dǎo)可以得知權(quán)值系數(shù)實(shí)際為(特征屬性值的廣義逆):
image
而且普通的線性回歸算法可以直接訓(xùn)練得到該結(jié)果進(jìn)而實(shí)現(xiàn)對(duì)房價(jià)的預(yù)測(cè)。
但是,直接使用普通的線性回歸模型,當(dāng)訓(xùn)練樣本數(shù)量過少,甚至少于樣本維數(shù)(僅有12條房屋數(shù)據(jù)),這樣將導(dǎo)致特征數(shù)據(jù)矩陣無法求逆,則不能完成參數(shù)a的估計(jì);其次如果樣本特征中存在大量相似的特征(即樣本屬性之間存在共線性關(guān)系),將會(huì)導(dǎo)致很多權(quán)重所代表的意義重復(fù),使原本簡單高效的模型復(fù)雜化。
因此希望可以對(duì)參數(shù)a的計(jì)算時(shí)提供某種約束(增加一個(gè)懲罰因子),只保留具有共線性的一個(gè)特征屬性值,而實(shí)現(xiàn)特征數(shù)據(jù)的縮減同時(shí)解決過擬合的問題,嶺回歸和拉索回歸恰好可以解決該問題。
下面來詳細(xì)了解一下嶺回歸和拉索回歸的相關(guān)理論和python實(shí)現(xiàn)。
嶺回歸 Ridge
在出現(xiàn)普通線性回歸無法解決的問題時(shí),可以在原來加一個(gè)小擾動(dòng)值λI
image
,其中I為對(duì)角矩陣
image
,可以對(duì)特征屬性的權(quán)重計(jì)算進(jìn)行一定約束,形象的稱加入的對(duì)角矩陣I為嶺。當(dāng)λ越大,懲罰約束作用就越大,而原始數(shù)據(jù)對(duì)回歸求取參數(shù)的作用就會(huì)減小,λ為0時(shí)也就是普通的線性回歸算法。如果給λ指定一個(gè)合適的值,就能在一定意義上解決過擬合的問題(原先過擬合的特別大或者特別小的參數(shù)會(huì)被約束到正常取值但不會(huì)為零)。可以通過多次調(diào)試尋找較優(yōu)的λ值,也就是當(dāng)λ調(diào)整到獲取的參數(shù)值穩(wěn)定時(shí)即可。
因此嶺回歸可以初步解決特征權(quán)值參數(shù)a的動(dòng)態(tài)調(diào)整(普通線性回歸是無偏估計(jì)的唯一值),進(jìn)而緩解過擬合的問題(盡可能找到不同 特征與目標(biāo)值的具體關(guān)系)。
拉索回歸 Lasso
嶺回歸可以動(dòng)態(tài)調(diào)整特征屬性的權(quán)重參數(shù),進(jìn)而使得模型更加契合實(shí)際情況,充分解釋不同特征對(duì)目標(biāo)值的影響力,但是其只能將具有線性相關(guān)的相似特征屬性的權(quán)重降低卻不能完全剔除。
拉索回歸與嶺回歸類似也是加入了一個(gè)擾動(dòng)項(xiàng),其使用的懲罰項(xiàng)對(duì)角矩陣而是可以實(shí)現(xiàn)特征選擇的收縮懲罰性:
image
,可以保證當(dāng)λ充分大時(shí)可以把某些特征屬性的權(quán)重精確地收縮到0,也就是在模型中剔除了該特征屬性,從而從大量特征數(shù)據(jù)中挑選出。該方法的兩大好處:一方面剔除噪聲特征(也就是房價(jià)不受其影響的特征),其次可以消除具有線性相關(guān)關(guān)系的不同屬性(會(huì)造成模型的不穩(wěn)定,原因在之后做具體介紹)。
除此以外,嶺回歸中的約束因子λ需要手動(dòng)調(diào)試,而在拉索回歸算法中,可以實(shí)現(xiàn)λ參數(shù)的交叉驗(yàn)證,而尋找使得誤差最小的λ的取值,使用交叉檢驗(yàn)的訓(xùn)練方法可以進(jìn)一步提高模型的科學(xué)性和準(zhǔn)確性。
python實(shí)現(xiàn)
Ridge python
同樣使用scikit-learn庫中的包實(shí)現(xiàn)該算法,嶺回歸算法實(shí)現(xiàn)的部分代碼如下:
from sklearn.linear_model import Ridge
嶺回歸模型的導(dǎo)入
ridge = Ridge(alpha=float(‘{}’.format(i))).fit(house_price_train_X,house_price_train_y)# 默認(rèn)的lamda的參數(shù)為i
嶺回歸模型訓(xùn)練的準(zhǔn)確率
predict_result_ridge = ridge.predict(house_price_test_X)
predict_result_ridge1 = ridge.score(house_price_train_X, house_price_train_y)
predict_result_ridge0 = ridge.score(house_price_test_X, house_price_test_y)
print(‘嶺回歸懲罰參數(shù)為 {} ,訓(xùn)練集的準(zhǔn)確率:’.format(i),predict_result_ridge1)
print(‘嶺回歸懲罰參數(shù)為 {} ,測(cè)試集的準(zhǔn)確率:’.format(i), predict_result_ridge0)
Lasso python
普通拉索回歸算法實(shí)現(xiàn)的部分代碼如下:
普通拉索回歸模型的導(dǎo)入
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=np.float(‘{}’.format(i)) ,max_iter=1000000).fit(house_price_train_X, house_price_train_y) # 默認(rèn)的lamda的參數(shù)為i
拉索模型訓(xùn)練的準(zhǔn)確率
predict_result_lasso = lasso.predict(house_price_test_X)
predict_result_lasso1 = lasso.score(house_price_train_X, house_price_train_y)
predict_result_lasso0 = lasso.score(house_price_test_X, house_price_test_y)
print(‘拉索回歸懲罰參數(shù)為 {} ,訓(xùn)練集的準(zhǔn)確率:’.format(i), predict_result_lasso1)
print(‘拉索回歸懲罰參數(shù)為 {} ,測(cè)試集的準(zhǔn)確率:’.format(i), predict_result_lasso0)
print(‘拉索回歸懲罰參數(shù)為 {},使用的特征屬性有:{}’.format(i,np.sum(lasso.coef_ != 0))
交叉驗(yàn)證的拉索回歸算法實(shí)現(xiàn)的部分代碼如下:
實(shí)現(xiàn)交叉檢驗(yàn)拉索回歸模型的導(dǎo)入
from sklearn.linear_model import LassoCV
lasso_cv = LassoCV(alphas=np.logspace(-3,1,2,50) ,max_iter=1000000).fit(house_price_train_X, house_price_train_y) # 默認(rèn)的lamda的參數(shù)為i
交叉檢驗(yàn)拉索模型訓(xùn)練的準(zhǔn)確率
predict_result_lasso_cv = lasso_cv.predict(house_price_test_X)
predict_result_lasso_cv1 = lasso_cv.score(house_price_train_X, house_price_train_y)
predict_result_lasso_cv0 = lasso_cv.score(house_price_test_X, house_price_test_y)
print(‘交叉檢驗(yàn)拉索回歸 訓(xùn)練集的準(zhǔn)確率:’, predict_result_lasso_cv1)
print(‘交叉檢驗(yàn)拉索回歸 測(cè)試集的準(zhǔn)確率:’, predict_result_lasso_cv0)
image.png
預(yù)測(cè)對(duì)比結(jié)果
1、當(dāng)設(shè)置懲罰參數(shù)為0時(shí)會(huì)提示建議使用回歸模型。2、當(dāng)懲罰參數(shù)不同時(shí),lasso算法選數(shù)據(jù)特征屬性個(gè)數(shù)是不同的。3、如果懲罰參數(shù)設(shè)置過大,則無法進(jìn)行預(yù)測(cè)。4、也因數(shù)據(jù)自身特征,三種方式的預(yù)測(cè)準(zhǔn)確率相差不大。可以提示我們?cè)谟?xùn)練不同數(shù)據(jù)時(shí),要針對(duì)性的選用不同模型。(源碼請(qǐng)直接通過給后臺(tái)發(fā)消息獲取哦!)
總結(jié)
以上是生活随笔為你收集整理的python多维数据划分_【python+机器学习(4)】多维数据的特征选取(RidgeLasso)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openCV无法打开源文件opencv2
- 下一篇: 永恒python图片_python 数据