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

时间:2019-02-26 15:26:05

标签: r random-forest pca h2o

我有一个名为Data的数据集,具有30个缩放和居中特征,以及1个结果,其列名为OUTCOME,涉及70万条记录,以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

这样,我有了一个数据集Data.dump,其中有8个在PCA组件上旋转的特征,并且在每条记录中我都将其结果关联了。

第一个问题:这合理吗?还是我必须以某种方式置换结果向量?还是两件事无关?

然后,我将Data.dump分为两组,Data.train用于训练,Data.test用于测试,全部as.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似乎与原始结果Data.test$OUTCOME不太相似。我也尝试训练神经网络,甚至没有收敛,导致R崩溃。

第二个问题:是因为我在进行PCA治疗时犯了一些错误吗?还是因为我错误地建立了随机森林?还是我正在处理令人讨厌的数据?

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

第二个问题的答案(即“是数据还是我做错了事”)很难知道。这就是为什么您应该始终首先尝试创建基准模型的原因,因此您对数据的易学性有了一个认识。

基线可以是h2o.glm(),和/或基线可以是h2o.randomForest(),但是任一种方式都不需要PCA步骤。 (您没有说是否要进行回归或分类,即OUTCOME是一个数字还是一个因子,但是glm和random forest都可以使用。)

第一个问题:是的,这是一件合理的事情,没有,您不必(实际上不应该)涉及结果向量。

回答第一个问题的另一种方法是:不,这是不合理的。可能是随机森林可以查看所有关系本身,而无需使用PCA。请记住,当您使用PCA减少输入尺寸的数量时,您也会丢掉一些信号。您说这8个成分仅捕获了95%的方差。因此,您会因为输入更少而丢掉一些信号,这意味着您正在以牺牲预测质量为代价来优化复杂性。

顺便说一句,将原始输入和8个PCA组件连接起来是另一种方法:可能通过提供有关数据的提示可以得到更好的模型。 (但是您可能没有,这就是为什么在尝试这些更奇特的想法之前,首先需要获得一些基线模型的原因。)