在R中分析SVM(e1071)

时间:2012-06-13 14:45:43

标签: r statistics machine-learning bioinformatics svm

我是R和SVM的新手,我正在尝试从svm包中分析e1071函数。但是,我找不到任何大型数据集,这些数据集允许我获得改变输入数据大小的良好分析范围。有谁知道如何工作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更加努力......

1 个答案:

答案 0 :(得分:8)

就“工作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,以便分布在边缘重叠。经典的非线性示例是棋盘格。生成点并以棋盘图案标记它们。更难以扩大正方形的数量,增加尺寸并增加数据点的数量。当然,你必须使用非线性内核。