问题场景描述
在使用Python的eli5库进行机器学习模型解释时,explain_weights_df方法是分析特征重要性的重要工具。开发者常遇到的典型报错是:
ValueError: Number of features of the model must match the input
这种特征维度不匹配问题通常发生在以下场景:
- 训练数据预处理管道(Pipeline)包含特征选择步骤
- 使用不同特征集的模型版本混用
- 分类任务中的目标编码(Target Encoding)未正确处理
根本原因分析
该错误的本质是特征空间不一致导致,具体包含三个维度:
- 特征数量:预处理后的特征数与原始数据不一致
- 特征顺序:Pipeline中各转换器改变了特征排列顺序
- 特征类型:类别型特征经过编码后维度扩展
完整解决方案
方案一:统一特征空间
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 | 方案一 |
| 自定义特征选择 | 方案二 |
| 复杂特征工程 | 方案三 |
扩展应用
正确解决特征维度问题后,可以进一步:
- 生成交互式可视化报告
- 实现特征重要性排序过滤
- 构建模型监控看板