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 作为神经网络或任何算法的输入
| 归档时间: |
|
| 查看次数: |
8356 次 |
| 最近记录: |