公共自行車使用量預(yù)測(cè)活動(dòng)總結(jié)

前言

本次練習(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]扒秸,注意不可取0

colsample_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é)果


corr

由圖中我們可以看出延都,當(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ù)的情況相赁,


輸出值為負(fù)

明顯租借單車的數(shù)量不可能為負(fù)數(shù),所以我們?cè)趛_pred中加多一條慰于,使他的<0的y等于0钮科。

y_pred [ y_pred < 0 ] = 0

最終結(jié)果


FINAL

得分15.078,排名47

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婆赠,一起剝皮案震驚了整個(gè)濱河市绵脯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌休里,老刑警劉巖蛆挫,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妙黍,居然都是意外死亡悴侵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門拭嫁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)可免,“玉大人,你說(shuō)我怎么就攤上這事做粤〗浇瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵怕品,是天一觀的道長(zhǎng)妇垢。 經(jīng)常有香客問我,道長(zhǎng)堵泽,這世上最難降的妖魔是什么修己? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮迎罗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘片仿。我一直安慰自己纹安,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厢岂,像睡著了一般光督。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塔粒,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天结借,我揣著相機(jī)與錄音,去河邊找鬼卒茬。 笑死船老,一個(gè)胖子當(dāng)著我的面吹牛圃酵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播郭赐,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捌锭!你這毒婦竟也來(lái)了俘陷?” 一聲冷哼從身側(cè)響起观谦,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坎匿,沒想到半個(gè)月后盾剩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡替蔬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驻粟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凶异。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酷麦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沃饶,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布琴昆,位于F島的核電站馆揉,受9級(jí)特大地震影響业舍,放射性物質(zhì)發(fā)生泄漏升酣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一脚牍、第九天 我趴在偏房一處隱蔽的房頂上張望巢墅。 院中可真熱鬧,春花似錦驯遇、人聲如沸蓄髓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至枉阵,卻和暖如春预茄,著一層夾襖步出監(jiān)牢的瞬間兴溜,已是汗流浹背耻陕。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工诗宣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梧田。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓侧蘸,卻偏偏與公主長(zhǎng)得像鹉梨,于是被迫代替她去往敵國(guó)和親穿稳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容