我正在尝试使用randomforest进行时间序列分析。 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,我尝试过另一个数据集我得到了相同的结果。谁能告诉我这里我做错了什么?
答案 0 :(得分:6)
让我试着改写你的问题,以确保我准确地理解你想做什么。
您每天都有产品的销售额,并且您希望将销售额预测为未来日期的函数。您没有任何预测变量,例如客户数量,广告支出金额或其他任何内容。您的输入数据如下所示:
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表现得像预期的那样。随机森林是一种受监督的机器学习算法,它尝试在给定输入变量y
(预测变量)的情况下预测x
(响应,此处为:Sales)。在这里,您提供的唯一x
是日期。但是,每个日期对于随机森林来说都是全新的,因此算法只能猜测当天产品的销售额是平均的。
您有两种选择:
选项1)坚持使用日期作为预测变量的方法。您将需要一种不同的方法,也许是一种自动回归方法,如ARIMA。该方法试图检测数据的趋势。销售是或多或少是静态的,增长的还是下降的?是否有每周趋势,月度趋势,年度趋势?可以找到一个让您入门的示例here
选项2)使用数据收集和功能工程创建可帮助RandomForest预测新日期值的功能。例如,尝试获取有关每天有多少客户来到商店的数据,或者提取星期几(星期一,星期二......)并将其作为单独的变量保存。 R-package lubridate将帮助您实现这一目标。下面是一个简短的例子:
library(lubridate)
Subsales <- mutate(Subsales, Weekday = wday(Date, label = TRUE))
希望这有帮助!