我正在尝试解决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)
它也没有帮助。
答案 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