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

时间:2016-07-21 20:58:27

标签: python scikit-learn

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

我尝试简单地打印sklearn,但这需要 每个功能大约1秒,总体上大约40,000秒(大约12小时)。这个 比训练分类器所需的时间长得多 第一名!

是否有更有效的方法来确定哪些功能最重要?

这是我的意思的一个例子:

clf.feature_importances_

2 个答案:

答案 0 :(得分:1)

您需要做的就是将clf.feature_importances_的结果存储在数组中,然后使用它来打印结果。像:

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]

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

答案 1 :(得分:1)

我将建议一个小变体,它应该自动解决问题,因为它只获得feature_importances_个:

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

这也是使用

的Pythonic方式
for i in xrange(len(<some-array>)): 
    <some-array>[i]

我认为如果RandomForestClassifier以某种方式跟踪其幕后状态会更好。如果状态发生变化(例如,n_estimators已更改,或其他参数),则应重新计算feature_importances_(动态,就像现在一样)。否则,它应该只返回当前,缓存的功能重要性 然而,这在幕后更复杂。

也许最简单的方法是将属性更改为实际方法:calc_feature_importances() 再说一遍,我没有投入精力创建RandomForestClassifier,所以我无法抱怨。