2017-04-03 932 views
4

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

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) 

我得到一个固定的结果,当我使用预测功能测试数据set.All预测值369,我试着再数据集我得到了同样的结果。谁能告诉我我在这里做错了什么?

+0

什么是应该预测销售?目前我只看到日期,以及两个因素(产品和城市),每个都有一个等级。从一些功能工程开始。例如,尝试从日期中提取星期几,并将其作为7级因子。 – JanLauGe

+0

不知道'slice'来自哪里,'training'和'testing'数据集似乎只限于2个值。可能缺少一个逗号来选择第一列和第四列训练=训练[,c(1,4)]'。 – nya

+0

也可以尝试'testing <-slice(SubSales,(train_len + 1):test_len)'以查看括号尝试'1 + 2:5'的效果,并与您的预期结果进行比较。没有括号,这两个切片基本上重叠,从而破坏了分离的目的。强烈建议''caret'包中的'createDataPartition'函数执行此类任务 – OdeToMyFiddle

回答

4

让我试着重新解释你的问题,以确保我准确理解你想要做的事情。

您的产品每天都有销售额,并且您希望预测销售额与未来日期的函数关系。您没有任何预测变量,如客户数量,广告花费或其他任何内容。您输入的数据是这样的:

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。这种方法试图检测数据中的趋势。销售是静态的,增长还是下降?是否有每周趋势,每月趋势,年度趋势?为了得到一个例子,你开始可以发现here

选项2)使用数据收集和功能工程,创造出功能,可帮助随机森林预测值新日期。例如,尝试获取有关有多少客户在某一天来到商店的数据,或者提取一周中的某一天(星期一,星期二......)并将其作为单独变量保存。 R包软件包将帮助你做到这一点。下面的简短示例:

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

希望这有助于!

+0

非常感谢,这有助于。我不知道随机森林是如何工作的。我已经使用Arima和HoltsWinter完成了TS。我只是在尝试使用RandomForest。我以为我犯了一些错误,这就是为什么我获得固定值。再次感谢干杯 –