R “错误”;x和xtest的列数必须相同;使用随机森林时

R “错误”;x和xtest的列数必须相同;使用随机森林时,r,R,当我试图在R中使用randomForest时,我遇到了一个错误。 我进去的时候 basic3prox <- randomForest(activity ~.,data=train,proximity=TRUE,xtest=valid) 但它们的列数是相同的。我使用subset()从相同的原始数据集中获取它们,当我运行dim()时,我得到 昏暗(火车) [1] 3237563 dim(有效) [1] 2630563 所以我不知道这里到底出了什么问题 不,他们没有train有562个预测列

当我试图在R中使用randomForest时,我遇到了一个错误。 我进去的时候

basic3prox  <- randomForest(activity ~.,data=train,proximity=TRUE,xtest=valid)
但它们的列数是相同的。我使用subset()从相同的原始数据集中获取它们,当我运行dim()时,我得到

昏暗(火车)

[1] 3237563

dim(有效)

[1] 2630563


所以我不知道这里到底出了什么问题

不,他们没有
train
有562个预测列和1个decision列,因此
valid
必须有562列(相应的decision必须传递给
ytest
参数)。
因此,调用应该如下所示:

randomForest(activity~.,data=train,proximity=TRUE,
  xtest=valid[,names(valid)!='activity'],ytest=valid[,'activity'])
然而,这是一个肮脏的黑客,对于更复杂的公式将失败,因此不应该使用它(正如Joran在评论中指出的,即使作者也试图禁止它)。正确、简单、快速的方法是使用单独的对象来预测和决策,而不是使用公式,如下所示:

randomForest(trainPredictors,trainActivity,proximity=TRUE,
  xtest=testPredictors,ytest=testActivity)

不,他们没有
train
有562个预测列和1个decision列,因此
valid
必须有562列(相应的decision必须传递给
ytest
参数)。
因此,调用应该如下所示:

randomForest(activity~.,data=train,proximity=TRUE,
  xtest=valid[,names(valid)!='activity'],ytest=valid[,'activity'])
然而,这是一个肮脏的黑客,对于更复杂的公式将失败,因此不应该使用它(正如Joran在评论中指出的,即使作者也试图禁止它)。正确、简单、快速的方法是使用单独的对象来预测和决策,而不是使用公式,如下所示:

randomForest(trainPredictors,trainActivity,proximity=TRUE,
  xtest=testPredictors,ytest=testActivity)

也许这不是一个错误。当您使用
dim()
时,您会得到不同的号码。这意味着训练数据和有效数据具有不同的DIM。我遇到过这样的问题。我的解决方案如下:首先,我使用
names()
显示训练数据和有效数据中的变量。我看到他们有不同的变量;其次,我使用
setdiff()
来“减去”剩余变量(如果训练数据的变量多于有效数据,则减去训练数据中的剩余变量,反之亦然)。然后,训练数据和有效数据具有相同的变量。您可以使用随机森林

也许这不是一个bug。当您使用
dim()
时,您会得到不同的号码。这意味着训练数据和有效数据具有不同的DIM。我遇到过这样的问题。我的解决方案如下:首先,我使用
names()
显示训练数据和有效数据中的变量。我看到他们有不同的变量;其次,我使用
setdiff()
来“减去”剩余变量(如果训练数据的变量多于有效数据,则减去训练数据中的剩余变量,反之亦然)。然后,训练数据和有效数据具有相同的变量。您可以使用随机森林

通常,如果您要为
xtest
传递一个参数,那么您就不会使用公式方法,而是分别指定x和y。这(有点)是一个bug。传递
xtest
ytest
应该会在使用公式时生成特定错误,但它们似乎不会。我会联系软件包维护人员。这很奇怪,因为人们在询问关于randomForest的其他问题时使用了公式方法,但没有得到错误(大概是这样的)。我同意这很奇怪,几乎到处都是。这只虫子对我来说似乎很奇怪。问题是这一行
m没有哲学上的理由说明你为什么不能这样做,我只是指实际的代码,作者显然试图阻止你这样做,只是把它搞砸了。所以这更像是我在警告你以后不要指望这种行为。一般来说,如果你要为
xtest
传递一个参数,你不会使用公式方法,你应该分别指定x和y。你知道吗。这(有点)是一个bug。传递
xtest
ytest
应该会在使用公式时生成特定错误,但它们似乎不会。我会联系软件包维护人员。这很奇怪,因为人们在询问关于randomForest的其他问题时使用了公式方法,但没有得到错误(大概是这样的)。我同意这很奇怪,几乎到处都是。这只虫子对我来说似乎很奇怪。问题是这一行
m没有哲学上的理由说明你为什么不能这样做,我只是指实际的代码,作者显然试图阻止你这样做,只是把它搞砸了。这更像是我在警告你以后不要指望这种行为。那么,如果(任何(c(“xtest”,“ytest”)%在%names(m)中)停止(“xtest/ytest不支持通过公式接口”)
randomForest:::randomForest.formula
?@joran中,你如何解释这些行,此if从不激发,因为
x
/
ytest
正在绑定到
;剩下的代码只是破译公式,然后跳转到默认方法,该方法可以很好地处理
x
/
ytest
。因此,这是一个bug(;我只是不知道bug是怎么回事:作者是否打算阻止在公式接口中使用
xtest
,并将其弄糟,还是一旦发生这种情况,他们打算开始允许它,但未能从函数中删除该检查?;)当然,第一个选项——这只适用于
y~。
公式,更复杂的公式可能会扰乱属性顺序,从而在没有任何警告的情况下产生完全错误的测试预测。那么,如果(在%names(m)中有任何(c(“xtest”,“ytest”)%停止,您如何解释行
(“xtest/ytest不支持通过公式接口”)
randomForest:::randomForest.formula
?@joran嗯,这如果永远不会激发,因为
x
/
ytest
正在绑定到
;其余的