我有一个名为Data
的数据集,有30个缩放和居中的特征和1个结果,列名为OUTCOME
,参考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
这样我就有了一个数据集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治疗中犯了一些错误吗?还是因为我糟糕地建立了随机森林?或者我只是处理讨厌的数据?
我不知道从哪里开始,因为我是数据科学的新手,但工作流程对我来说似乎是正确的。
非常感谢提前。
你的第二个问题的答案(即“是数据,还是我做错了什么”)很难知道。这就是为什么你应该首先尝试制作基线模型,这样你就可以了解数据的可学习性。
基线可能是h2o.glm()
,和/或它可能是h2o.randomForest()
,但无论如何没有PCA步骤。 (你没有说你是在进行回归还是分类,例如,如果OUTCOME
是一个数字或因子,但glm和随机森林都将以任何方式工作。)
转到你的第一个问题:是的,这是一个合理的事情,并且你不必(事实上,不应该)涉及结果向量。
回答第一个问题的另一种方法是:不,这是不合理的。可能是随机森林可以在不需要您使用PCA的情况下看到所有关系。请记住,当您使用PCA减少输入尺寸的数量时,您也会丢掉一些信号。你说8个组件只能捕获95%的方差。所以你丢弃一些信号以换取更少的输入,这意味着你要以牺牲预测质量为代价来优化复杂性。
顺便说一下,连接原始输入和8个PCA组件是另一种方法:通过给出关于数据的提示,您可以获得更好的模型。 (但你可能不会,这就是为什么在尝试这些更奇特的想法之前首先获得一些基线模型是必不可少的。)