【Predict Future Sales】玩转销量预测 part2

本文使用随机森林模型进行销量预测,通过探索性数据分析(EDA)、特征工程和模型训练,展示如何处理时间序列数据。内容包括数据预处理、特征构建、模型训练及评估,强调了特征工程在销量预测中的重要性。
摘要由CSDN通过智能技术生成

本文是【Predict Future Sales】用深度学习玩转销量预测的续集,主要介绍另一个强大的机器学习算法–随机森林(Random Forest,下文简称RF)在销量预测实例中的应用。github: https://github.com/alexshuang/predict_future_sales/blob/master/predict_future_sale_rf.ipynb

Look at Data Quickly

通常情况下,拿到这类tabular数据集之后,我会先大致浏览数据中各个字段的含义,并构建一个基础模型来试探这个数据集,根据反馈结果再重新深入理解各个字段的具体含义,深挖它们的特征和关联,也就是EDA(Exploratory Data Analysis)。

Figure 1: Data Description

数据描述告诉我们,sale_train.csv可以通过shop_id、item_id、item_category_id来合并items.csv、item_categories.csv和shops.csv。

预测目标:item_cnt_month–商品月销量,也称为因变量(depend variable),需要根据item_cnt_day按月统计所有商店里每件商品的销量。为了简化模型,官方将item_cnt_month的取值范围限制在[0, 20]。

完成了item_cnt_month的统计后,字段date和item_cnt_day都不再需要了,但考虑到相同月份的商品价格也有可能会有变化,因此需要计算出商品的月均价–item_price_month,来替代item_price。

train = train.merge(shops, on='shop_id')
train = train.merge(items, on='item_id')
train = train.merge(cats, on='item_category_id')
train.drop('item_category_id', 1, inplace=True)

g = train.groupby(['date_block_num','shop_id','item_id']).agg({'item_cnt_day': ['sum']})
g.columns = ['item_cnt_month']
g.item_cnt_month = g.item_cnt_month.clip(0, 20)
train = train.merge(g.reset_index(), how='left', on=['date_block_num','shop_id','item_id'])

g = train.groupby(['date_block_num','shop_id','item_id']).agg({'item_price': ['mean']})
g.columns = ['item_price_month']
train = train.merge(g.reset_index(), how='left', on=['date_block_num','shop_id','item_id'])

train.drop(['date', 'item_price', 'item_cnt_day'], 1, inplace=True)
train.drop_duplicates(inplace=True)
train = train.sort_values('date_block_num').reset_index(drop=True)

除了合并数据外,还需要通过proc_df()将category类型的数据转化为int或float类型。

train_cats(train)
df, y, nas = proc_df(train, 'item_cnt_month')

proc_df()是Fastai Library的库函数,它将dataframe中category类型的数据转化为one-hot code,并对int、float类型的NaN数据做median fillna(),fillna()的结果返回给nas。train_cats()将所有object类型的转换为category类型。

数据处理完毕,接下来就是用Random Forest模型来试探数据。

m = RandomForestRegressor(n_jobs=-1)
%time m.fit(df, y)
m.score(df, y)

CPU times: user 2min 45s, sys: 142 ms, total: 2min 45s
Wall time: 1min 26s
0.9243853945527375

RF用法非常简单,只用三行代码就完成了模型训练和测试。sklearn提供了两种RF模型:RandomForestRegressor、RandomForestClassifier。前者是回归模型、后者是分类模型。超参n_jobs=-1指的是模型会根据CPU核心数为创建工作线程。RF是通过CPU来训练的,如果你的CPU能力有限或是在google colab上训练,可以按照后续介绍的操作来减少训练样本个数。

m.score()的返回值是 R 2 R^2 R2 score,Coefficient of determination

  • S S t o t SS_{tot} SStot表示数据的方差有多大。
  • S S r e s SS_{res} SSres则是RMSE。
  • S S r e s SS_{res} SSres/ S S t o t SS_{tot} SS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值