您的位置:首页 > 其它

XGBoost实现门店销售额预测小白入门demo

2018-02-02 20:56 1601 查看
一、xgboost扩展包安装
1、官网下载xgboost扩展包:

   Python Extension Packages for Windows下载对应版本,win64,python3.6

   https://download.lfd.uci.edu/pythonlibs/rqr3k8is/xgboost-0.7-cp36-cp36m-win_amd64.whl

   (https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 扩展包目录)

2、使用pip命令安装:

   在python脚本目录下执行pip命令(本人为: cd D:\work\ide\Anaconda3\Scripts)

   pip install D:\study\ai\7v\packages\xgboost-0.7-cp36-cp36m-win_amd64.whl
二、业务数据准备
1、分析业务场景中可能影响到门店日销售额的所有特征:

   本demo使用的特征包含以下内容:周几、几号、是否节假日、前3天平均、前7天平均、前30天平均、前90天平均、

   上周同天、上个月同天、3个月前同天、6个月同天(实际情况可能还需要更多的特征,但是运行demo已经足够了)

2、对确定的特征数据进行提取,本demo数据统计使用的是spark计算框架,只要拿到特征源数据即可。
三、建立模型
1、特征数据转换:
   将业务数据中取值可以简单枚举的字段转换成包含1个1其它均为0的list(如:星期一为1,0,0,0,0,0,0)
#将数字转为list 如 星期一,只需要传入7,1就会返回  1,0,0,0,0,0,0  one-hot

def number2list(max_num,num):

    return_list = []

    day = int(num)

    for i in range(1, max_num + 1):

        if i == day: return_list.append(1)

        else:return_list.append(0)

    return return_list
2、使用特征数据建立模型

    # 1、读取特征和目标

    print(time() + '-读取特征和目标开始')

    train_and_valid, test = pd.read_csv(tv_features), pd.read_csv(test_features)

    print(time() + '-读取特征和目标开始完成,数据形状:',train_and_valid.shape)

    # 2、获取训练、验证、测试的特征和目标(为了减少代码运行时间,方便测试)

    # 2-1、取训练、验证、测试数据子集

    # 训练、验证(0.99:0.01)

    train,valid = cross_validation.train_test_split(train_and_valid,test_size=0.01,random_state=10)

    # 2-2、解析训练、验证、测试数据的特征和目标

    train_feature,train_target = parse_features_target('-训练数据:',train)

    valid_feature,valid_target = parse_features_target('-验证数据:',valid)

    test_feature,test_target = parse_features_target('-测试数据:',test)

    print(time() + '-获取训练、验证、测试的特征和目标完成')

    # 1、训练、验证数据转换为xgboost矩阵(取目标log是为了数据更稳定)

    dtrain = xgb.DMatrix(train_feature,np.log(train_target))

    dvalid = xgb.DMatrix(valid_feature,np.log(valid_target))

    watchlist = [(dvalid,'valid'), (dtrain,'train')]

    # 2、设置基本参数

    num_boost_round=500

    params = {"max_depth":8,"eta":0.2,"subsample":0.7,"colsample_bytree":0.7,"silent":1,

    "objective":"reg:linear"} #线性回归

    # 3、创建训练模型

    gbm = xgb.train(params,dtrain,num_boost_round,evals=watchlist,feval=rmspe_xg,

    early_stopping_rounds=50,verbose_eval=True)

    print(time() + '获取训练、验证、测试的特征和目标完成')
3、根据迭代收敛情况,进行调参(调参是个高大上的事情,待精通了再聊


四、评价预测
1、使用测试数据进行预测,并使用实际值对预测结果进行误差分析

    # 1、测试shop_id集合(数据首位)

    shop_id_df = test_feature[str(0)]

    print(time() + '-测试shop_id集合,数据形状', shop_id_df.shape)

    # 2、将测试集代入模型进行预测

    test_probs = gbm.predict(xgb.DMatrix(test_feature))

    print(time() + '-流量预测结果,数据形状',test_probs.shape)

    # 预测目标流量(指数还原)

    predict_flow = list(np.exp(test_probs)) #指数计算

    # 汇总预测结果

    real_predict = zip(list(shop_id_df),list(test_target),predict_flow)

    print(time() + '-预测最终结果汇总(前10):',predict_flow[0:10])

    # 3、对预测结果进行矫正(如果在极值之外就取平均值)

    max_dict,min_dict,ave_dict = get_shop_number_dict()

    # 预测修正结果

    predict_flow_improve = []

    for shop_id,real,predict in real_predict:

        predict0 = predict

        if predict > max_dict[shop_id]:predict = ave_dict[shop_id]

        if predict < min_dict[shop_id]:predict = ave_dict[shop_id]

        predict_flow_improve.append(predict)

        print(time() + '-预测修正结果:','shop_id=',shop_id,'real=',real,'predict0=',predict0,'predict=',predict0)

    # 4、计算误差

    real_predict_improve = zip(list(test_target),predict_flow_improve)

    error = rmse(real_predict_improve)

    print('误差标准差计算:', error)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息