sofa公共自行車數(shù)量預(yù)測-XGBoost優(yōu)化

1.數(shù)據(jù)預(yù)處理

2.特征選擇

3.XGBoost參數(shù)優(yōu)化

4.誤差測試

數(shù)據(jù)預(yù)處理


1.查看缺失值

'''

from xgboost import XGBRegressor

import pandas as pd

import numpy

import numpy as np

train = pd.read_csv("C://Users/65144/Desktop/train.csv")

test = pd.read_csv("C://Users/65144/Desktop/test.csv")

submit = pd.read_csv("C://Users/65144/Desktop/sample_submit.csv")

print(test[test.isnull().values==True])

print(train[train.isnull().values==True])#看是否有缺失值(沒有)

'''


沒有缺失值

2.查看統(tǒng)計指標(主要是方差和相關(guān)系數(shù))

'''

corr=train.corr()#得到相關(guān)系數(shù)

np.set_printoptions(threshold=1e6) #設(shè)置閾值將省略的相關(guān)系數(shù)完整輸出

print(corr)

t=numpy.corrcoef(train.temp_1,train.y)

s=numpy.corrcoef(train.is_workday,train.y)

d=numpy.corrcoef(train.weather,train.y)#還是不能完整輸出亡呵。。只能單獨輸出

print(t,s,d)

'''




特征選擇

?Wrapper

?遞歸特征消除法

  遞歸消除特征法使用一個基模型來進行多輪訓(xùn)練汰聋,每輪訓(xùn)練后,消除若干權(quán)值系數(shù)的特征,再基于新的特征集進行下一輪訓(xùn)練忍宋。使用feature_selection庫的RFE類來選擇特征的代碼如下:

'''

from sklearn.feature_selection import RFE

from sklearn.linear_model import LogisticRegression #遞歸特征消除法咧党,返回特征選擇后的數(shù)據(jù)

#參數(shù)estimator為基模型 #參數(shù)n_features_to_select為選擇的特征個數(shù)

trian=RFE(estimator=LogisticRegression(), n_features_to_select=5).fit_transform(train, y)

'''

對xgboost進行參數(shù)優(yōu)化

采用網(wǎng)格搜索GridSearchCV調(diào)參(網(wǎng)格搜索法是指定參數(shù)值的一種窮舉搜索方法,通過將估計函數(shù)的參數(shù)通過交叉驗證的方法進行優(yōu)化來得到最優(yōu)的學(xué)習算法市怎。)

目前對三個參數(shù)進行優(yōu)化

max_depth:用于指定每個基礎(chǔ)模型所包含的最大深度岁忘、默認為3層

n_estimators :用于指定基礎(chǔ)模型的數(shù)量、默認為100個区匠。

gamma:用于指定節(jié)點分割所需的最小損失函數(shù)下降值干像,即增益值Gain的閾值帅腌,默認為0.

''' ?from xgboost import XGBRegressor

from sklearn.model_selection import GridSearchCV

import pandas as pd

# 讀取數(shù)據(jù)

train = pd.read_csv("C://Users/65144/Desktop/train.csv")

test = pd.read_csv("C://Users/65144/Desktop/test.csv")

submit = pd.read_csv("C://Users/65144/Desktop/sample_submit.csv")

# 刪除id

train.drop(['id'] ,axis=1, inplace=True)

test.drop(['id'] ,axis=1, inplace=True)

# 取出訓(xùn)練集的y

y = train.pop('y')

param_test1 = {

? ? 'n_estimators':range(205,215,1)#由大范圍大步跳向小范圍小步跳調(diào)整,最后鎖定范圍在205到215之間

}

gsearch1 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1,? 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#需要優(yōu)化的對象, iid=False, cv=5)

gsearch1.fit(train, y)

print(gsearch1.best_params_, gsearch1.best_score_)#輸出最佳參數(shù)值和模型得分

'''


結(jié)果為206


其他參數(shù)保持不變繼續(xù)依次搜索

max_depth和 gamma


結(jié)果分別為7和0.4




測試? RMSE(比賽給出的誤差測算方式? 方差)

由于只有train有完整的屬性值和標志值麻汰,所以將訓(xùn)練集二八分為訓(xùn)練集和測試機用以測試誤差

'''

from xgboost import XGBRegressor

import pandas as pd

from sklearn.model_selection import train_test_split

# 讀取原本訓(xùn)練數(shù)據(jù)

train= pd.read_csv("C://Users/65144/Desktop/train.csv")

#刪除ID速客,該屬性沒有實際意義

train.drop('id', axis=1, inplace=True)


#將屬性y從樣本集中移除并返回給y作為標記

y=train.pop('y')?

#將原本的訓(xùn)練集隨機劃分,百分之80用于訓(xùn)練五鲫,百分之20用于測試

x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=1)

# 建立一個默認的xgboost回歸模型

#reg = XGBRegressor()

reg = XGBRegressor(learning_rate = 0.1, n_estimators=206, max_depth=7, min_child_weight=7, seed=27, gamma=0.4,colsample_bytree=0.8,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # nthread=4, scale_pos_weight=1)


#訓(xùn)練xgboost模型

reg.fit(x_train, y_train)

#對測試集進行預(yù)測

y_pred = reg.predict(x_test)


print(np.sqrt(sum((np.array(y_test) - np.array(y_pred))**2)/len(y_pred)))#輸出RMSE

'''



