如何将随机森林选择的特征转换为新列表

我正在处理一个回归问题。对于我的模型,我使用随机森林分类器进行降维。输出是一个由布尔值组成的以空格分隔的字符串,这些布尔值将好的特征标记为“True”。看起来是这样的:

[ True  True  True  True  True  True  True  True  True  True  True  True  True  True  True False  True  True False  True  True  True False  True  True  True  True  True  True  True  True False  True False False  True  True False False False False False False False False False False  True False False  True False False False False False False  True False False False  True False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False  True False False  True False False False  True False  True False False False False False False False False False False False False False False False False False False False False False  True False False False False False False False False  True False False False False False False  True False False False  True  True False False False False False False False False False False False False False False False False False False False  True False False False False False False False  True False False  True False  True False  True False False  True False False False False False False False False False False False False False False  True False  True False  True False False False False False False False False False  True  True False False False False False False False False False  True False  True  True False  True False False False False False  True  True  True False False False False False False False False False False False False False False False False False False False False False False False False  True False False False False False False False False False False False False False  True False False False False  True False]

所以我做了的是将其转换为一个以逗号分隔的列表,像这样:

[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, False, True, True, True, False, True, True, True, True, True, True, True, True, False, True, False, False, True, True, False, False, False, False, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, False, True, False, False, False, True, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, True, False, False, False, True, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, False, True, False, True, False, True, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, True, False, True, True, False, True, False, False, False, False, False, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False]

然后遍历每个元素并检索相应的测试列。这是整个过程的代码:

sel = SelectFromModel(RandomForestClassifier(n_estimators = 100), threshold = '1.25*mean')
sel.fit(x_train, y_train)
selected = sel.get_support()
selected_list = list(selected)
columns_list = []
for i in range(len(selected_list)):
    if(selected_list[i] == 'True'):
        columns_list.append(test[i])
print(columns_list)

但是现在我得到一个空列表,尽管我尝试将其添加到我的columns_list中。基本上,我的目标是使用降维后的列进行预测。我在这个问题上使用线性回归。

更新

当我将代码更改为下面的建议时,我得到了以下错误:

Traceback (most recent call last):
  File "/opt/anaconda/envs/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 2890, in get_loc
    return self._engine.get_loc(key)
  File "pandas/_libs/index.pyx", line 107, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 131, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1607, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1614, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/home/onur/Documents/Boston-Kaggle/Model.py", line 100, in <module>
    columns_list.append(test[i])
  File "/opt/anaconda/envs/lib/python3.7/site-packages/pandas/core/frame.py", line 2975, in __getitem__
    indexer = self.columns.get_loc(key)
  File "/opt/anaconda/envs/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 2892, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 107, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 131, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1607, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1614, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0

回答:

你的问题在这里:

if(selected_list[i] == 'True'):
    columns_list.append(test[i])

你正在将一个布尔值与字符串值'True'进行比较,而不是True

一个紧凑且符合Python风格的解决方案是:

if selected_list[i]:
    columns_list.append(test[i])

对于你的第二个错误,那是由于你使用[]访问数据框test。你需要使用.iloc方法

至于使用方式,这取决于test包含什么内容:

test.iloc[0] # 数据框的第一行 - 注意输出是一个Series数据类型。
test.iloc[1] # 数据框的第二行
test.iloc[-1] # 数据框的最后一行
# 列:
test.iloc[:,0] # 数据框的第一列
test.iloc[:,1] # 数据框的第二列
test.iloc[:,-1] # 数据框的最后一列

编辑,一个更明确的解决方案:

columns_selected = test.iloc[:, [i for i in range(len(selected_list)) if selected_list[i]]]

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注