R:利用PCA数据训练随机森林

R:利用PCA数据训练随机森林,r,random-forest,pca,h2o,R,Random Forest,Pca,H2o,我有一个名为data的数据集,有30个缩放和居中的特征,以及1个列名为output的结果,参考700k条记录,以data.table格式存储。我计算了它的主成分分析(PCA),并观察到它的前8个成分占了95%的方差。我想在h2o中训练一个随机林,所以我要做的是: Data.pca=prcomp(Data,retx=TRUE) # compute the PCA of Data Data.rotated=as.data.table(Data.pca$x)[,c(1:8)] # keep only

我有一个名为
data
的数据集,有30个缩放和居中的特征,以及1个列名为
output
的结果,参考700k条记录,以
data.table
格式存储。我计算了它的主成分分析(PCA),并观察到它的前8个成分占了95%的方差。我想在
h2o
中训练一个随机林,所以我要做的是:

Data.pca=prcomp(Data,retx=TRUE) # compute the PCA of Data
Data.rotated=as.data.table(Data.pca$x)[,c(1:8)] # keep only first 8 components
Data.dump=cbind(Data.rotated,subset(Data,select=c(OUTCOME))) # PCA dataset plus outcomes for training
这样我就有了一个dataset
Data.dump
,其中我有8个在PCA组件上旋转的特征,在每个记录上我都关联了它的结果

第一个问题:这是否合理?还是我必须以某种方式排列结果向量?或者这两件事是无关的

然后我将
Data.dump
分为两组,
Data.train
用于训练,
Data.test
用于测试,所有
均为.h2o
。我把它们喂给一个随机的森林:

rf=h2o.randomForest(training_frame=Data.train,x=1:8,y=9,stopping_rounds=2,
                    ntrees=200,score_each_iteration=T,seed=1000000)
rf.pred=as.data.table(h2o.predict(rf,Data.test))
结果是,
rf.pred
似乎与原始结果
数据不太相似。我也试图训练神经网络,但甚至没有收敛,导致R

第二个问题:是因为我在PCA治疗中犯了一些错误吗?还是因为我设置了随机森林?或者我只是在处理恼人的数据

我不知道从哪里开始,因为我是数据科学的新手,但工作流程对我来说似乎是正确的


非常感谢。

第二个问题的答案(即“是数据还是我做错了什么”)很难知道。这就是为什么您应该首先尝试创建一个基线模型,以便了解数据的可学习性

基线可以是
h2o.glm()
,和/或可以是
h2o.randomForest()
,但任何一种方法都不需要PCA步骤。(您没有说您是否正在进行回归或分类,即,
结果
是否是一个数字或一个因子,但glm和random forest都会起作用。)

进入你的第一个问题:是的,这是一件合理的事情,不,你不必(事实上,不应该)涉及结果向量

回答第一个问题的另一种方式是:不,这是不合理的。可能是一个随机林可以看到所有关系本身,而不需要使用PCA。请记住,当您使用PCA来减少输入维度的数量时,您也会丢弃一些信号。你说过这8个成分只占95%的方差。因此,您丢弃了一些信号以换取更少的输入,这意味着您正在以牺牲预测质量为代价优化复杂性


顺便说一句,连接原始输入和8个PCA组件是另一种方法:通过对数据给出提示,您可能会得到更好的模型。(但您可能不会,这就是为什么在尝试这些更具异国情调的想法之前,首先获取一些基准模型是至关重要的。)

非常感谢。与此同时,我一直在尝试并自己解决这个问题,因为有些东西最终奏效了,但我不明白随机森林基本上可以执行某种隐式PCA。这在方法的实际范围内是有意义的。