我有一个名为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治疗时犯了一些错误吗?还是因为我错误地建立了随机森林?还是我正在处理令人讨厌的数据?
我不知道从哪里开始,因为我是数据科学的新手,但是工作流程对我来说似乎是正确的。
非常感谢。
答案 0 :(得分:1)
第二个问题的答案(即“是数据还是我做错了事”)很难知道。这就是为什么您应该始终首先尝试创建基准模型的原因,因此您对数据的易学性有了一个认识。
基线可以是h2o.glm()
,和/或基线可以是h2o.randomForest()
,但是任一种方式都不需要PCA步骤。 (您没有说是否要进行回归或分类,即OUTCOME
是一个数字还是一个因子,但是glm和random forest都可以使用。)
第一个问题:是的,这是一件合理的事情,没有,您不必(实际上不应该)涉及结果向量。
回答第一个问题的另一种方法是:不,这是不合理的。可能是随机森林可以查看所有关系本身,而无需使用PCA。请记住,当您使用PCA减少输入尺寸的数量时,您也会丢掉一些信号。您说这8个成分仅捕获了95%的方差。因此,您会因为输入更少而丢掉一些信号,这意味着您正在以牺牲预测质量为代价来优化复杂性。
顺便说一句,将原始输入和8个PCA组件连接起来是另一种方法:可能通过提供有关数据的提示可以得到更好的模型。 (但是您可能没有,这就是为什么在尝试这些更奇特的想法之前,首先需要获得一些基线模型的原因。)