r语言 - 使用 SVM 的 Kaggle 数字识别器 (e1071):predict.svm(ret, xhold, de



我正在尝试解决 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)

这也无济于事。

阅读手册 (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]))

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

您可能还希望移除训练数据中常量的特征(其中训练数据矩阵的相应列中的值都相同(,因为这些特征不会影响分类。

我认为您不需要手动扩展它,因为 svm 本身会像大多数神经网络包一样做到这一点。

您还可以使用 svm 的公式版本代替矩阵和向量,

svm(result~.,data = your_training_set)

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

如果您可以共享数据,我可以调试它:Given_Training_data。德达塔

最新更新