使用 SVM (e1071) 的 Kaggle 数字识别器:predict.svm(ret, xhold, decision.values = TRUE) 错误:模型为空
Kaggle Digit Recognizer Using SVM (e1071): Error in predict.svm(ret, xhold, decision.values = TRUE) : Model is empty
我正在尝试解决 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,这是一个回归
如果你能分享 data:Given_Training_data.RData
我可以调试它
我正在尝试解决 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,这是一个回归
如果你能分享 data:Given_Training_data.RData
我可以调试它