【问题标题】:Profiling SVM (e1071) in R在 R 中分析 SVM (e1071)
【发布时间】:2012-06-16 13:28:16
【问题描述】:

我是 R 和 SVM 的新手,我正在尝试从 e1071 包中分析 svm 函数。但是,我找不到任何大型数据集可以让我获得不同输入数据大小的良好结果分析范围。有谁知道如何在svm 工作?我应该使用哪个数据集? svm 的任何特定参数使它更努力地工作?

我复制了一些我用来测试性能的命令。也许在这里得到我正在尝试的东西是最有用和更容易的:

#loading libraries
library(class)
library(e1071)
#I've been using golubEsets (more examples availables)
library(golubEsets)

#get the data: matrix 7129x38
data(Golub_Train)
n <- exprs(Golub_Train)

#duplicate rows(to make the dataset larger)
n<-rbind(n,n)

#take training samples as a vector
samplelabels <- as.vector(Golub_Train@phenoData@data$ALL.AML)

#calculate svm and profile it
Rprof('svm.out')
svmmodel1 <- svm(x=t(n), y=samplelabels, type='C', kernel="radial", cross=10)
Rprof(NULL)

我不断增加重复行和列的数据集,但我达到了内存限制,而不是让svm 更努力地工作......

【问题讨论】:

  • 复制训练点不会让问题变得更难。由于大多数 SVM 需要将整个数据集放入主内存中,因此您最终会遇到内存错误是有道理的。
  • 那么,如何尝试使用合适的大数据集?你知道我可以用什么例子吗?
  • 是的,如果您看到我的回答,我列出了许多可用的数据集。此外,您应该进行参数调整以找到最佳参数,您会发现当您搜索最准确的参数时,有些参数的训练时间会比其他参数长。查看 libsvm 作者的实用指南:google.com/…
  • 您可以尝试使用 GuessCompx 包,该包对不断增加的数据子集运行算法,以估计其复杂性和总运行时间。从这里获取:github.com/agenis/GuessCompx

标签: r statistics machine-learning bioinformatics svm


【解决方案1】:

就“解决 SVM”而言 - 使 SVM “更努力”工作的是一个更复杂的模型,该模型不容易分离、更高的维度和更大、更密集的数据集。

SVM 性能下降:

  • 数据集大小增加(数据点数)
  • 稀疏度降低(零更少)
  • 维度增加(属性数量)
  • 使用非线性内核(内核参数可以使 内核评估更复杂)

可变参数

是否可以更改参数以使 SVM 花费更长的时间。当然,这些参数会影响您将获得的解决方案的质量,并且可能没有任何使用意义。

使用 C-SVM,不同的 C 将导致不同的运行时。 (nu-SVM 中的类似参数是 nu)如果数据集是合理可分的,则使 C 更小将导致运行时间更长,因为 SVM 将允许更多的训练点成为支持向量。如果数据集不是很可分离,使 C 更大会导致更长的运行时间,因为您实际上是在告诉 SVM 您想要一个与数据紧密匹配的窄边距解决方案,并且当数据不容易计算时将花费更长的时间来计算分开。

在进行参数搜索时,您经常会发现有些参数会增加计算时间,而准确性却没有明显提高。

其他参数是内核参数,如果您改变它们以增加计算内核的复杂性,那么 SVM 运行时间自然会增加。线性核很简单,速度最快;非线性内核当然需要更长的时间。一些参数可能不会增加内核的计算复杂度,但会强制建立一个更复杂的模型,这可能需要 SVM 更长的时间才能找到最优解。

要使用的数据集:

UCI Machine Learning Repository 是一个很好的数据集来源。

MNIST handwriting recognition dataset 非常适合使用 - 您可以随机选择数据子集来创建越来越大的数据集。请记住,链接中的数据包含所有数字,SVM 当然是二进制的,因此您必须将数据减少到只有两位数或执行某种多类 SVM。

您也可以轻松生成数据集。要生成线性数据集,请随机选择超平面的法线向量,然后生成数据点并确定它落在超平面的哪一侧来标记它。添加一些随机性以允许在超平面一定距离内的点有时被不同地标记。通过增加类之间的重叠来增加复杂性。或者生成一些正态分布点的集群,标记为 1 或 -1,以便分布在边缘重叠。经典的非线性示例是棋盘格。生成点并以棋盘模式标记它们。为了使其更难扩大正方形的数量,增加维度并增加数据点的数量。当然,您必须使用非线性内核。

【讨论】:

  • 非常感谢您的精彩解释。我很感激。我已经更新了我的问题,看看这是否有帮助
  • karenu 输入矩阵呢?我真的很难理解何时以及为什么需要对其应用转置。我已经看到了几个例子,每个人都在做不同的事情。我如何知道何时需要将 t() 应用于输入矩阵?
猜你喜欢
  • 2023-03-18
  • 2011-11-15
  • 1970-01-01
  • 2019-01-21
  • 2014-01-09
  • 2016-08-13
  • 2015-06-20
  • 2014-03-27
  • 1970-01-01
相关资源
最近更新 更多