使用SVM的Kaggle数字识别器(e1071):predict.svm中的错误(ret,xhold,decision.values = TRUE):模型为空

时间:2017-08-23 01:12:57

标签: r svm

我正在尝试解决Kaggle中的数字识别器竞争,我遇到了这个错误。

我加载了训练数据并通过将其除以最大像素值255来调整它的值。之后,我正在尝试构建我的模型。

这里是我的代码,

Given_Training_data <- get(load("Given_Training_data.RData"))
Given_Testing_data <- get(load("Given_Testing_data.RData"))

Maximum_Pixel_value = max(Given_Training_data)
Tot_Col_Train_data = ncol(Given_Training_data)
training_data_adjusted <- Given_Training_data[, 2:ncol(Given_Training_data)]/Maximum_Pixel_value
testing_data_adjusted <- Given_Testing_data[, 2:ncol(Given_Testing_data)]/Maximum_Pixel_value
label_training_data <- Given_Training_data$label
final_training_data <- cbind(label_training_data, training_data_adjusted)


smp_size <- floor(0.75 * nrow(final_training_data))
set.seed(100)
training_ind <- sample(seq_len(nrow(final_training_data)), size = smp_size)
training_data1 <- final_training_data[training_ind, ]
train_no_label1 <- as.data.frame(training_data1[,-1])
train_label1 <-as.data.frame(training_data1[,1])
svm_model1 <- svm(train_label1,train_no_label1) #This line is throwing an error

错误:predict.svm中的错误(ret,xhold,decision.values = TRUE):模型为空!

请分享您的想法。我不是在寻找答案,而是在我处于学习阶段时指导我正确的方向。

感谢。

更新问题:

trainlabel1 <- train_label1[sapply(train_label1, function(x) !is.factor(x) | length(unique(x))>1 )]
trainnolabel1 <- train_no_label1[sapply(train_no_label1, function(x) !is.factor(x) | length(unique(x))>1 )]
svm_model2 <- svm(trainlabel1,trainnolabel1,scale = F)

它也没有帮助。

2 个答案:

答案 0 :(得分:1)

阅读手册(https://cran.r-project.org/web/packages/e1071/e1071.pdf):

svm(x, y = NULL, scale = TRUE, type = NULL, ...)
...
Arguments:
...
x     a data matrix, a vector, or a sparse matrix (object of class 
Matrix provided by the Matrix package, or of class matrix.csr 
provided by the SparseM package,
or of class simple_triplet_matrix provided by the slam package).
y     a response vector with one label for each row/component of x. 
Can be either a factor (for classification tasks) or a numeric vector 
(for regression).

因此,主要问题是您对svm的调用正在切换数据矩阵和响应向量,并且您将响应向量作为整数传递,从而产生回归模型。此外,您还将响应向量作为单列数据帧传递,这不完全是您应该如何做到的。因此,如果您将呼叫更改为:

svm_model1 <- svm(train_no_label1, as.factor(train_label1[, 1]))

它将按预期工作。请注意,培训需要几分钟才能运行。

您可能还希望删除训练数据中恒定的特征(训练数据矩阵的相应列中的值全部相同),因为这些不会影响分类。

答案 1 :(得分:1)

我认为你不需要手动扩展它,因为与大多数神经网络包不同,svm本身就会这样做。

您也可以使用svm的公式版本而不是

的矩阵和向量
svm(result~.,data = your_training_set)

在你的情况下,我想你想确保结果被用作因子,因为你想要一个像1,2,3这样的标签而不是1.5467这是一个回归

如果你可以共享数据,我可以调试它:Given_Training_data.RData