2017-02-20 6 views
3

Я пытаюсь сделать прогнозы с использованием обученного SVM из пакета e1071, но мои данные содержат некоторые отсутствующие значения (NA).R SVM return NA для прогнозов с отсутствующими данными

Я бы хотел, чтобы возвращаемые предсказания были NA, когда у этого экземпляра есть какие-либо отсутствующие значения. Я попытался использовать na.action = na.pass, как показано ниже, но он дает мне ошибку «Ошибка в именах (ret2) < - rowns: атрибут« имена »[150] должен быть такой же длины, как и вектор [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

Вы можете просто присвоить все действительные случаи назад к переменному прогнозированию в 'tmp' набор -' TMP [complete.cases (tmp), «предсказывать»] <- pred (model, newdata = tmp [complete.cases (tmp),]) 'или эквивалент. – thelatemail

+0

Спасибо, это здорово. Учитывая, что я должен работать с SVM и хочу NA, а не вменение, это путь. – Jake

ответ

2

, если вы знакомы с caret package, где вы можете использовать 233 различных типов моделей, чтобы соответствовать (в том числе SVM из пакета e1071), в разделе под названием "models clustered by tag similarity" там вы можете найти CSV с данными, они использовали для группировки алгоритмов.

Существует столбец, который называется Данные о пропавших без вести предсказателях, в которых говорится, какие алгоритмы могут делать то, что вы хотите. К сожалению SVM не включена, но эти алгоритмы:

  • Boosted Деревья классификации (ADA)
  • Bagged AdaBoost (AdaBag)
  • AdaBoost.M1 (AdaBoost.M1)
  • C5.0 (C5.0)
  • Экономически Sensitive C5.0 (C5.0Cost)
  • Single C5.0 Ruleset (C5.0Rules)
  • Single C5.0 Tree (C5.0Tree)
  • CART (rpart)
  • CART (rpart1SE)
  • CART (rpart2)
  • Экономически Sensitive CART (rpartCost)
  • CART или Порядковые Ответы (rpartScore)

Если вы по-прежнему настаивают на том, при использовании SVM вы можете использовать опцию knnImpute в preProccess function из того же пакета, что должно позволить вам прогнозировать все ваши наблюдения.

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 
# ...