R SVM返回NA,用于缺少数据的预测

时间:2017-02-20 00:40:44

标签: r svm

我正在尝试使用e1071包中经过训练的SVM进行预测,但我的数据包含一些缺失值(NA)。

我希望当该实例有任何缺失值时,返回的预测为NA。我尝试使用na.action = na.pass,但是它给了我一个错误"名称错误(ret2)< - rowns:' names' attribute [150]的长度必须与vector [149]"。

的长度相同

如果我使用na.omit,那么我可以获得没有丢失数据的实例的预测。 如何获得包括NA在内的预测?

library(e1071)
model <- svm(Species ~ ., data = iris)
print(length(predict(model, iris)))
tmp <- iris
tmp[1, "Sepal.Length"] <- NA
print(length(predict(model, tmp, na.action = na.pass)))

2 个答案:

答案 0 :(得分:2)

如果您熟悉caret package,您可以使用233种不同类型的模型(包括来自包e1071的SVM),在"models clustered by tag similarity"部分,您可以找到一个csv他们用来对算法进行分组的数据。

有一个名为 Handle Missing Predictor Data 的列,它告诉您哪些算法可以执行您想要的操作。不幸的是,SVM不包括在内,但这些算法是:

  • Boosted Classification Trees(ada)
  • Bagged AdaBoost(AdaBag)
  • AdaBoost.M1(AdaBoost.M1)
  • C5.0(C5.0)
  • 对成本敏感的C5.0(C5.0Cost)
  • 单个C5.0规则集(C5.0规则)
  • 单个C5.0树(C5.0Tree)
  • CART(rpart)
  • CART(rpart1SE)
  • CART(rpart2)
  • 对成本敏感的CART(rpartCost)
  • CART或Ordinal Responses(rpartScore)

如果你仍然坚持使用SVM,你可以使用同一个包中preProccess function的knnImpute选项,这样你就可以预测你的所有观察结果。

答案 1 :(得分:0)

您可以将所有有效案例分配回tmp集合中的预测变量:

tmp[complete.cases(tmp), "predict"] <- predict(model, newdata=tmp[complete.cases(tmp),]) 
tmp

#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species    predict
#1             NA         3.5          1.4         0.2     setosa       <NA>
#2            4.9         3.0          1.4         0.2     setosa     setosa
#3            4.7         3.2          1.3         0.2     setosa     setosa
# ...