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

一、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)


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,为了设计一个基于神经网络的门店销售额预测的Python代码,我们需要按照以下步骤进行: 1. 导入所需的库 我们需要导入一些Python库,用于数据预处理和神经网络建模,如pandas、numpy、matplotlib和tensorflow等。 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow as tf ``` 2. 导入和处理数据 我们需要下载Kaggle网站上的罗斯曼商店数据集,并将其导入到Python中。然后,我们将数据进行处理包括数据清洗、特征工程和数据切分等。 ```python # 导入数据集 data = pd.read_csv('rossmann.csv', low_memory=False) # 进行特征工程和数据清洗 # 略去特征工程和数据清洗的代码 # 将数据集按照时间进行切分,分为训练集和测试集 train = data[data['Date'] < '2015-06-01'] test = data[data['Date'] >= '2015-06-01'] ``` 3. 建立模型 我们将使用TensorFlow来建立神经网络模型。我们将使用Dense层来创建输入层和输出层,并添加一些中间层来提高模型的准确性和运行效率。 ```python # 建立模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(256, activation='relu', input_shape=(train_x.shape[1],)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dense(1) ]) ``` 4. 编译和训练模型 我们需要编译模型并使用训练数据训练它。我们使用Adam优化算法和均方误差作为损失函数。 ```python # 编译和训练模型 model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.MeanSquaredError(), metrics=['mse']) model.fit(train_x, train_y, epochs=50, batch_size=32) ``` 5. 模型预测和评估 我们使用测试数据进行模型预测,并使用均方根误差(RMSE)来评估模型的准确性。 ```python # 模型预测和评估 pred = model.predict(test_x) rmse = np.sqrt(((test_y - pred) ** 2).mean()) print('RMSE:', round(rmse, 2)) ``` 完整的代码如下: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 导入数据集 data = pd.read_csv('rossmann.csv', low_memory=False) # 进行特征工程和数据清洗 # 略去特征工程和数据清洗的代码 # 将数据集按照时间进行切分,分为训练集和测试集 train = data[data['Date'] < '2015-06-01'] test = data[data['Date'] >= '2015-06-01'] # 定义训练数据和测试数据的特征和标签 train_x = train.drop(['Sales', 'Date'], axis=1).values train_y = train['Sales'].values test_x = test.drop(['Sales', 'Date'], axis=1).values test_y = test['Sales'].values # 建立模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(256, activation='relu', input_shape=(train_x.shape[1],)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dense(1) ]) # 编译和训练模型 model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.MeanSquaredError(), metrics=['mse']) model.fit(train_x, train_y, epochs=50, batch_size=32) # 模型预测和评估 pred = model.predict(test_x) rmse = np.sqrt(((test_y - pred) ** 2).mean()) print('RMSE:', round(rmse, 2)) ``` 希望这个代码片段能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值