【问题标题】:SVM equations from e1071 R package?e1071 R 包中的 SVM 方程?
【发布时间】:2011-11-15 10:51:30
【问题描述】:

我有兴趣测试 SVM 的性能,以将几个人分为四个组/类。当使用 MATLAB 中的 svmtrain LibSVM 函数时,我能够根据该方程的值获得用于将这些个体分类为 4 组的三个方程。方案可能如下:

                All individuals (N)*
                      |
 Group 1 (n1) <--- equation 1 --->  (N-n1)
                                      |
                   (N-n1-n2) <--- equation 2 ---> Group 2 (n2)
                      |
Group 3 (n3) <--- equation 3 ---> Group 4(n4)

*N = n1+n2+n3+n4

有没有什么方法可以使用 e1071 R 包中的 svm 函数得到这些方程?

【问题讨论】:

    标签: r machine-learning svm libsvm


    【解决方案1】:

    svm in e1071 使用“一对一”策略进行多类分类(即所有对之间的二元分类,然后进行投票)。因此,要处理这种分层设置,您可能需要手动执行一系列二进制分类器,例如第 1 组与全部,然后第 2 组与剩下的任何东西,等等。此外,基本的svm 函数不会调整超参数,因此您通常希望在e1071 中使用tune 之类的包装器,或者在出色的caret 包中使用train

    无论如何,要在 R 中对新个体进行分类,您不必手动将数字代入方程。相反,您使用 predict 泛型函数,它具有适用于不同模型(如 SVM)的方法。对于这样的模型对象,您通常也可以使用通用函数plotsummary。下面是一个使用线性 SVM 的基本思想示例:

    require(e1071)
    
    # Subset the iris dataset to only 2 labels and 2 features
    iris.part = subset(iris, Species != 'setosa')
    iris.part$Species = factor(iris.part$Species)
    iris.part = iris.part[, c(1,2,5)]
    
    # Fit svm model
    fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear')
    
    # Make a plot of the model
    dev.new(width=5, height=5)
    plot(fit, iris.part)
    
    # Tabulate actual labels vs. fitted labels
    pred = predict(fit, iris.part)
    table(Actual=iris.part$Species, Fitted=pred)
    
    # Obtain feature weights
    w = t(fit$coefs) %*% fit$SV
    
    # Calculate decision values manually
    iris.scaled = scale(iris.part[,-3], fit$x.scale[[1]], fit$x.scale[[2]]) 
    t(w %*% t(as.matrix(iris.scaled))) - fit$rho
    
    # Should equal...
    fit$decision.values
    

    将实际类标签与模型预测制表:

    > table(Actual=iris.part$Species, Fitted=pred)
                Fitted
    Actual       versicolor virginica
      versicolor         38        12
      virginica          15        35
    

    svm模型对象中提取特征权重(用于特征选择等)。这里Sepal.Length显然更有用。

    > t(fit$coefs) %*% fit$SV
         Sepal.Length Sepal.Width
    [1,]    -1.060146  -0.2664518
    

    要了解决策值的来源,我们可以手动将它们计算为特征权重和预处理特征向量的点积,减去截距偏移rho。 (如果使用 RBF SVM 等,预处理意味着可能居中/缩放和/或内核转换等)

    > t(w %*% t(as.matrix(iris.scaled))) - fit$rho
             [,1]
    51 -1.3997066
    52 -0.4402254
    53 -1.1596819
    54  1.7199970
    55 -0.2796942
    56  0.9996141
    ...
    

    这应该等于内部计算的值:

    > head(fit$decision.values)
       versicolor/virginica
    51           -1.3997066
    52           -0.4402254
    53           -1.1596819
    54            1.7199970
    55           -0.2796942
    56            0.9996141
    ...
    

    【讨论】:

    • 谢谢你的回答,约翰。因为我想知道这些方程的原因是为了评估总体中哪些参数在对我的事件进行分类时更重要。
    • @ManuelRamón 啊,明白了。这些被称为线性 SVM 的“权重”。有关如何从 svm 模型对象进行计算的信息,请参见上面的编辑。祝你好运!
    • 您的示例只有两个类别(versicolor 和 virginica),并且您得到了一个具有两个系数的向量,一个用于对虹膜数据进行分类的每个变量。如果我有 N 个类别,我会从 with(fit, t(coefs) %*% SV) 获得 N-1 个向量。每个向量的含义是什么?
    • 权重向量的长度将等于实际使用以适应 SVM 的特征数量。如果您使用公式接口和因子特征,您的输入特征将通过model.matrix() 处理成数字虚拟变量。因此,如果您有一个具有 3 个级别的因子特征,它将仅被处理为两个最终特征。这可能就是您的 N-1 的来源。
    • 哦,我明白了……你决定先使用多类模式。我明白你在说什么 - 如果在完整的 iris 数据上运行,coefs 只有两列,我原以为是 3。rho 有 3 个值,decision.values 也有 3 列(对于3 个一对一的二元分类器)。有关如何手动计算决策值的信息,请参见上文,但到目前为止,我无法从这 2 个 coefs 集合和 3 个 rho 值的任意组合中重现存储在 decision.values 中的内容。我现在被难住了……
    猜你喜欢
    • 2015-06-20
    • 2012-06-16
    • 2019-01-21
    • 2016-06-21
    • 2014-08-03
    • 2014-08-01
    • 1970-01-01
    • 2023-03-18
    • 2014-03-27
    相关资源
    最近更新 更多