使用 scikit learn 识别特征选择后的过滤特征

机器算法验证 特征选择 Python scikit-学习
2022-03-03 13:27:22

这是我在 Python中的特征选择方法的代码:

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
X_new = LinearSVC(C=0.01, penalty="l1", dual=False).fit_transform(X, y)
X_new.shape
(150, 3)

但是在获得新的 X(因变量 - X_new) 之后,我怎么知道哪些变量被删除以及在这个新的更新变量中考虑了哪些变量?(删除哪一个或哪三个存在于数据中。)

获得此标识的原因是对新的测试数据应用相同的过滤。

3个回答

或者,如果您在拟合 SVC 后使用 SelectFromModel 进行特征选择,则可以使用实例方法get_support这将返回一个布尔数组,映射每个特征的选择。接下来将其与原始特征名称数组连接,然后过滤布尔状态以生成一组相关的选定特征名称。

希望这有助于未来的读者,他们也在努力寻找在特征选择后获得相关特征名称的最佳方法。

例子:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X_new.shape) 
print(model.get_support()) 

您可以做两件事:

  • 检查coef_参数并检测忽略了哪一列
  • 使用相同的模型进行输入数据转换使用方法transform

您的示例的小修改

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.cross_validation import train_test_split
>>>
>>> iris = load_iris()
>>> x_train, x_test, y_train, y_test = train_test_split(
...     iris.data, iris.target, train_size=0.7
... )
>>>
>>> svc = LinearSVC(C=0.01, penalty="l1", dual=False)
>>>
>>> X_train_new = svc.fit_transform(x_train, y_train)
>>> print(X_train_new.shape)
(105, 3)
>>>
>>> X_test_new = svc.transform(x_test)
>>> print(X_test_new.shape)
(45, 3)
>>>
>>> print(svc.coef_)
[[ 0.          0.10895557 -0.20603044  0.        ]
 [-0.00514987 -0.05676593  0.          0.        ]
 [ 0.         -0.09839843  0.02111212  0.        ]]

如您所见,方法transform为您完成所有工作。而且从coef_矩阵你可以看到最后一列只是一个零向量,所以你模型忽略数据中的最后一列

基于@chinnychinchin 解决方案,我通常会这样做:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X.columns[model.get_support()]) 

它返回类似:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')