繁体   English   中英

在R中分析SVM(e1071)

[英]Profiling SVM (e1071) in R

我是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”方面 - 什么使SVM工作“更难”是一个更复杂的模型,不容易分离,更高的维度和更大,更密集的数据集。

SVM性能下降:

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

改变参数

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

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

通常,您在进行参数搜索时会发现,有些参数会增加计算时间而精度没有明显提高。

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

要使用的数据集:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM