在 R 中使用随机森林进行时间序列预测

Posted

技术标签:

【中文标题】在 R 中使用随机森林进行时间序列预测【英文标题】:Time Series Forecasting using Random Forest in R 【发布时间】:2017-08-28 03:25:16 【问题描述】:

我正在尝试使用随机森林进行时间序列分析。 PFB 我的代码

Subsales<-read.csv('Sales.csv')
head(Subsales)

样本数据:

Date               SKU                            City   Sales
      <date>                               <chr>   <chr> <dbl>
1 2014-08-11 Vaseline Petroleum Jelly Pure 60 ml Jeddah1   378
2 2014-08-18 Vaseline Petroleum Jelly Pure 60 ml Jeddah1   348
3 2014-08-25 Vaseline Petroleum Jelly Pure 60 ml Jeddah1   314
4 2014-09-01 Vaseline Petroleum Jelly Pure 60 ml Jeddah1   324
5 2014-09-08 Vaseline Petroleum Jelly Pure 60 ml Jeddah1   352
6 2014-09-15 Vaseline Petroleum Jelly Pure 60 ml Jeddah1   453


####Length of training & testing set Splitting it 80-20####

train_len=round(nrow(SubSales)*0.8) 
test_len=nrow(SubSales)



######Splitting dataset into training and testing#####

#### Training Set
training<-slice(SubSales,1:train_len) 
#### Testing Set
testing<-slice(SubSales,train_len+1:test_len)

training=training[c(1,4)]
testing=testing[c(1,4)]

library(randomForest)
set.seed(1234)
regressor = randomForest(formula=Sales~.,
                data=training,
                ntree=100)

y_pred = predict(regressor,newdata = testing)

当我在测试数据集上使用预测函数时,我得到了一个固定的结果。所有预测值都是 369,我尝试了另一个数据集,我得到了相同的结果。谁能告诉我我在这里做错了什么?

【问题讨论】:

什么可以预测销售?目前我只看到日期和两个因素(产品和城市),每个因素都有一个级别。从一些特征工程开始。例如,尝试从 date 中提取星期几,并将其作为 7 级因子。 在不知道 slice 的来源的情况下,trainingtesting 数据集似乎仅限于 2 个值。可能缺少逗号来选择第一列和第四列training=training[, c(1,4)] 也试试testing&lt;-slice(SubSales, (train_len+1) :test_len)看看括号的效果试试1+2:5和你的预期结果比较。没有括号,这两个切片本质上是重叠的,从而破坏了分离的目的。强烈推荐 caret 包中的 createDataPartition 函数用于此类任务 @nya 不,它们不限于选择第一列和第四列的 2 个数据值。 @hNu 我的训练和测试集已经创建成功,没有任何问题。我想知道为什么我在使用预测函数时会得到固定值 【参考方案1】:

让我试着重新表述你的问题,以确保我准确理解你想要做什么。

您有一个产品每天的销售额,并且您希望根据未来日期的函数来预测销售额。您没有任何预测变量,例如客户数量、广告花费或其他任何变量。您的输入数据如下所示:

Date        Sales
2014-08-11  378
2014-08-18  348
2014-08-25  314
2014-09-01  324
2014-09-08  352
2014-09-15  453
...

我认为您的 RandomForest 的行为符合预期。随机森林是一种有监督的机器学习算法,它试图在给定输入变量x(预测变量)的情况下预测y(响应,这里:销售)。在这里,您提供的唯一x 是日期。但是,对于随机森林来说,每个日期都是全新的,因此算法只能猜测当天您的产品销售额将是平均水平。

你有两个选择:

选项 1) 坚持仅使用日期作为预测变量的方法。您将需要一种不同的方法,也许是一种自回归方法,例如 ARIMA。这种方法试图检测数据中的趋势。销售额或多或少是静止的、增长的还是下降的?有周趋势、月趋势、年趋势吗?可以找到帮助您入门的示例here

选项 2) 使用数据收集和特征工程创建特征,帮助您的 RandomForest 预测新日期的值。例如,尝试获取任何一天有多少顾客来到商店的数据,或者提取一周中的哪一天(星期一、星期二……)并将其作为单独的变量保存。 R-package lubridate 将帮助您做到这一点。下面是一个简单的例子:

library(lubridate)
Subsales <- mutate(Subsales, Weekday = wday(Date, label = TRUE))

希望这会有所帮助!

【讨论】:

非常感谢,这有帮助。我不知道随机森林是如何工作的。我已经使用 Arima 和 HoltsWinter 完成了 TS,我只是在尝试是否可以使用 RandomForest。我以为我犯了一些错误,这就是为什么我得到固定值的原因。再次感谢干杯 我有一个类似的问题,因为我已经有一个 ARIMA 和指数平滑,我很想在 Randam Forest 中做。你能帮我解决@ShivamSarin的方法吗 您有任何数据可用作预测变量@Lalitha?看看我的这篇博文,它对零售数据做了一些预测。如果您需要更多帮助,很高兴将其带到私人聊天中。 janlauge.github.io/2017/exploring-sales-data

以上是关于在 R 中使用随机森林进行时间序列预测的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:R语言实现随机森林

将条件变量添加到 R 中的随机森林模型

从随机森林模型中提取树的子集进行预测

当缺少数据时,使用 R 随机森林预测新数据

r 随机森林错误 - 新数据中的预测变量类型不匹配

r中随机森林的类重要性