如何使用线性SVM权重进行特征选择

时间:2018-01-08 12:53:03

标签: r svm linear feature-selection

我使用以下代码为两种类(1和0)构建了SVM线性模型:

class1.svm.model <- svm(Class ~ ., data = training,cost=1,cross=10, metric="ROC",type="C-classification",kernel="linear",na.action=na.omit,probability = TRUE)

我使用以下代码提取训练集的权重:

#extract the weights and constant from the SVM model:

w <- t(class1.svm.model$coefs) %*% class1.svm.model$SV;  
b <- -1 * class1.svm.model$rho; #(sometimes called w0)

我为每个功能获得权重,如下例所示:

X2  0.001710949
X3  -0.002717934
X4  -0.001118897
X5  0.009280056
X993    -0.000256577
X1118   0
X1452   0.004280963
X2673   0.002971335
X4013   -0.004369505

现在,如何根据为每个要素提取的权重执行要素选择?我该如何建立一个权重矩阵?

我读过论文,但这个概念还不清楚,请帮助!

1 个答案:

答案 0 :(得分:3)

我很快就把这个答案写下来了,所以我希望其他人可以扩展一些点,但是有些东西可以让你开始......

有很多种方法可以解决这个问题,但要解决的首要问题是将线性权重转换为衡量每个要素对分类的重要程度。这是一个相对简单的三步过程:

  1. 规范化输入数据,使每个要素的均值= 0,标准差= 1。
  2. 训练你的模特
  3. 取权重的绝对值。也就是说,如果重量是-0.57,则取0.57。
  4. 您可以选择通过对原始训练数据随机重新采样而创建的不同训练数据集重复上述几次来生成更强大的特征重要性度量。

    现在您已经可以确定每个功能对分类的重要程度,您可以通过多种不同方式使用它来选择要包含在最终模型中的功能。我将举一个递归特征消除的例子,因为它是我的最爱之一,但你可能想要研究迭代特征选择或噪声扰动。

    因此,要执行递归功能消除:

    1. 首先训练整个特征集的模型,然后计算它的特征重要性。
    2. 丢弃具有最小重要性值的要素,并在剩余要素上重新训练模型
    3. 重复2,直到您拥有足够小的一组功能[1]。
    4. [1]其中一组足够小的特征由您将模型应用于验证集时精度开始受到影响的点确定。注意:在进行这种特征选择方法时,请确保您不仅拥有单独的培训和测试集,还需要一个验证集,用于选择要保留的特征数。