再看一下未調(diào)參前的RMSE

'''

from xgboost import XGBRegressor

import pandas as pd

from sklearn.model_selection import train_test_split

# 讀取原本訓(xùn)練數(shù)據(jù)

train= pd.read_csv("C://Users/65144/Desktop/train.csv")

#刪除ID溺职,該屬性沒有實際意義

train.drop('id', axis=1, inplace=True)

#劃分屬性和標簽

x=train

#將屬性y從樣本集中移除并返回給y作為標記

y=x.pop('y')?

#將原本的訓(xùn)練集隨機劃分,百分之80用于訓(xùn)練位喂,百分之20用于測試

x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=1)

# 建立一個含初始參數(shù)的xgboost回歸模型

reg = XGBRegressor()

#reg = XGBRegressor(learning_rate = 0.1, n_estimators=206, max_depth=7, min_child_weight=7, seed=27, gamma=0.4,colsample_bytree=0.8,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # nthread=4, scale_pos_weight=1)


#訓(xùn)練xgboost模型

reg.fit(x_train, y_train)

#對測試集進行預(yù)測

y_pred = reg.predict(x_test)

#RMSE

print(np.sqrt(sum((np.array(y_test) - np.array(y_pred))**2)/len(y_pred)))

'''


調(diào)參后誤差小了1.17

把調(diào)參后的XGBoost方法和特征選擇方法放到源代碼中

考慮到真實自行車數(shù)量不會為負數(shù)浪耘,所以把測試出為負的預(yù)測值調(diào)整為0

'''


from xgboost import XGBRegressor

import pandas as pd

from sklearn.feature_selection import RFE

train = pd.read_csv("C://Users/65144/Desktop/train.csv")

test = pd.read_csv("C://Users/65144/Desktop/test.csv")

submit = pd.read_csv("C://Users/65144/Desktop/sample_submit.csv")

# 刪除id ?

train.drop(['id'], axis=1, inplace=True)

test.drop(['id'], axis=1, inplace=True)

# 取出訓(xùn)練集的y

y_train = train.pop('y')

from sklearn.linear_model import LogisticRegression

#返回特征選擇后的數(shù)據(jù)

trian=RFE(estimator=LogisticRegression(), n_features_to_select=5).fit_transform(train, y_train)

# 建立xgboost回歸模型

reg = XGBRegressor(learning_rate = 0.1, n_estimators=206, max_depth=7, min_child_weight=7, seed=27, gamma=0.4,colsample_bytree=0.8,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nthread=4, scale_pos_weight=1)#剛剛的調(diào)參結(jié)果

reg.fit(train, y_train)

y_pred = reg.predict(test)

y_pred = list(map(lambda x: x if x >= 0 else 0, y_pred))#負數(shù)則取零

# 輸出預(yù)測結(jié)果至my_XGB_prediction6.csv

submit['y'] = y_pred

submit.to_csv('C://Users/65144/Desktop/my_XGB_prediction7.csv', index=False)

'''

結(jié)果



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忆某,隨后出現(xiàn)的幾起案子点待,更是在濱河造成了極大的恐慌,老刑警劉巖弃舒,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癞埠,死亡現(xiàn)場離奇詭異,居然都是意外死亡聋呢,警方通過查閱死者的電腦和手機苗踪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來削锰,“玉大人通铲,你說我怎么就攤上這事∑鞣罚” “怎么了颅夺?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛹稍。 經(jīng)常有香客問我吧黄,道長,這世上最難降的妖魔是什么唆姐? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任拗慨,我火速辦了婚禮,結(jié)果婚禮上奉芦,老公的妹妹穿的比我還像新娘赵抢。我一直安慰自己,他們只是感情好声功,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布烦却。 她就那樣靜靜地躺著,像睡著了一般减噪。 火紅的嫁衣襯著肌膚如雪短绸。 梳的紋絲不亂的頭發(fā)上车吹,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機與錄音醋闭,去河邊找鬼窄驹。 笑死,一個胖子當著我的面吹牛证逻,可吹牛的內(nèi)容都是我干的乐埠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼囚企,長吁一口氣:“原來是場噩夢啊……” “哼丈咐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起龙宏,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棵逊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后银酗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辆影,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年黍特,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛙讥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡灭衷,死狀恐怖次慢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翔曲,我是刑警寧澤迫像,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站瞳遍,受9級特大地震影響侵蒙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傅蹂,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望算凿。 院中可真熱鬧份蝴,春花似錦、人聲如沸氓轰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽署鸡。三九已至案糙,卻和暖如春限嫌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背时捌。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工怒医, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奢讨。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓稚叹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拿诸。 傳聞我的和親對象是個殘疾皇子扒袖,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348