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

R: training random forest using PCA data

我有一个名为 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治疗时出现了一些错误?还是因为我错误地设置了随机森林?或者我只是在处理烦人的数据?

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

非常感谢。

你的第二个问题(即"is it the data, or did I do something wrong")的答案很难知道。这就是为什么您应该总是首先尝试制作一个基线模型,这样您就可以了解数据的可学习性。

基线可以是 h2o.glm(),and/or 也可以是 h2o.randomForest(),但无论哪种方式都没有 PCA 步骤。 (你没有说你是在做回归还是分类,即如果 OUTCOME 是一个数字或一个因子,但是 glm 和随机森林都可以工作。)

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

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

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