公共自行車使用量預(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代表沒(méi)有限制,范圍: [0,∞]

max_delta_step:默認(rèn)0,我們常用0.
這個(gè)參數(shù)限制了每棵樹權(quán)重改變的最大步長(zhǎng),如果這個(gè)參數(shù)的值為0,則意味著沒(méi)有約束。如果他被賦予了某一個(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è)正值,可以使算法更快收斂。通??梢詫⑵湓O(shè)置為負(fù)樣本的數(shù)目與正樣本數(shù)目的比值。

學(xué)習(xí)目標(biāo)參數(shù):控制訓(xùn)練目標(biāo)的表現(xiàn)。我們對(duì)于問(wèn)題的劃分主要體現(xiàn)在學(xué)習(xí)目標(biāo)參數(shù)上。比如我們要做分類還是回歸,做二分類還是多分類,這都是目標(biāo)參數(shù)所提供的。

**objective **:在回歸問(wèn)題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é)果如下:


缺失值判斷

可見(jiàn)共一萬(wàn)條數(shù)據(jù),沒(méi)有缺失值

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ì)于不同的問(wèn)題,理想的學(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容