ExtraTreesClassifier的功能重要性返回全零

时间:2019-12-06 07:55:09

标签: python machine-learning feature-selection

我想使用ExtraTreesClassifier计算给定数据集的特征重要性。我的目标是为进一步的分类过程找到高分的功能。 X数据集的大小为(10000,50),其中50列是要素,此数据集仅表示从一个用户(即,从同一类)收集的数据,Y是标签(全零)。

但是,输出将所有功能的重要性返回为零!

代码:

from sklearn.ensemble import ExtraTreesClassifier
import matplotlib.pyplot as plt
model = ExtraTreesClassifier()
model.fit(X,Y)
X = pd.DataFrame(X)
print(model.feature_importances_) #use inbuilt class feature_importances of tree based classifiers
#plot graph of feature importances for better visualization
feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(20).plot(kind='barh')
plt.show()

输出:

enter image description here

谁能告诉我为什么所有功能的重要性得分都为零?

2 个答案:

答案 0 :(得分:1)

如果所有类别标签都具有相同的值,那么功能的重要性都将为0。

我对算法还不够熟悉,无法给出为什么为什么重要性以0而不是nan或类似形式返回的技术解释,但从理论上来说是这样的:

您正在使用ExtraTreesClassifier,它是决策树的集合。这些决策树中的每一个都将通过以某种方式最小化杂质(在sklearn额外树的情况下为gini或熵)来尝试区分目标中不同类别的样本。当目标仅包含单个类别的样本时,杂质已经处于最低水平,因此决策树不需要拆分即可进一步减少杂质。因此,不需要任何功能来减少杂质,因此每个功能的重要性为0。

以另一种方式考虑。每个特征与目标的关系与其他特征完全相同:无论特定样本的特征值是什么,目标均为0(目标完全独立于特征)。因此,每个功能都不会提供有关目标的新信息,因此对进行预测也没有价值。

答案 1 :(得分:0)

您可以尝试做:

print(sorted(zip(model.feature_importances_, X.columns), reverse=True))