我正在尝试解决 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。德达塔