前言
本次練習(xí)主要致力于xgboost回歸模型(XGBRegressor)的簡(jiǎn)單的數(shù)據(jù)處理與模型調(diào)參,數(shù)據(jù)與標(biāo)桿模型來(lái)自公共自行車使用量預(yù)測(cè)的一個(gè)競(jìng)賽闹炉。
(http://sofasofa.io/competition.php?id=1#c1)
結(jié)果要求RMSE的最小。
1. xgboost模型概述
1.1 XGBoost的核心算法思想
①不斷地添加樹谤逼,不斷地進(jìn)行特征分裂來(lái)生長(zhǎng)一棵樹再芋,每次添加一個(gè)樹辜伟,其實(shí)是學(xué)習(xí)一個(gè)新函數(shù)f(x),去擬合上次預(yù)測(cè)的殘差脊另。
②當(dāng)我們訓(xùn)練完成得到k棵樹导狡,我們要預(yù)測(cè)一個(gè)樣本的分?jǐn)?shù),其實(shí)就是根據(jù)這個(gè)樣本的特征偎痛,在每棵樹中會(huì)落到對(duì)應(yīng)的一個(gè)葉子節(jié)點(diǎn)旱捧,每個(gè)葉子節(jié)點(diǎn)就對(duì)應(yīng)一個(gè)分?jǐn)?shù)。
③最后只需要將每棵樹對(duì)應(yīng)的分?jǐn)?shù)加起來(lái)就是該樣本的預(yù)測(cè)值踩麦。
目標(biāo)是要使得樹群的預(yù)測(cè)值盡量接近真實(shí)值枚赡,而且有盡量大的泛化能力。
1.2 XGBoost的優(yōu)點(diǎn)
①使用許多策略去防止過(guò)擬合谓谦,如:正則化項(xiàng)贫橙、Shrinkage and Column Subsampling等。
②目標(biāo)函數(shù)優(yōu)化利用了損失函數(shù)關(guān)于待求函數(shù)的二階導(dǎo)數(shù)反粥。
③支持并行化卢肃,這是XGBoost的閃光點(diǎn),雖然樹與樹之間是串行關(guān)系才顿,但是同層級(jí)節(jié)點(diǎn)可并行莫湘。具體的對(duì)于某個(gè)節(jié)點(diǎn),節(jié)點(diǎn)內(nèi)選擇最佳分裂點(diǎn)郑气,候選分裂點(diǎn)計(jì)算增益用多線程并行逊脯。訓(xùn)練速度快。
④添加了對(duì)稀疏數(shù)據(jù)的處理竣贪。
⑤交叉驗(yàn)證军洼,early stop,當(dāng)預(yù)測(cè)結(jié)果已經(jīng)很好的時(shí)候可以提前停止建樹演怎,加快訓(xùn)練速度匕争。
⑥支持設(shè)置樣本權(quán)重,該權(quán)重體現(xiàn)在一階導(dǎo)數(shù)g和二階導(dǎo)數(shù)h爷耀,通過(guò)調(diào)整權(quán)重可以去更加關(guān)注一些樣本甘桑。
1.3 XGBoost的參數(shù)
通用參數(shù):宏觀函數(shù)控制。
booster:我們有兩種參數(shù)選擇歹叮,gbtree和gblinear跑杭。gbtree是采用樹的結(jié)構(gòu)來(lái)運(yùn)行數(shù)據(jù),而gblinear是基于線性模型咆耿。默認(rèn)使用gbtree就可以了德谅,不需要調(diào)參。
silent:靜默模式萨螺,為1時(shí)模型運(yùn)行不輸出窄做。
nthread: 使用線程數(shù)愧驱,一般我們?cè)O(shè)置成-1,使用所有線程。如果有需要椭盏,我們?cè)O(shè)置成多少就是用多少線程组砚。
Booster參數(shù):控制每一步的booster(tree/regression)。booster參數(shù)一般可以調(diào)控模型的效果和計(jì)算代價(jià)掏颊。我們所說(shuō)的調(diào)參糟红,很這是大程度上都是在調(diào)整booster參數(shù)。
n_estimator: 也作num_boosting_rounds
這是生成的最大樹的數(shù)目乌叶,也是最大的迭代次數(shù)盆偿。learning_rate: 有時(shí)也叫作eta,系統(tǒng)默認(rèn)值為0.3
每一步迭代的步長(zhǎng)枉昏,很重要陈肛。太大了運(yùn)行準(zhǔn)確率不高揍鸟,太小了運(yùn)行速度慢兄裂。我們一般使用比默認(rèn)值小一點(diǎn),0.1左右就很好阳藻。gamma:系統(tǒng)默認(rèn)為0,我們也常用0晰奖。
在節(jié)點(diǎn)分裂時(shí),只有分裂后損失函數(shù)的值下降了腥泥,才會(huì)分裂這個(gè)節(jié)點(diǎn)匾南。gamma指定了節(jié)點(diǎn)分裂所需的最小損失函數(shù)下降值。 這個(gè)參數(shù)的值越大蛔外,算法越保守蛆楞。因?yàn)間amma值越大的時(shí)候,損失函數(shù)下降更多才可以分裂節(jié)點(diǎn)夹厌。所以樹生成的時(shí)候更不容易分裂節(jié)點(diǎn)豹爹。范圍: [0,∞]subsample:系統(tǒng)默認(rèn)為1。
這個(gè)參數(shù)控制對(duì)于每棵樹矛纹,隨機(jī)采樣的比例臂聋。減小這個(gè)參數(shù)的值,算法會(huì)更加保守或南,避免過(guò)擬合孩等。但是,如果這個(gè)值設(shè)置得過(guò)小采够,它可能會(huì)導(dǎo)致欠擬合肄方。 典型值:0.5-1,0.5代表平均采樣蹬癌,防止過(guò)擬合. 范圍: (0,1]扒秸,注意不可取0colsample_bytree:系統(tǒng)默認(rèn)值為1播演。我們一般設(shè)置成0.8左右。
用來(lái)控制每棵隨機(jī)采樣的列數(shù)的占比(每一列是一個(gè)特征)伴奥。 典型值:0.5-1范圍: (0,1]colsample_bylevel:默認(rèn)為1,我們也設(shè)置為1.
這個(gè)就相比于前一個(gè)更加細(xì)致了写烤,它指的是每棵樹每次節(jié)點(diǎn)分裂的時(shí)候列采樣的比例max_depth: 系統(tǒng)默認(rèn)值為6
我們常用3-10之間的數(shù)字。這個(gè)值為樹的最大深度拾徙。這個(gè)值是用來(lái)控制過(guò)擬合的洲炊。max_depth越大,模型學(xué)習(xí)的更加具體尼啡。設(shè)置為0代表沒有限制暂衡,范圍: [0,∞]max_delta_step:默認(rèn)0,我們常用0.
這個(gè)參數(shù)限制了每棵樹權(quán)重改變的最大步長(zhǎng),如果這個(gè)參數(shù)的值為0,則意味著沒有約束崖瞭。如果他被賦予了某一個(gè)正值狂巢,則是這個(gè)算法更加保守。通常书聚,這個(gè)參數(shù)我們不需要設(shè)置唧领,但是當(dāng)個(gè)類別的樣本極不平衡的時(shí)候,這個(gè)參數(shù)對(duì)邏輯回歸優(yōu)化器是很有幫助的雌续。min_child_weight: 默認(rèn)為0
孩子節(jié)點(diǎn)中最小的樣本權(quán)重和斩个。如果一個(gè)葉子節(jié)點(diǎn)的樣本權(quán)重和小于min_child_weight則拆分過(guò)程結(jié)束。在現(xiàn)行回歸模型中驯杜,這個(gè)參數(shù)是指建立每個(gè)模型所需要的最小樣本數(shù)受啥。該成熟越大算法越conservative。即調(diào)大這個(gè)參數(shù)能夠控制過(guò)擬合鸽心。取值范圍為: [0,∞]lambda:也稱reg_lambda,默認(rèn)值為0滚局。
權(quán)重的L2正則化項(xiàng)。(和Ridge regression類似)顽频。這個(gè)參數(shù)是用來(lái)控制XGBoost的正則化部分的藤肢。這個(gè)參數(shù)在減少過(guò)擬合上很有幫助。alpha:也稱reg_alpha默認(rèn)為0,
權(quán)重的L1正則化項(xiàng)冲九。(和Lasso regression類似)谤草。 可以應(yīng)用在很高維度的情況下,使得算法的速度更快莺奸。scale_pos_weight:默認(rèn)為1
在各類別樣本十分不平衡時(shí)丑孩,把這個(gè)參數(shù)設(shè)定為一個(gè)正值,可以使算法更快收斂灭贷。通澄卵В可以將其設(shè)置為負(fù)樣本的數(shù)目與正樣本數(shù)目的比值。
學(xué)習(xí)目標(biāo)參數(shù):控制訓(xùn)練目標(biāo)的表現(xiàn)甚疟。我們對(duì)于問題的劃分主要體現(xiàn)在學(xué)習(xí)目標(biāo)參數(shù)上仗岖。比如我們要做分類還是回歸逃延,做二分類還是多分類,這都是目標(biāo)參數(shù)所提供的轧拄。
**objective **:在回歸問題objective一般使用reg:squarederror 校赤,即MSE均方誤差卢佣。
eval_metric :校驗(yàn)數(shù)據(jù)所需要的評(píng)價(jià)指標(biāo)菱魔,不同的目標(biāo)函數(shù)將會(huì)有缺省的評(píng)價(jià)指標(biāo)现斋。
2.本篇用到的其他模塊:GridSearchCV(網(wǎng)格搜索)
2.2 GridSearchCV概述
GridSearchCV的sklearn官方網(wǎng)址:Click Here
GridSearchCV,它存在的意義就是自動(dòng)調(diào)參俐末,只要把參數(shù)輸進(jìn)去料按,就能給出最優(yōu)化的結(jié)果和參數(shù)。但是這個(gè)方法適合于小數(shù)據(jù)集卓箫,一旦數(shù)據(jù)的量級(jí)上去了载矿,很難得出結(jié)果。這個(gè)時(shí)候就是需要?jiǎng)幽X筋了烹卒。數(shù)據(jù)量比較大的時(shí)候可以使用一個(gè)快速調(diào)優(yōu)的方法——坐標(biāo)下降闷盔。它其實(shí)是一種貪心算法:拿當(dāng)前對(duì)模型影響最大的參數(shù)調(diào)優(yōu),直到最優(yōu)化甫题;再拿下一個(gè)影響最大的參數(shù)調(diào)優(yōu)馁筐,如此下去涂召,直到所有的參數(shù)調(diào)整完畢坠非。這個(gè)方法的缺點(diǎn)就是可能會(huì)調(diào)到局部最優(yōu)而不是全局最優(yōu),但是省時(shí)間省力果正,巨大的優(yōu)勢(shì)面前炎码,還是試一試吧,后續(xù)可以再拿bagging再優(yōu)化秋泳。 通常算法不夠好潦闲,需要調(diào)試參數(shù)時(shí)必不可少。比如SVM的懲罰因子C迫皱,核函數(shù)kernel歉闰,gamma參數(shù)等,對(duì)于不同的數(shù)據(jù)使用不同的參數(shù)卓起,結(jié)果效果可能差1-5個(gè)點(diǎn)和敬,sklearn為我們提供專門調(diào)試參數(shù)的函數(shù)grid_search。
2.3 參數(shù)說(shuō)明
sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’)
estimator
選擇使用的分類器戏阅,并且傳入除需要確定最佳的參數(shù)之外的其他參數(shù)昼弟。每一個(gè)分類器都需要一個(gè)scoring參數(shù),或者score方法:如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10),
param_grid
需要最優(yōu)化的參數(shù)的取值奕筐,值為字典或者列表舱痘,例如:param_grid =param_test1变骡,param_test1 = {'n_estimators':range(10,71,10)}。
scoring=None
模型評(píng)價(jià)標(biāo)準(zhǔn)芭逝,默認(rèn)None,這時(shí)需要使用score函數(shù)塌碌;或者如scoring='roc_auc',根據(jù)所選模型不同旬盯,評(píng)價(jià)準(zhǔn)則不同誊爹。字符串(函數(shù)名),或是可調(diào)用對(duì)象瓢捉,需要其函數(shù)簽名形如:scorer(estimator, X, y)频丘;如果是None,則使用estimator的誤差估計(jì)函數(shù)泡态。具體值的選取看本篇第三節(jié)內(nèi)容搂漠。
fit_params=None
n_jobs=1
n_jobs: 并行數(shù),int:個(gè)數(shù),-1:跟CPU核數(shù)一致, 默認(rèn)值1
iid=True
iid:默認(rèn)True,為True時(shí)某弦,默認(rèn)為各個(gè)樣本fold概率分布一致桐汤,誤差估計(jì)為所有樣本之和,而非各個(gè)fold的平均靶壮。
refit=True
默認(rèn)為True,程序?qū)?huì)以交叉驗(yàn)證訓(xùn)練集得到的最佳參數(shù)怔毛,重新對(duì)所有可用的訓(xùn)練集與開發(fā)集進(jìn)行,作為最終用于性能評(píng)估的最佳模型參數(shù)腾降。即在搜索參數(shù)結(jié)束后拣度,用最佳參數(shù)結(jié)果再次fit一遍全部數(shù)據(jù)集。
cv=None
交叉驗(yàn)證參數(shù)螃壤,默認(rèn)None抗果,使用三折交叉驗(yàn)證。指定fold數(shù)量奸晴,默認(rèn)為3冤馏,也可以是yield訓(xùn)練/測(cè)試數(shù)據(jù)的生成器。
verbose=0, scoring=None
verbose:日志冗長(zhǎng)度寄啼,int:冗長(zhǎng)度逮光,0:不輸出訓(xùn)練過(guò)程,1:偶爾輸出墩划,>1:對(duì)每個(gè)子模型都輸出涕刚。
pre_dispatch=‘2*n_jobs’
指定總共分發(fā)的并行任務(wù)數(shù)。當(dāng)n_jobs大于1時(shí)走诞,數(shù)據(jù)將在每個(gè)運(yùn)行點(diǎn)進(jìn)行復(fù)制副女,這可能導(dǎo)致OOM,而設(shè)置pre_dispatch參數(shù),則可以預(yù)先劃分總共的job數(shù)量碑幅,使數(shù)據(jù)最多被復(fù)制pre_dispatch次
error_score=’raise’
eturn_train_score=’warn’
如果“False”戴陡,cv_results_屬性將不包括訓(xùn)練分?jǐn)?shù)。 回到sklearn里面的GridSearchCV沟涨,GridSearchCV用于系統(tǒng)地遍歷多種參數(shù)組合恤批,通過(guò)交叉驗(yàn)證確定最佳效果參數(shù)。
3. 數(shù)據(jù)清洗
3.1判斷缺失值
import pandas as pd
train = pd.read_csv("train.csv")
print(train.info())
運(yùn)行得到結(jié)果如下:
可見共一萬(wàn)條數(shù)據(jù)裹赴,沒有缺失值
3.2 刪除重復(fù)值
我認(rèn)為重復(fù)值在實(shí)際情況中出現(xiàn)是有可能的喜庞,所以我認(rèn)為即使出現(xiàn)重復(fù)值,其實(shí)也不需要?jiǎng)h除棋返。
3.3 查看數(shù)據(jù)間的相關(guān)性
import pandas as pd
corr = train.corr()
print(corr)
得到結(jié)果
由圖中我們可以看出延都,當(dāng)日溫度、體感溫度和當(dāng)?shù)貢r(shí)間跟借車數(shù)量之間的變化關(guān)聯(lián)程度較高睛竣。
4.xgboost回歸模型調(diào)參
4.1 調(diào)參剛開始的時(shí)候晰房,一般要先初始化一些值:
1,選擇較高的學(xué)習(xí)速率(learning rate)射沟。一般情況下殊者,學(xué)習(xí)速率的值為0.1。但是對(duì)于不同的問題验夯,理想的學(xué)習(xí)速率有時(shí)候會(huì)在0.05到0.3之間波動(dòng)猖吴。選擇對(duì)應(yīng)于此學(xué)習(xí)速率的理想決策樹數(shù)量。 Xgboost有一個(gè)很有用的函數(shù)“cv”挥转,這個(gè)函數(shù)可以在每一次迭代中使用交叉驗(yàn)證海蔽,并返回理想的決策樹數(shù)量。
2扁位,對(duì)于給定的學(xué)習(xí)速率和決策樹數(shù)量准潭,進(jìn)行決策樹特定參數(shù)調(diào)優(yōu)(max_depth趁俊,min_child_weight域仇,gamma,subsample寺擂,colsample_bytree)暇务。在確定一棵樹的過(guò)程中,我們可以選擇不同的參數(shù)怔软。
3垦细,Xgboost的正則化參數(shù)的調(diào)優(yōu)。(lambda挡逼,alpha)括改。這些參數(shù)可以降低模型的復(fù)雜度,從而提高模型的表現(xiàn)家坎。
4嘱能,降低學(xué)習(xí)速率吝梅,確定理想?yún)?shù)。
4.2 xgboost使用GridSearchCV調(diào)參
三惹骂、1苏携、Xgboost 的默認(rèn)參數(shù)如下(在sklearn庫(kù)中的默認(rèn)參數(shù)):
我們先定義一些值:
learning_rate: 0.1
(學(xué)習(xí)率)
n_estimators: 500
(數(shù)的個(gè)數(shù))
max_depth: 5
(樹的深度)
scale_pos_weight: 1
(權(quán)重。大于0的取值可以處理類別不平衡的情況对粪,幫助模型更快收斂)
subsample: 0.8
(用于訓(xùn)練模型的子樣本占整個(gè)樣本集合的比例右冻。如果設(shè)置為0.5則意味著XGBoost將隨機(jī)的沖整個(gè)樣本集合中隨機(jī)的抽取出50%的子樣本建立樹模型,這能夠防止過(guò)擬合)
colsample_bytree:0.8
(在建立樹時(shí)對(duì)特征隨機(jī)采樣的比例著拭。缺省值為1)取值范圍:0-1
nthread:4
(XGBoost運(yùn)行時(shí)的線程數(shù)纱扭。缺省值是當(dāng)前系統(tǒng)可以獲得的最大線程數(shù)如果你希望以最大 速度運(yùn)行,建議不設(shè)置這個(gè)參數(shù)儡遮,模型將自動(dòng)獲得最大線程)
gamma: 0
(模型在默認(rèn)情況下跪但,對(duì)于一個(gè)節(jié)點(diǎn)的劃分只有在其loss function 得到結(jié)果大于0的情況下才進(jìn)行,而gamma 給定了所需的最低loss function的值)
seed:27
(隨機(jī)數(shù)的種子峦萎,缺省值為0屡久。可以用于產(chǎn)生可重復(fù)的結(jié)果(每次取一樣的seed即可得到相同的隨機(jī)劃分)
=================開始調(diào)參================
最佳迭代次數(shù):n_estimators
from xgboostimport XGBRegressor
from sklearn.model_selectionimport GridSearchCV
import pandasas pd
# 讀取數(shù)據(jù)
train = pd.read_csv("D:/Python Workspace/xgboost Project/train.csv")
test = pd.read_csv("D:/Python Workspace/xgboost Project/test.csv")
# 刪除id
train.drop('id',axis=1,inplace=True)
test.drop('id',axis=1,inplace=True)
# 取出訓(xùn)練集的y
y_train = train.pop('y')
param_test1 = {
'n_estimators':range(100,2000,100)
}
gsearch1 = GridSearchCV(estimator=XGBRegressor(learning_rate=0.5,max_depth=5,
min_child_weight=1,gamma=0,subsample=0.8,colsample_bytree=0.8,
nthread=4,scale_pos_weight=1,seed=27,),
param_grid=param_test1,iid=False,cv=5)
gsearch1.fit(train, y_train)
print(gsearch1.best_params_, gsearch1.best_score_)
結(jié)果
{'n_estimators': 600} 0.908950282399466
最優(yōu)決策樹數(shù)量為600爱榔,得分0.908
==============分割===================
max_depth和min_child_weight
(樹的最大深度被环,缺省值為3,范圍是[1, 正無(wú)窮)详幽,樹的深度越大筛欢,則對(duì)數(shù)據(jù)的擬合程度越高,但是通常取值為3-10)
(我們先大范圍地粗調(diào)參數(shù)唇聘,然后再小范圍地微調(diào))
from xgboostimport XGBRegressor
from sklearn.model_selectionimport GridSearchCV
import pandasas pd
# 讀取數(shù)據(jù)
train = pd.read_csv("D:/Python Workspace/xgboost Project/train.csv")
test = pd.read_csv("D:/Python Workspace/xgboost Project/test.csv")
# 刪除id
train.drop('id',axis=1,inplace=True)
test.drop('id',axis=1,inplace=True)
# 取出訓(xùn)練集的y
y_train = train.pop('y')
param_test2 = {
'max_depth':range(3,10,2),
'min_child_weight':range(1,6,2)
}
gsearch2 = GridSearchCV(estimator=XGBRegressor(learning_rate=0.1,n_estimators=600),
param_grid=param_test2)
gsearch2.fit(train, y_train)
print(gsearch2.best_params_, gsearch2.best_score_)
得出結(jié)果:
{'max_depth': 5, 'min_child_weight': 5} 0.9037286898745251
我們對(duì)于數(shù)值進(jìn)行較大跨度的48種不同的排列組合版姑,可以看出理想的max_depth值為5,理想的min_child_weight值為5迟郎。
3剥险、Gamma參數(shù)調(diào)優(yōu)
Gamma參數(shù)取值范圍可以很大,我這里把取值范圍設(shè)置為5宪肖,其實(shí)我們也可以取更精確的Gamma值表制。
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd
# 讀取數(shù)據(jù)
train = pd.read_csv("D:/Python Workspace/xgboost Project/train.csv")
test = pd.read_csv("D:/Python Workspace/xgboost Project/test.csv")
# 刪除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)
# 取出訓(xùn)練集的y
y_train = train.pop('y')
param_test4 = {
'gamma': [i / 10.0 for i in range(0, 5)]
}
gsearch4 = GridSearchCV(estimator=XGBRegressor(learning_rate=0.1, n_estimators=600, max_depth=5, min_child_weight=5),
param_grid=param_test4)
gsearch4.fit(train, y_train)
print(gsearch4.best_params_, gsearch4.best_score_)
{'gamma': 0.0} 0.9037286898745251
得出的結(jié)果,Gamma最優(yōu)值為0控乾。
4么介、調(diào)整subsample 和 colsample_bytree 參數(shù)
(subsample 用于訓(xùn)練模型的子樣本占整個(gè)樣本集合的比例,如果設(shè)置0.5則意味著XGBoost將隨機(jī)的從整個(gè)樣本集合中抽取出百分之50的子樣本建立模型蜕衡,這樣能防止過(guò)擬合壤短,取值范圍為(0, 1])
(在建立樹的時(shí)候?qū)μ卣鞑蓸拥谋壤笔≈禐?,物質(zhì)范圍為(0, 1])
我們分兩個(gè)階段來(lái)進(jìn)行這個(gè)步驟久脯。這兩個(gè)步驟都取0.6,0.7,0.8,0.9 作為起始值蒜绽。
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd
# 讀取數(shù)據(jù)
train = pd.read_csv("D:/Python Workspace/xgboost Project/train.csv")
test = pd.read_csv("D:/Python Workspace/xgboost Project/test.csv")
# 刪除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)
# 取出訓(xùn)練集的y
y_train = train.pop('y')
param_test5 = {
'subsample': [i / 10.0 for i in range(6, 10)],
'colsample_bytree': [i / 10.0 for i in range(6, 10)]
}
gsearch5 = GridSearchCV(
estimator=XGBRegressor(learning_rate=0.1, n_estimators=600, max_depth=5, min_child_weight=5, gamma=0.0),
param_grid=param_test5)
gsearch5.fit(train, y_train)
print(gsearch5.best_params_, gsearch5.best_score_)
{'colsample_bytree': 0.9, 'subsample': 0.6} 0.9037951735474006
結(jié)果為最優(yōu)值:0.9、0.6
5桶现、正則化參數(shù)調(diào)優(yōu)
(由于gamma函數(shù)提供了一種更加有效的降低過(guò)擬合的方法躲雅,大部分人很少會(huì)用到這個(gè)參數(shù),但是我們可以嘗試用一下這個(gè)參數(shù)骡和。)
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd
# 讀取數(shù)據(jù)
train = pd.read_csv("D:/Python Workspace/xgboost Project/train.csv")
test = pd.read_csv("D:/Python Workspace/xgboost Project/test.csv")
# 刪除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)
# 取出訓(xùn)練集的y
y_train = train.pop('y')
param_test6 = {
'reg_alpha': [0, 0.001, 0.005, 0.01, 0.05]
}
gsearch6 = GridSearchCV(
estimator=XGBRegressor(learning_rate=0.1, n_estimators=600, max_depth=5, min_child_weight=5, gamma=0.0,
colsample_bytree=0.9, subsample=0.7),
param_grid=param_test6)
gsearch6.fit(train, y_train)
print(gsearch6.best_params_, gsearch6.best_score_)
{'reg_alpha': 0.005} 0.9030424269369616
結(jié)果為0.005
最后調(diào)參得到的參數(shù)組合為:
{'n_estimators': 600} 0.9008950282399466
{'max_depth': 5, 'min_child_weight': 5} 0.9037286898745251
{'gamma': 0.0} 0.9037286898745251
{'colsample_bytree': 0.9, 'subsample': 0.6} 0.9037951735474006
{'reg_alpha': 0.005} 0.9030424269369616
匯總:
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd
# 讀取數(shù)據(jù)
train = pd.read_csv("D:/Python Workspace/xgboost Project/train.csv")
test = pd.read_csv("D:/Python Workspace/xgboost Project/test.csv")
# 刪除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)
# 取出訓(xùn)練集的y
y_train = train.pop('y')
reg = XGBRegressor(learning_rate=0.1, n_estimators=600, max_depth=5, min_child_weight=5, gamma=0.0,
colsample_bytree=0.9, subsample=0.7, reg_alpha=0.001)
reg.fit(train, y_train)
y_pred = reg.predict(test)
# 輸出預(yù)測(cè)結(jié)果至answer.csv
submit['y'] = y_pred
submit.to_csv('answer.csv', index=False)
輸出之后發(fā)現(xiàn)存在輸出值為負(fù)數(shù)的情況相赁,
明顯租借單車的數(shù)量不可能為負(fù)數(shù),所以我們?cè)趛_pred中加多一條慰于,使他的<0的y等于0钮科。
y_pred [ y_pred < 0 ] = 0
最終結(jié)果
得分15.078,排名47