我正在scikit-learn的随机森林分类器上使用eli5
explain_weights
函数。我已经在eli5 documentation(第30-31页)中看到,该函数能够为每个类别返回以进行预测。但是,在我的数据集上使用该函数时,该函数仅返回整个模型的特征重要性(而不是每个类)。
以下是使用scikit-learn make_classification
函数生成的可复制示例:
import pandas as pd
import eli5
from eli5.sklearn import PermutationImportance
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
x, y = datasets.make_classification(n_samples=200, n_features=5, n_informative=3, n_redundant=2, n_classes=4)
df = pd.concat([pd.DataFrame(x, columns=['feat_1', 'feat_2', 'feat_3', 'feat_4', 'feat_5']), pd.DataFrame(y, columns=['classe'])], axis=1)
df = df.replace({'classe': {0: '1st', 1: '2nd', 2: '3rd', 3: '4th'}})
labels = pd.unique(df['classe'])
train, test = train_test_split(df, stratify=df['classe'], test_size=0.40)
rf = RandomForestClassifier()
rf.fit(train[['feat_1', 'feat_2', 'feat_3', 'feat_4', 'feat_5']], train['classe'])
perm = PermutationImportance(rf).fit(test[['feat_1', 'feat_2', 'feat_3', 'feat_4', 'feat_5']], test['classe'])
var_imp_classes = eli5.explain_weights(perm, top=5, targets=labels, target_names=labels, feature_names=['feat_1', 'feat_2', 'feat_3', 'feat_4', 'feat_5'])
print(eli5.format_as_text(var_imp_classes))
我已经重命名了功能和类,但这不是必须的。同样,可以通过用PermutationImportance
替换perm
中的eli5.explain_weights
参数来避免rf
步骤。
此代码返回以下内容:
Explained as: feature importances
Feature importances, computed as a decrease in score when feature
values are permuted (i.e. become noise). This is also known as
permutation importance.
If feature importances are computed on the same data as used for training,
they don't reflect importance of features for generalization. Use a held-out
dataset if you want generalization feature importances.
0.3475 ± 0.1111 feat_1
0.1900 ± 0.1134 feat_4
0.0700 ± 0.0200 feat_3
0.0550 ± 0.0624 feat_2
0.0300 ± 0.0300 feat_5
我找不到每个课程的详细结果,如this question所示。我正在使用explain_weights
show_weights
函数,因为我想将输出存储在DataFrame中,但是使用show_weights
时也会出现同样的问题。使用其他分类器(例如SGDClassifier
)并删除了PermutationImportance
步骤后,我遇到了同样的问题。
我的代码有什么问题?
谢谢大家!
答案 0 :(得分:0)
我认为您的代码没有任何问题
在示例中,您给ELI5提供了每个类别的说明,因为它用于Logistic回归模型,该模型对每个类别具有单独的回归系数。
在“随机森林”中不会发生这种情况-特别是如果您使用置换重要性。这些只是在使用给定置换变量进行预测时模型精度的下降,因此每个模型只有一个,而每个类只有一个。可以考虑每个班级的分类准确度的降低-这些可能会给出一个大致的概念,但我不确定它们是否一致。
如果您真的需要了解每个类别中最有区别的变量,则可以运行K(假设您有K个类),将其余的一对一分类RF分开运行,并使用这些置换重要性作为您的指标。