从递归特征消除 (RFE) 中提取最佳特征

Ada*_*dam 2 machine-learning feature-selection python-2.7 scikit-learn rfe

我有一个由分类数据和数值数据组成的数据集,具有 124 个特征。为了降低其维度,我想删除不相关的特征。然而,为了针对特征选择算法运行数据集,我使用 get_dummies 对其进行了热编码,这将特征数量增加到 391 个。

In[16]:
X_train.columns
Out[16]:
Index([u'port_7', u'port_9', u'port_13', u'port_17', u'port_19', u'port_21',
   ...
   u'os_cpes.1_2', u'os_cpes.1_1'], dtype='object', length=391)
Run Code Online (Sandbox Code Playgroud)

根据生成的数据,我可以通过交叉验证运行递归特征消除,如Scikit Learn 示例所示:

其产生:

交叉验证分数与特征图

鉴于识别的特征的最佳数量是 8,我如何识别特征名称?我假设我可以将它们提取到一个新的 DataFrame 中以用于分类算法?


[编辑]

在这篇文章的帮助下,我实现了以下目标:

def column_index(df, query_cols):
    cols = df.columns.values
    sidx = np.argsort(cols)
    return sidx[np.searchsorted(cols, query_cols, sorter = sidx)]

feature_index = []
features = []
column_index(X_dev_train, X_dev_train.columns.values)

for num, i in enumerate(rfecv.get_support(), start=0):
    if i == True:
        feature_index.append(str(num))

for num, i in enumerate(X_dev_train.columns.values, start=0):
    if str(num) in feature_index:
        features.append(X_dev_train.columns.values[num])

print("Features Selected: {}\n".format(len(feature_index)))
print("Features Indexes: \n{}\n".format(feature_index))
print("Feature Names: \n{}".format(features))
Run Code Online (Sandbox Code Playgroud)

其产生:

Features Selected: 8
Features Indexes: 
['5', '6', '20', '26', '27', '28', '67', '98']
Feature Names: 
['port_21', 'port_22', 'port_199', 'port_512', 'port_513', 'port_514', 'port_3306', 'port_32768']
Run Code Online (Sandbox Code Playgroud)

鉴于一种热编码引入了多重共线性,我认为目标列选择并不理想,因为它选择的特征是非编码的连续数据特征。我尝试重新添加未编码的目标列,但 RFE 抛出以下错误,因为数据是分类的:

ValueError: could not convert string to float: Wireless Access Point
Run Code Online (Sandbox Code Playgroud)

我是否需要将多个热编码特征列分组作为目标?


[编辑2]

如果我只是对目标列进行 LabelEncode,我可以将此目标用作“y”,请再次参见示例。但是,输出仅确定单个特征(目标列)为最佳特征。我认为这可能是因为一种热编码,我是否应该考虑生成一个密集数组,如果是的话,它可以针对 RFE 运行吗?

小智 5

你可以这样做:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
rfe = RFE(model, 5) 
rfe = rfe.fit(X, y)
print(rfe.support_)
print(rfe.ranking_)
f = rfe.get_support(1) #the most important features
X = df[df.columns[f]] # final features`
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 X 作为神经网络或任何算法的输入