5

我是 R 和 SVM 的新手,我正在尝试svme1071包中分析功能。但是,我找不到任何大型数据集可以让我获得不同输入数据大小的良好结果分析范围。有谁知道怎么锻炼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工作更加努力......

4

1 回答 1

8

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

SVM 性能会因以下原因而降低:

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

改变参数

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

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

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

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

要使用的数据集:

UCI 机器学习存储库是数据集的重要来源。

MNIST手写识别数据集是一个很好用的数据集——您可以随机选择数据子集来创建越来越大的数据集。请记住,链接中的数据包含所有数字,SVM 当然是二进制的,因此您必须将数据减少到两位数或执行某种多类 SVM。

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

于 2012-06-14T20:37:15.273 回答