我正在查看 Mallet 源代码,似乎大多数分类器实现(例如朴素贝叶斯)并没有真正考虑到特征选择,即使InstanceList
该类有一个setFeatureSelection
方法。
现在我想对我的数据集进行一些涉及特征选择的快速实验。我在想,从技术捷径的角度来看,我可能会获得排名最低的特征,并将这些值在实例向量中设置为 0。这在机器学习中是否等同于分类器训练中的特征选择,从而根本不考虑它们(如果不涉及平滑,例如拉普拉斯估计)?
谢谢你
我正在查看 Mallet 源代码,似乎大多数分类器实现(例如朴素贝叶斯)并没有真正考虑到特征选择,即使InstanceList
该类有一个setFeatureSelection
方法。
现在我想对我的数据集进行一些涉及特征选择的快速实验。我在想,从技术捷径的角度来看,我可能会获得排名最低的特征,并将这些值在实例向量中设置为 0。这在机器学习中是否等同于分类器训练中的特征选择,从而根本不考虑它们(如果不涉及平滑,例如拉普拉斯估计)?
谢谢你
是的,将特征值设置为零与将其从特征向量中移除具有相同的效果,因为 MALLET 没有“缺失特征”的概念,只有零和非零特征值。
不过,使用FeatureSelection
该类并不太痛苦。MALLET 带有几个内置类,这些类基于子类在底层应用“掩码” RankedFeatureVector
。例如,要使用信息增益特征选择,您应该能够做到这一点:
FeatureSelection fs = FeatureSelection(new InfoGain(ilist), numFeatures);
ilist.setFeatureSelection(fs);
您还可以实现自己的RankedFeatureVector
子类(API 在这里)以获得更多定制的东西。要以其他方式手动选择功能,您仍然可以通过创建一个功能掩码来执行此操作BitSet
,其中包含您要使用的所有功能 ID(来自字母表),例如:
java.util.BitSet featureMask = /* some code to pick your features */;
FeatureSelection fs = FeatureSelection(ilist.getAlphabet(), featureMask);
ilist.setFeatureSelection(fs);
一般来说,我建议使用FeatureSelection
对象而不是破坏性地更改实例数据。