如何使用Python的eli5库explain_weights_df方法解决特征重要性分析报错问题

问题场景描述

在使用Python的eli5库进行机器学习模型解释时,explain_weights_df方法是分析特征重要性的重要工具。开发者常遇到的典型报错是:

ValueError: Number of features of the model must match the input

这种特征维度不匹配问题通常发生在以下场景:

  • 训练数据预处理管道(Pipeline)包含特征选择步骤
  • 使用不同特征集的模型版本混用
  • 分类任务中的目标编码(Target Encoding)未正确处理

根本原因分析

该错误的本质是特征空间不一致导致,具体包含三个维度:

  1. 特征数量:预处理后的特征数与原始数据不一致
  2. 特征顺序:Pipeline中各转换器改变了特征排列顺序
  3. 特征类型:类别型特征经过编码后维度扩展

完整解决方案

方案一:统一特征空间

from sklearn.pipeline import make_pipeline
from eli5 import explain_weights_df

# 创建包含所有预处理步骤的完整管道
full_pipeline = make_pipeline(
    preprocessor,
    feature_selector,
    model
)

# 使用管道统一处理
explanation = explain_weights_df(full_pipeline, 
                               feature_names=original_features)

方案二:手动对齐特征

# 获取最终实际使用的特征索引
selected_idx = feature_selector.get_support(indices=True)

# 筛选对应的特征名
used_features = [original_features[i] for i in selected_idx]

# 传入正确的特征名
explanation = explain_weights_df(model, feature_names=used_features)

方案三:处理特殊编码情况

对于One-Hot编码的情况需要特殊处理:

from sklearn.compose import ColumnTransformer

# 获取转换后的特征名
transformer = full_pipeline.named_steps['columntransformer']
feature_names = transformer.get_feature_names_out()

explanation = explain_weights_df(model, feature_names=feature_names)

最佳实践建议

场景 推荐方案
简单Pipeline 方案一
自定义特征选择 方案二
复杂特征工程 方案三

扩展应用

正确解决特征维度问题后,可以进一步:

  • 生成交互式可视化报告
  • 实现特征重要性排序过滤
  • 构建模型监控看板