如何在sklearn Pipeline中使用ExplainerDashboard并还原原始数据
让ExplainerDashboard显示原始数据(逆转序数编码与归一化)
问题背景
使用sklearn Pipeline结合ExplainerDashboard时,面板默认显示经过预处理(归一化、序数编码)后的数值,无法直观查看原始数据。需要实现特征逆变换,让面板展示真实原始值。
解决方案步骤
1. 先拟合预处理组件并保存转换器
单独拟合预处理模块,确保后续能调用拟合后的转换器进行逆变换:
# 先拟合预处理组件 preprocessor.fit(X_train) # 构建完整Pipeline并训练模型 regressor = Pipeline( steps=[("preprocessor", preprocessor), ("regressor", LGBMRegressor())] ) regressor.fit(X_train, y_train)
2. 提取拟合后的转换器
从训练好的Pipeline中取出用于数值缩放和序数编码的转换器:
# 获取拟合后的数值缩放器 numeric_scaler = regressor.named_steps['preprocessor'].named_transformers_['num'].named_steps['scaler'] # 获取拟合后的序数编码器 ordinal_encoder = regressor.named_steps['preprocessor'].named_transformers_['ord']
3. 定义特征逆变换函数
编写函数将预处理后的特征转换回原始格式,涵盖数值特征的逆缩放和序数特征的逆编码:
import numpy as np import pandas as pd def inverse_transform(processed_X): # 划分预处理后特征的索引区间 num_len = len(numeric_features) ord_len = len(ordinal_features) num_idx = slice(0, num_len) ord_idx = slice(num_len, num_len + ord_len) nom_idx = slice(num_len + ord_len, None) # 数值特征逆缩放 num_data = numeric_scaler.inverse_transform(processed_X[:, num_idx]) # 序数特征逆编码 ord_data = ordinal_encoder.inverse_transform(processed_X[:, ord_idx]) # 标称特征(独热编码)暂时保留原处理结果,若需还原原始类别需额外处理 # 合并逆变换后的数据 inverse_data = np.hstack([num_data, ord_data, processed_X[:, nom_idx]]) # 生成原始特征名列表 feature_names = (numeric_features + ordinal_features + list(regressor.named_steps['preprocessor'].named_transformers_['nom'].get_feature_names_out(nominal_features))) return pd.DataFrame(inverse_data, columns=feature_names)
4. 初始化Explainer并传入逆变换函数
注意这里传入的X_test必须是未经过预处理的原始测试数据,同时指定逆变换函数:
explainer = RegressionExplainer( regressor, X_test, # 原始测试数据,不是预处理后的 y_test, cats=cats, inverse_transform=inverse_transform ) ExplainerDashboard(explainer).run(mode='external')
额外说明
- 对于独热编码的标称特征,若要还原为原始类别列,需要额外编写逻辑合并独热列,或者在初始化Explainer时直接传入原始标称特征列,让Dashboard自动识别类别展示。
- 确保
cats参数正确包含所有类别特征(序数+标称),这样Dashboard能正确渲染类别型特征的展示效果。
内容的提问来源于stack exchange,提问作者hakkache mohamed
相关产品推荐
相关产品推荐

