我有一个由具有 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)
根据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))
产生:
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']
鉴于一种热编码引入了多重共线性,我认为目标列选择并不理想,因为它选择的特征是非编码的连续数据特征。我尝试重新添加未编码的目标列,但 RFE 抛出以下错误,因为数据是分类的:
ValueError: could not convert string to float: Wireless Access Point
我是否需要将多个热编码特征列组合为目标?
[编辑 2]
如果我只是对目标列进行 LabelEncode,我可以将此目标用作 'y'再次参见示例。但是,输出仅将单个特征(目标列)确定为最佳。我认为这可能是因为一个热编码,我是否应该考虑生产一个密集的阵列,如果是这样,它可以针对 RFE 运行吗?
谢谢,
亚当