python xgb模型 预测_时间序列预测(四):使用XGBoost模型进行时间序列预测

提要

接上篇biaobiaodeqiu:时间序列预测(三):使用Keras搭建LSTM Networks时间序列模型​zhuanlan.zhihu.com

项目实现的内容完全一致,本篇新增传统的监督回归问题训练方法,本文中选用的是目前工程应用比较广泛和有效的Xgboost的算法

项目描述

请参考其他篇,内容完全一致,不在累述

算法原理

请自行Google+陈天奇有关XGBOOST的论文,论文感觉自己还未掌握精髓,没法分享给大家,本篇主要针对项目应用的使用方法分享给大家。

项目实现

一、导入所需库函数

#标准的库导入

import pandas as pd

import numpy as np

from datetime import datetime

import re

import matplotlib.pylab as plt

from math import sqrt

import os

from matplotlib.pyplot import rcParams

rcParams['figure.figsize']=15,6

# 预处理和划分数据

from sklearn.preprocessing import MinMaxScaler

from sklearn.model_selection import train_test_split

# 导入模型

import xgboost as xgb

#模型调参的工具

from sklearn.model_selection import cross_val_score,KFold

from sklearn.model_selection import GridSearchCV

#模型保存工具

from sklearn.externals import joblib

#Error metrics

from sklearn.metrics import mean_squared_error, r2_score

二、数据处理

#import the data

dataparse=lambda dates : datetime.strptime(dates,'%Y-%m-%d')

data=pd.read_excel('xxxx/acitivedata.xlsx',pares_dates=['Day'],index_col='Day',date_parser=dataparse)

#get seperate date

ts1=data['login']

ts2=data['delivery']

ts3=data['registration']

#数据的异常点处理

ts3['2016-09-23']=ts3['2016-09-22']

ts2['2016-09-24']=ts2['2016-09-17']

ts2['2016-09-25']=ts2['2016-09-18']

ts1['2016-09-24']=ts1['2016-09-17']

ts1['2016-09-25']=ts1['2016-09-18']

#将数据进行监督序列的转化

X = ts1.as_matrix()

# 将序列转化为监督序列

lag = 7

X_matrix = []

y = []

for i in range(len(X) - lag):

sample =[]

for n in range(lag):

sample.append(X[i+n])

X_matrix.append(sample)

y.append(X[i+lag])

#这是最后7个点数据,来预测新的一天

X_test_predict = []

for i in range(lag):

X_test_predict.append(X[-(lag-i)])

X_matrix.append(X_test_predict)

XX = np.array(X_matrix)

y = np.array(y)

#定义训练数据

X_train = XX

y_train = y

三、代入XGBOOST算法

# setup regressor

xgb_model = xgb.XGBRegressor()

# performance a grid search

tweaked_model = GridSearchCV(

xgb_model,

{

'max_depth':[1,2,5,10,20],

'n_estimators':[20,30,50,70,100],

'learning_rate':[0.1,0.2,0.3,0.4,0.5]

},

cv = 3,

verbose = 1,

n_jobs = -1,

scoring = 'neg_median_absolute_error',

tweaked_model.fit(X_train[:-1],y_train)

print('Best: %f using %s'%(tweaked_model.best_score_, tweaked_model.best_params_))

四、进行数据预测

#saving and load models

def save_model(model,filename):

return joblib.dump(model,filename)

def load_model(filename):

return joblib.load(filename)

#四、预测新数据

save_model(tweaked_model,'XGB-model_lag=7.pkl')

model = load_model('XGB-model_lag=7.pkl')

model1 = xgb.XGBRegressor(learning_rate= 0.1, max_depth= 5, n_estimators= 100)

model1.fit(X_train[:-101],y_train[:-100])

#以最后100天的数据为测试数据

X_predict = model1.predict(X_train[-101:])

plt.plot(y_train[-100:],color='blue',label='actul')

plt.plot(X_predict,color='red',label='predict')

plt.legend(loc='best')

plt.title('RMSE:%.4f'%np.sqrt((sum((X_predict[:-1]-y_train[-100:])**2))/len(X_predict)))

plt.show()

print("the next day predict is %.f"%X_predict[-1])

小结

相比较下来,算法表现还是可以的,跑这个算法也是之前看见了一篇分享文章里面提到使用xgboost来训练时间序列和进行预测,思路仍旧是将时间序列转化为监督序列,其实,这个算法因为最近太忙而没有很多时间,只做了一下午,但有很多让我反思的事情,比如是不是使用神经网络的时候,特征选的太少了,只是单点输入等等,前期的分享还有很多不完善的地方,后面一定找时间一一改进,全部完善后,会所有算法和代码、数据上传github

你可能感兴趣的:(python,xgb模型,预测)