Python 在随机森林中寻找重要特征非常缓慢

Python 在随机森林中寻找重要特征非常缓慢,python,scikit-learn,Python,Scikit Learn,我有一组与二进制类标签相关的特征向量, 每个都有大约40000个功能。我使用sklearn中的RandomForestClassifier训练一个RandomForest分类器,大约需要10分钟。不过,我想看看哪些是最重要的特征 我试着简单地打印出clf.feature\u importances\u,但这需要时间 每个功能大约1秒,总共约40000秒(约12小时)。这 比训练分类器所需的时间要长得多 第一名 有没有更有效的方法来找出哪些功能是最重要的 以下是我的意思的一个例子: from sk

我有一组与二进制类标签相关的特征向量, 每个都有大约40000个功能。我使用
sklearn
中的
RandomForestClassifier
训练一个RandomForest分类器,大约需要10分钟。不过,我想看看哪些是最重要的特征

我试着简单地打印出
clf.feature\u importances\u
,但这需要时间 每个功能大约1秒,总共约40000秒(约12小时)。这 比训练分类器所需的时间要长得多 第一名

有没有更有效的方法来找出哪些功能是最重要的

以下是我的意思的一个例子:

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=50)
clf = clf.fit(X, Y)
for i in xrange(len(clf.feature_importances_)):
    print clf.feature_importances_[i]

您只需将
clf.feature\u importances\u
的结果存储在一个数组中,然后使用该数组打印结果。比如:

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=50)
clf = clf.fit(X, Y)

featureImportance = clf.feature_importances_
for i in xrange(len(featureImportance)):
    print featureImportance[i]

您现在处理它的方式是每次都重新计算数组。

我将建议一个小的变化,它会自动解决问题,因为它只获得一个
功能重要性:

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=50)
clf = clf.fit(X, Y)
for feature_importance in clf.feature_importances_:
    print feature_importance
如果在循环的其他地方需要循环索引
i
,只需使用
enumerate

for i, feature_importance in enumerate(clf.feature_importances_):
    print feature_importance
这也是一种比使用

for i in xrange(len(<some-array>)): 
    <some-array>[i]
xrange(len())中的i的
:
[一]

我认为如果
RandomForestClassifier
能够在幕后跟踪其状态会更好。如果状态发生变化(例如,
n\u估计器
发生变化,或其他参数发生变化),则应重新计算
特征重要性
(如现在所做的那样)。否则,它应该只返回当前缓存的功能重要性。
然而,这在幕后更加复杂

也许最简单的方法是将属性更改为实际的方法:
calc\u feature\u importances()


再说一次,我没有在创建
RandomForestClassifier
上下功夫,所以我真的不能抱怨。

基于个人经验和这么多的功能,我建议您尝试一下Spark MLlib。@ahajib谢谢您,但是为什么找到重要的功能要比构建分类器本身花费这么长的时间呢?还有,你试过xgboost吗?也许这对发现重要的特性更好?你能发布一部分代码吗?据我所知,
feature\u importances\u
返回一个大小为n的数组,其中n是特征的数量,每个值表示特征的重要性。“我不知道你说的每个功能1秒是什么意思。”阿哈吉布补充了一个例子。打印每个新功能大约需要1秒。是不是每次都要重新计算整个数组?是的,这就是问题所在。在发布答案之前,没有看到这一点。顺便说一句,我建议你把结果写进一个文件,而不是打印出来,因为通常打印会有延迟。谢谢。事后看来,这是显而易见的。这就是为什么我要求你发布你的代码。有时我们只是错过了显而易见的东西。祝你好运