最近有一個需求,需要用到GBDT算法去實現對時序數據進行預測(迴歸任務),數據是從2011年1月到2020年4月份6個不同城市的房地產交易數據,由於在網上沒有找到對應的基於時序數據來用GBDT算法的博客或者資料,我也去github上面找個,出現最多的是,基於特徵數據對標籤進行預測,實現如分類或者回歸問題,基於此,想寫一個關於時序數據處理的簡單介紹,後面有代碼和數據地址
一 數據介紹
6個城市分別是,重慶,杭州,洛陽,南充,蕪湖,對於特徵如下圖所示: 迴歸任務爲基於歷史數據對2020年1-4月的特徵數據進行預測,故一共需要預測13個特徵值
二 模型訓練
簡單思路是把年和月作爲特徵,然後用GBDT學習後面特徵的值(即後面13列),當然如果需要模型更魯棒一點,可以加入其他列特徵數據,對目標特徵進行擬合,這裏只是簡單介紹,故而只解釋最簡單的一種。
def GBDT_train(X,Y):
#print(X.head())
#print(Y.head())
for i in range(num_of_index):#訓練16個模型,即輸出值
#print(Y.iloc[:200,i].head())
#x_train, x_test, y_train, y_test = train_test_split(X, Y.iloc[:200,i].astype("str").values)
x_train, x_test, y_train, y_test = train_test_split(X, Y.iloc[:,i])# 模型訓練,使用GBDT算法 默認75%做訓練 , 25%做測試
'''GradientBoostingRegressor參數介紹
@n_estimators: 子模型的數量,默認爲100
@max_depth :最大深度 ,默認3
@min_samples_split :分裂最小樣本數
@learning_rate :學習率
'''
gbr = GradientBoostingRegressor(n_estimators=200, max_depth=2, min_samples_split=2, learning_rate=0.1)
gbr.fit(x_train, y_train.ravel())
joblib.dump(gbr, name+"train_model_"+ str(i) +"_result.m") # 保存模型y_gbr = gbr.predict(x_train)
y_gbr1 = gbr.predict(x_test)
acc_train = gbr.score(x_train, y_train)
acc_test = gbr.score(x_test, y_test)
print(name+"train_model_"+ str(i) +"_result.m"+'訓練準確率',acc_train)
print(name+"train_model_"+ str(i) +"_result.m"+'驗證準確率',acc_test)
三 模型預測
用了裏面自帶的方式,這裏沒什麼好說的
# 加載模型並預測
def GBDT_Predict( ):X_Pred = [2020,4]
print("預測:2020-4")
X_Pred = np.reshape(X_Pred, (1, -1))
for i in range(num_of_index):
gbr = joblib.load(name+"train_model_"+ str(i) +"_result.m") # 加載模型
#test_data = pd.read_csv(r"./data_test.csv")
test_y = gbr.predict(X_Pred)
test_y = np.reshape(test_y, (1, -1))
print(test_y)
四 實驗結果
實驗結果還是不錯的,如果加入其他特徵效果和泛化能力可能會更好!
!!!!代碼和數據在這裏!!!