- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 sklearn 中使用了 RandomForestClassifier 来确定数据集中的重要特征。我如何能够返回实际的特征名称(我的变量标记为 x1、x2、x3 等)而不是它们的相对名称(它告诉我重要的特征是“12”、“22”等)。以下是我目前用于返回重要功能的代码。
important_features = []
for x,i in enumerate(rf.feature_importances_):
if i>np.average(rf.feature_importances_):
important_features.append(str(x))
print important_features
此外,为了理解索引,我能够找出重要特征“12”实际上是什么(它是变量 x14)。当我将变量 x14 移动到训练数据集的 0 索引位置并再次运行代码时,它应该告诉我特征“0”很重要,但事实并非如此,就像它看不到该特征一样不再是,列出的第一个功能实际上是我第一次运行代码时列出的第二个功能(功能“22”)。
我在想,也许 feature_importances_ 实际上是在使用第一列(我放置 x14 的位置)作为训练数据集其余部分的一种 ID,因此在选择重要特征时忽略了它。任何人都可以阐明这两个问题吗?预先感谢您的任何帮助。
编辑
以下是我存储特征名称的方式:
tgmc_reader = csv.reader(csvfile)
row = tgmc_reader.next() #Header contains feature names
feature_names = np.array(row)
然后我加载了数据集和目标类
tgmc_x, tgmc_y = [], []
for row in tgmc_reader:
tgmc_x.append(row[3:]) #This says predictors start at the 4th column, columns 2 and 3 are just considered ID variables.
tgmc_y.append(row[0]) #Target column is the first in the dataset
然后继续将数据集拆分为测试和训练部分。
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(tgmc_x, tgmc_y, test_size=.10, random_state=33)
然后拟合模型
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=1, criterion='entropy', max_features=2, max_depth=5, bootstrap=True, oob_score=True, n_jobs=2, random_state=33)
rf = rf.fit(x_train, y_train)
然后返回重要的特征
important_features = []
for x,i in enumerate(rf.feature_importances_):
if i>np.average(rf.feature_importances_):
important_features.append((x))
然后我采纳了你的建议(非常感谢!)
important_names = feature_names[important_features > np.mean(important_features)]
print important_names
它确实返回了变量名。
['x9' 'x10' 'x11' 'x12' 'x13' 'x15' 'x16']
所以您肯定已经解决了我问题的一部分,这太棒了。但是当我回去打印我的重要特征的结果时
print important_features
它返回以下输出:
[12, 22, 51, 67, 73, 75, 87, 91, 92, 106, 125, 150, 199, 206, 255, 256, 275, 309, 314, 317]
我将其解释为它认为第 12、22、51 等变量是重要变量。所以这将是从我告诉它在我的代码开头索引观察点开始的第 12 个变量:
tgmc_x.append(row[3:])
这种解释正确吗?如果这是正确的,当我将第 12 个变量移动到原始数据集中的第 4 列(我告诉它开始使用我刚刚引用的代码读取预测值)并再次运行代码时,我得到以下输出:
[22, 51, 66, 73, 75, 76, 106, 112, 125, 142, 150, 187, 191, 199, 250, 259, 309, 317]
这似乎不再识别该变量。此外,当我将相同的变量移动到原始数据集中的第 5 列时,输出如下所示:
[1,22, 51, 66, 73, 75, 76, 106, 112, 125, 142, 150, 187, 191, 199, 250, 259, 309, 317]
这好像又认出来了。最后一件事,在我通过你的建议让它返回变量名之后,它给了我一个包含 7 个变量的列表。当我只使用我最初做的代码返回重要变量时,它给了我一个更长的重要变量列表。为什么是这样?再次感谢您的帮助。非常感谢!
最佳答案
特征重要性返回一个数组,其中每个索引对应于训练集中该特征的估计特征重要性。内部没有进行排序,它与训练时赋予它的特征一一对应。
如果您将特征名称存储为一个 numpy 数组并确保它与传递给模型的特征一致,您可以利用 numpy 索引来做到这一点。
importances = rf.feature_importances_
important_names = feature_names[importances > np.mean(importances)]
print important_names
关于python - sklearn随机森林索引feature_importances_如何做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22361781/
我们正在运行 MarkLogic 9.0-11 版本 3 节点集群,并且 MarkLogic 安装在“/var/opt/MarkLogic/”目录中,我们创建了“/var/opt/MarkLogic/
我有一片任意高度的森林,大致像这样: let data = [ { "id": 2, "name": "AAA", "parent_id": null, "short_name": "A" },
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 7 年前。 Improve
我有一个巨大的深度字典,代表森林(许多非二叉树),我想处理森林并创建一个包含森林所有可能关系的文本文件,例如给定字典: {'a': {'b': {'c': {}, 'd': {}}, 'g': {}}
在我的 Android 应用程序中,我包含了谷歌地图。现在我想获取有关您周围地区的信息。例如,你是在公园/森林/海滩……所以我基本上想要一个用“水”回答输入坐标 53°33'40.9"N 10°00'
如果我有下表: Member_Key Member_Name col1 Mem1 col2 Mem2 col3 Mem3 col4
继续我的老问题: Writing nested dictionary (forest) of a huge depth to a text file 现在我想把森林遍历写成BFS风格:我有一个巨大的深
我有一个多域环境(事件目录林),例如subdomain1.mydomain.com, subdomain2.mydomain.com 其中 mydomain.com 是根 AD 域 (GC) 和 su
我想知道是否有可能在 Google map 或 Bing Mag 2D/3D map 上恢复地形类型(山脉、森林、水域、平原等...) 。为了根据玩家在现实世界中的位置生成 map !我认为可用 AP
我是一名优秀的程序员,十分优秀!