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

5
我正在尝试使用随机森林进行时间序列分析。以下是我的代码:
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)

当我在测试数据集上使用predict函数时,结果一直不变。所有预测值都是369,我已经尝试了另一个数据集,结果也相同。有人能告诉我我在这里做错了什么吗?


销售预测应该基于哪些因素?目前我只看到日期和两个因素(产品和城市),每个因素只有一个级别。从特征工程开始。例如,尝试从日期中提取星期几,并将其作为7个级别的因素包含在内。 - JanLauGe
如果不知道slice来自哪里,那么trainingtesting数据集似乎被限制为2个值。也许缺少一个逗号以选择第一和第四列training=training[, c(1,4)] - nya
也可以尝试使用 testing<-slice(SubSales, (train_len+1) :test_len) 命令,并观察括号的效果。同时,尝试运行 1+2:5 并与您预期的结果进行比较。如果没有括号,这两个切片实际上会重叠,从而失去了分离的目的。强烈建议在此类任务中使用 caret 包中的 createDataPartition 函数。 - Silence Dogood
@nya 不,它们不仅限于2个数据值,而是选择第一列和第四列。 - Shivam Sarin
@JanLauGe 我只是想使用随机森林进行TS分析,有两列数据,一列是周数,另一列是销售额。 - Shivam Sarin
显示剩余3条评论
1个回答

7
让我试着重述一下你的问题,以确保我准确地理解你想要做什么。
你有一个产品每天的销售量,想预测未来日期的销售量。你没有任何预测变量,如客户数量、广告费用或其他任何因素。你的输入数据看起来像这样:
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
...

我认为你的随机森林表现符合预期。随机森林是一种监督式机器学习算法,试图预测给定输入变量 x(预测器)的 y(响应,在这里是销售额)。在这里,您提供的唯一 x 是日期。然而,每个日期对于随机森林来说都是全新的,因此该算法只能猜测该日产品的销售额将是平均值。
你有两个选择:
选项1)坚持只使用日期作为预测器的方法。您需要另一种方法,例如自回归方法,如ARIMA。这种方法试图检测数据中的趋势。销售额是静态的、增长的还是下降的?是否存在周趋势、月趋势、年度趋势?可以在此处找到一个示例来帮助您入门。

选项2) 使用数据收集和特征工程创建功能,以帮助您的随机森林预测新日期的值。例如,尝试获取有关任何给定日子店铺有多少客户的数据,或提取星期几(星期一、星期二等)并将其保留为单独的变量。 R软件包lubridate将帮助您完成此操作。以下是一个简短的示例:

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

希望这有所帮助!

非常感谢,这很有帮助。我不知道随机森林是如何工作的。我已经使用Arima和HoltsWinter完成了TS,现在只是尝试使用RandomForest来完成。我以为我做错了什么,这就是为什么我得到了稳定的值。再次感谢,祝好! - Shivam Sarin
我有一个类似的问题,由于我已经有了ARIMA和指数平滑,我想在随机森林中进行。你能帮我解决@ShivamSarin的方法是什么? - Lalitha
@Lalitha,你有任何可用作预测因子的数据吗?看看我的这篇博客文章,它对零售数据进行了一些预测。如果需要更多帮助,很乐意在私人聊天中与你讨论。 https://janlauge.github.io/2017/exploring-sales-data/ - JanLauGe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接