【问题标题】:Finding important features in a random forest is very slow在随机森林中寻找重要特征非常慢
【发布时间】:2016-11-25 15:17:58
【问题描述】:

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

我尝试简单地打印出 clf.feature_importances_ 但这需要 每个功能大约 1 秒,总共大约 40,000 秒(大约 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]

【问题讨论】:

  • 根据个人经验和这么多功能,我建议你试试 Spark MLlib。
  • @ahajib 谢谢,但是为什么找到重要特征要比构建分类器本身花费这么多时间呢?另外,您是否尝试过 xgboost?也许这更适合寻找重要特征?
  • 你能发布你的代码的一部分吗?据我所知,feature_importances_ 返回一个大小为 n 的数组,其中 n 是特征的数量,每个值表示特征的重要性。我不确定您所说的每个功能需要 1 秒是什么意思。
  • @ahajib 添加了一个示例。打印每个新功能大约需要 1 秒。是否每次都重新计算整个数组?
  • 是的,这就是问题所在。在发布答案之前没有看到这个。顺便说一句,我建议您将结果写入文件而不是打印它们,因为通常打印有其自身的延迟。

标签: python scikit-learn


【解决方案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]

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

【讨论】:

  • 谢谢。事后看来,这在某种程度上是显而易见的。
  • 当然。这就是为什么我要求你发布你的代码。有时我们只是错过了显而易见的事情。祝你好运
【解决方案2】:

我将建议一个小的变化,它应该会自动解决问题,因为它只获得一个 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,所以我真的不能抱怨。

【讨论】:

    猜你喜欢
    • 2017-07-19
    • 2021-05-09
    • 2021-08-29
    • 2015-05-12
    • 1970-01-01
    • 2018-12-31
    • 2019-01-28
    • 2020-05-16
    • 2017-10-21
    相关资源
    最近更新 更多