我找不到关于此错误的任何信息,所以我想问一下:
我正在训练mnist数据集上的SVM(超向量机),该数据集包含灰度的手写图像的像素值(每个像素1个值)。为此,我使用R中的e1071库。使用e1071库训练SVM的主要方法有三种:“线性”,“径向”和“多项式”。当我尝试“线性”调整成本函数时,我得到了明智的结果,实际上是出色的结果,我对它们感到非常满意。但是,当我尝试“径向”并在测试数据集上进行预测时,会得到以下混淆矩阵: Reference
Prediction 0 1 2 3 4 5 6 7 8 9
0 0 3621 0 0 0 0 0 0 0 0
1 0 4149 0 0 0 0 0 0 0 0
2 0 3666 0 0 0 0 0 0 0 0
3 0 3833 0 0 0 0 0 0 0 0
4 0 3593 0 0 0 0 0 0 0 0
5 0 3352 0 0 0 0 0 0 0 0
6 0 3648 0 0 0 0 0 0 0 0
7 0 3905 0 0 0 0 0 0 0 0
8 0 3568 0 0 0 0 0 0 0 0
9 0 3665 0 0 0 0 0 0 0 0
我尝试弄乱它,并尝试对其进行调整,但是我无法使用径向核将其归类为1以外的任何图像。知道为什么吗?
这是我的线性模型代码:
library(nnet)
library(caret)
library(plyr)
library(dplyr)
library(e1071)
library(OpenImageR)
library(glmnet)
set.seed(200)
mnist.dat <- read.csv("reduced.csv")
# Data preparation --------------------------------------------------------
#set minimum contrast by filtering pixels that average below a pre determined value
mnist.dat <- mnist.dat[, colSums(mnist.dat != 0) > 0]
#sample dataset into training, testing and validation datasets
index <- sample(nrow(mnist.dat), 5000)
samples <- mnist.dat[index, ]
last_test <- mnist.dat[-index, ]
samples$label <- as.factor(samples$label)
last_test$label <- as.factor(last_test$label)
label.index <- which(names(mnist.dat)=="label")
# svm, cost tuning, 5 folds -----------------------------------------------
mnist.svm.tune <- tune(
svm,
samples[,-label.index],
samples$label,
kernel = "linear",
ranges = list(cost=c(
1*10^-6:9
)
)
)
mnist.svm <- svm(
samples[,-label.index],
samples$label,
kernel = "linear",
scale = FALSE,
cross = 5,
cost = mnist.svm.tune[["best.parameters"]][["cost"]]
)
mnist.svm.cm <- confusionMatrix(
last_test[,label.index],
predict(
mnist.svm,
last_test[,-label.index]
)
)
哪个会产生更明智的混淆矩阵:
Reference
Prediction 0 1 2 3 4 5 6 7 8 9
0 3514 0 13 1 12 25 20 3 26 7
1 0 4066 20 16 5 5 4 4 22 7
2 30 22 3264 40 67 15 57 65 87 19
3 18 22 83 3321 8 180 20 35 110 36
4 6 14 17 0 3334 4 33 15 11 159
5 30 43 26 112 43 2890 66 16 96 30
6 31 10 29 1 37 43 3481 0 16 0
7 13 39 52 6 55 18 2 3573 23 124
8 8 75 36 68 18 99 39 18 3142 65
9 15 24 15 46 171 21 0 116 40 3217
这是我用来通过径向内核生成SVM的代码,该代码在本文的顶部产生了混淆矩阵:
test.svm <- svm(samples$label ~ ., data = samples[,-174], kernel = "radial", gamma = 0.1, cost = 1)
我尝试对其进行调整:
test.svm.tune <- tune.svm(samples$label ~ ., data = samples[,-174], gamma = 10^(-5:-1), cost = 10^(-3:1))
这导致了以下错误:
Error in model.frame.default(formula, data) :
variable lengths differ (found for 'V7')
显然不是这种情况,我手动检查过,V7的长度与所有其他长度相同。这对我来说似乎很明显,因为线性模型不会产生此错误。
我再次尝试,也许我应该指定径向:
test.svm.tune <- tune.svm(samples$label ~ ., data = samples[,-174], kernel = "radial", gamma = 10^(-5:-1), cost = 10^(-3:1))
但是我遇到了同样的错误,因为“径向”是默认设置,因此很合理。如果有人能指出我做错了什么,那将是我不为所动的沉重负担,所以请提前谢谢您!