提要
接上篇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