我正在处理一个回归问题。对于我的模型,我使用随机森林分类器进行降维。输出是一个由布尔值组成的以空格分隔的字符串,这些布尔值将好的特征标记为“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]]]