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