从 Sklearn 管道中提取具有特征名称的特征重要性

Posted

技术标签:

【中文标题】从 Sklearn 管道中提取具有特征名称的特征重要性【英文标题】:Extracting Feature Importance with Feature Names from a Sklearn Pipeline 【发布时间】:2019-08-10 13:26:09 【问题描述】:

我想知道当在带有预处理的管道中使用分类器时,如何从 scikit-learn 中的随机森林中提取特征重要性具有特征名称

这里的问题涉及仅提取特征重要性:How to extract feature importances from an Sklearn pipeline

从我所做的简短研究来看,这在 scikit-learn 中似乎是不可能的,但我希望我错了。

我还发现了一个名为 ELI5 (https://eli5.readthedocs.io/en/latest/overview.html) 的包,它应该可以用 scikit-learn 解决这个问题,但它没有解决我的问题,因为为我输出的特征名称是 x1、x2等,而不是实际的功能名称。

作为一种解决方法,我在管道之外进行了所有预处理,但很想知道如何在管道中进行。

如果我可以提供任何有用的代码,请在 cmets 中告诉我。

【问题讨论】:

我想这真的取决于你在说什么预处理......你能指定吗? 从文档中,feature_names 选项可用于某些功能。希望对你有帮助eli5.readthedocs.io/en/latest/_modules/eli5/… 显示您正在使用并希望将其转换为管道的代码。 【参考方案1】:

有一个使用 Xgboost 获取特征重要性的示例:

num_transformer = Pipeline(steps=[
                  ('imputer', SimpleImputer(strategy='median')),
                  ('scaler', preprocessing.RobustScaler())])

cat_transformer = Pipeline(steps=[
                  ('imputer', SimpleImputer(strategy='most_frequent')),
                  ('onehot', preprocessing.OneHotEncoder(categories='auto', 
                                     sparse=False, 
                                     handle_unknown='ignore'))])

from sklearn.compose import ColumnTransformer

numerical_columns = X.columns[X.dtypes != 'category'].tolist()
categorical_columns = X.columns[X.dtypes == 'category'].tolist()

pipeline_procesado = ColumnTransformer(transformers=[
            ('numerical_preprocessing', num_transformer, numerical_columns),
       ('categorical_preprocessing', cat_transformer, categorical_columns)],
        remainder='passthrough',
        verbose=True)

# Create the classifier
classifier = XGBClassifier()

# Create the overall model as a single pipeline
pipeline = Pipeline([("transform_inputs", pipeline_procesado), ("classifier", 
classifier)])

pipeline.fit(X_train, y_train)

onehot_columns = pipeline.named_steps['transform_inputs'].named_transformers_['categorical_preprocessing'].named_steps['onehot'].get_feature_names(input_features=categorical_columns)


#you can get the values transformed with your pipeline
X_values = pipeline_procesado.fit_transform(X_train)

df_from_array_pipeline = pd.DataFrame(X_values, columns = numerical_columns + list(onehot_columns) )

feature_importance = pd.Series(data= pipeline.named_steps['classifier'].feature_importances_, index = np.array(numerical_columns + list(onehot_columns)))

【讨论】:

以上是关于从 Sklearn 管道中提取具有特征名称的特征重要性的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Sklearn 管道中提取特征重要性

如何在 python 中的 sklearn 中的不同管道中获取特征名称

如何在 sklearn 管道中获取通过特征消除选择的特征名称?

情感分析管道,使用特征选择时获取正确特征名称的问题

如何保存 sklearn 管道/特征转换器

从 LSTM 到 Sklearn 模型的特征提取