具有径向核的R支持向量机将同一类中的所有图像分类

时间:2019-12-05 22:52:52

标签: r kernel svm e1071

我找不到关于此错误的任何信息,所以我想问一下:

我正在训练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以外的任何图像。知道为什么吗?

  • 之所以有其他图书馆,是因为我同时在从事其他机器学习技术的研究,我是该领域的新手,并且正在大学中学习使用所有这些图书馆的课程,所以我并不完全确定我可以关闭。
  • 精简后的数据集就是原始的mnist数据集,其原始采样重新采样为14 x 14像素,而不是原始的28 x 28像素,以便我可以在截止日期(明天:P)之前完成分配。
  • 我要求不要以及格的分数结束课程(我可以使用线性模型轻松地做到这一点),但是因为我对可能产生此奇怪错误的原因感到困惑。

这是我的线性模型代码:

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))

但是我遇到了同样的错误,因为“径向”是默认设置,因此很合理。如果有人能指出我做错了什么,那将是我不为所动的沉重负担,所以请提前谢谢您!

0 个答案:

没有答案