scikit-learn 随机森林的特征重要性显示出非常高的标准偏差

数据挖掘 Python 随机森林
2021-10-06 02:43:03

我正在使用scikit-learn 随机森林分类器,我想绘制特征重要性,例如在这个例子中。

然而,我的结果完全不同,因为特征重要性标准差几乎总是大于特征重要性本身(见附图)。

特征重要性

是否有可能有这种行为,或者我在绘制它时是否犯了一些错误?

我的代码如下:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()
4个回答

您正在使用具有默认树数的 RandomForest,即 10。对于大约 30 个功能,这太少了。因此标准偏差很大。尝试至少 100 甚至 1000 棵树,例如

clf = RandomForestClassifier(n_estimators=1000)

要进行更精细的分析,您还可以检查特征之间的相关性有多大。

你的结果并不奇怪。正如lanenok所说,您应该首先增加树的数量,以确保您获得有关特征重要性的“统计”结果。

然而,正如Genuer 等人的这篇论文一样。(2010) 显示,您实际上可以使用标准差来消除特征。引用:“我们可以看到真实变量的标准偏差与噪声变量相比大,接近于零。

试试clf = RandomForestClassifier(max_features=None)max_features参数默认为which'auto'等价于sqrt(n_features). max_features被描述为“寻找最佳分割时要考虑的特征数量”。仅查看决策树中任何点的少量特征意味着单个特征的重要性可能在许多树中差异很大。因此,不要查看随机子集,只需查看树的每个级别的所有特征。

一个常见的原因是您提供(或默认)的参数RandomForestClassifier不适合您的数据集。

解决这个问题的一种常见方法是使用例如搜索超参数空间GridSearchCV

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_grid这是您要搜索的参数的排列,这make_scorer(accuracy_score)是您要优化的度量。

请注意,accuracy_score它适用于平衡集,但不适用于不平衡集。为您的特定目标选择合适的指标。