我已经训练了一个模型,并且尝试使用predict
函数,但它返回了以下错误。
在
contrasts<-
(*tmp*
, value = contr.funs[1 + isOF[nn]])中出现错误:
只能对具有两个或更多级别的因子应用对比
在StackOverflow和CrossValidated上有几个关于此问题的讨论,根据我的理解,这个错误意味着模型中的一个因子只有一个级别。
这是一个相当简单的模型,包含一个连续变量(driveTime)和一个具有3个级别的因子变量
driveTime Market.y transfer Min. : 5.100 Dallas :10 Min. :-11.205 1st Qu.: 6.192 McAllen: 6 1st Qu.: 3.575 Median : 7.833 Tulsa : 3 Median : 7.843 Mean : 8.727 Mean : 8.883 3rd Qu.:10.725 3rd Qu.: 15.608 Max. :14.350 Max. : 30.643
当我使用predict函数来预测一个未见样本的结果时
newDriveTime <- data.frame(driveTime = 8,Market.y = as.factor("Dallas"))predict(bestMod_Rescaled, newDriveTime)
我得到了以下错误
在`contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]])中出现错误: 只能对具有两个或更多级别的因子应用对比
这是我工作流程的更多细节
tc <- tune.control(cross = 10, fix = 8/10) tuneResult_Rescaled <- tune(svm,data = finalSubset, transfer~ driveTime + Market.y, ranges = list(epsilon = seq(0.1,.5,0.1), cost = seq(8,10,.1)), tunecontrol=tc) summary(tuneResult_Rescaled) bestMod_Rescaled <- tuneResult_Rescaled$best.model
回答:
我想你需要在训练数据中提供因子的级别到测试集中。像下面这样应该可以工作。
newDriveTime <- data.frame(driveTime = 8, Market.y = factor("Dallas", levels(finalSubset$Market.y)))predict(bestMod_Rescaled, newDriveTime)
在R语言中,因子被保存为带有名称/标签的整数。如果你有两个因子向量,它们的级别数量不同,仅通过查看标签,无法确定两个向量中哪些标签对应于相同的级别。