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

How to do feature selection using linear SVM weights

我已经为两种类型的 类(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 和标准差 = 1。
  2. 训练您的模型
  3. 取权重的绝对值。即如果权重为-0.57,则取0.57。

您可以选择对不同的训练数据集重复上述几次,这些训练数据集是您通过随机重新采样原始训练数据创建的。

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

因此,执行递归特征消除:

  1. 首先在整个特征集上训练一个模型,然后计算它的特征重要性。
  2. 丢弃重要性值最小的特征,并在剩余特征上重新训练模型
  3. 重复 2,直到您拥有足够小的特征集[1]。

[1] 其中一组足够小的特征取决于将模型应用于验证集时准确性开始受到影响的点。注意:在做这种特征方法时 selection,确保你不仅有一个单独的训练和测试集,还有一个验证集,用于选择保留多少特征。