如何通过弹性网络特征选择、交叉验证和 SVM 选择最终模型?

机器算法验证 模型选择 交叉验证 支持向量机 特征选择 弹性网
2022-03-27 02:47:40

我有一个包含大约 100 个样本的数据集,每个样本都有 >10,000 个特征,其中一些特征高度相关。这是我目前正在做的事情。

  1. 将数据集分成三部分。

  2. 对于每一折,
    2.1 对 100 个 lambda 值运行弹性网络。(这将返回一个 nfeatures x 100 矩阵)
    2.2 取所有非零权重的并集。(返回一个 nfeatures x 1 向量)

  3. 选择与2.2返回的非零权重对应的特征

  4. 使用这些功能来训练和测试 SVM。

我的问题是,在第 3 步中,每次折叠我都会得到一组不同的功能。我如何从中得到一个最终模型?一份相关功能的最终清单?我可以对所有折叠在步骤 3 中选择的特征进行交集吗?在所有三个折叠中选择的特征似乎是最稳定/最重要的。我可以这样做,还是作弊?

1个回答

通过“对于每一折,我得到一组不同的特征”,我怀疑您的意思是您正在使用 k 折交叉验证程序来估计模型的性能。关于交叉验证要记住的一点是,您正在估计构建模型的方法的性能,而不是模型本身。因此,您形成最终模型,只需使用交叉验证的每一折中使用的程序,但使用所有数据,而不是 (k-1)/k 个数据。

我不确定使用弹性网络来选择 SVM 的功能是否有很多好处。SVM 是泛化性能界限的近似实现,它与输入空间的维数无关,因此选择一个好的 C,它应该在 10,000 维的特征空间中工作得很好(这就是我所拥有的)也是通过实践经验发现的)。

作为一种束手无策的方法,您可以使用自举 SVM,并使用袋外误差来估计性能。如果你有一个线性支持向量机,那么你可以在训练后将所有自举的支持向量机组合成一个线性模型,这样在操作上就不会有性能问题。同样,弹性网络模型的平均值也可能会很好地工作。