如何将随机林中选定的特征转换为新的lis

2024-03-28 18:45:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个回归问题。对于我的模型,我使用随机森林分类器进行降维。输出是一个以空格分隔的布尔值字符串,它将好的特性突出显示为“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

Tags: columnsinpyfalsetruepandasgetindex
2条回答

我会这样做:

columns_list = list(x_train.columns[selected_list])
selected_test = test[columns_list]

这样,您就可以从x_train中检索所选列的名称,将它们放入column_list,然后在test中搜索它们。即使train和test数据没有相同数量的列,这种方法也应该有效;显然,如果test数据没有一个选定的特性,这种方法就行不通了。你知道吗

你的问题是:

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

将布尔值与字符串值'True'而不是True进行比较

一个紧凑的和脓性的解决方案是:

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

对于第二个错误,这是因为您正在使用[]访问数据帧test。您需要使用方法.iloc

对于用法,取决于测试包含的内容:

test.iloc[0] # first row of data frame- Note a Series data type output.
test.iloc[1] # second row of data frame 
test.iloc[-1] # last row of data frame 
# Columns:
test.iloc[:,0] # first column of data frame 
test.iloc[:,1] # second column of data frame 
test.iloc[:,-1] # last column of data frame

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

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

相关问题 更多 >