You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含自定义转换器的Sklearn Pipeline中获取Lasso回归特征名与系数

获取Sklearn Pipeline中Lasso模型的特征名与对应系数

针对你训练并保存的带自定义转换器的Pipeline,可按以下步骤提取Lasso回归的特征名和系数:

1. 加载训练好的Pipeline

首先用joblib加载保存的模型文件:

import joblib
import pandas as pd
import numpy as np
from sklearn.compose import make_column_selector

# 替换为你的模型路径
pipeline = joblib.load("your_trained_pipeline.joblib")

2. 追踪特征清洗后的列名

你的Pipeline先经过zero_imputer和cleaner处理,需要先得到这两步处理后的特征列:

  • 如果你知道原始数据集的所有列名,可直接计算清洗后的列:
    # 替换为你的原始特征列、ID列、缺失列
    original_cols = ["col1", "col2", "id_col1", "miss_col1", ...]
    id_cols = ["id_col1", ...]
    miss_cols = ["miss_col1", ...]
    
    # 清洗后保留的列(去掉ID列和缺失列,zero_imputer不改变列名)
    cleaned_cols = [col for col in original_cols if col not in id_cols + miss_cols]
    
  • 如果你不确定原始列名,可构造空样本数据获取清洗后的列:
    # 构造空DataFrame模拟原始数据结构
    X_sample = pd.DataFrame(columns=original_cols)
    # 经过zero_imputer和cleaner处理
    X_cleaned = pipeline.named_steps['cleaner'].transform(pipeline.named_steps['zero_imputer'].transform(X_sample))
    cleaned_cols = X_cleaned.columns.tolist()
    

3. 提取数值特征处理后的最终列

数值转换器包含SimpleImputer(带缺失指示器)、StandardScaler和VarianceThreshold,需要筛选出被保留的数值特征及缺失指示器列:

# 获取预处理阶段的ColumnTransformer
preprocessor = pipeline.named_steps['preprocessor']
# 获取数值转换器
numeric_transformer = preprocessor.named_transformers_['numeric']

# 筛选清洗后的数值列
num_selector = make_column_selector(dtype_include=np.number)
numeric_cols = num_selector(pd.DataFrame(columns=cleaned_cols))

# 获取VarianceThreshold保留的特征索引
variance_selector = numeric_transformer.named_steps['variance_selector']
kept_indices = variance_selector.get_support(indices=True)

# 构造数值处理后的所有特征名(原始数值列 + 缺失指示器列)
all_numeric_processed = numeric_cols.copy()
imputer = numeric_transformer.named_steps['imputer']
if hasattr(imputer, 'indicator_'):
    # 添加缺失指示器列名
    missing_cols = [numeric_cols[i] + '_missing' for i in imputer.indicator_.features_]
    all_numeric_processed += missing_cols

# 保留经过方差筛选的数值特征
kept_numeric_features = [all_numeric_processed[i] for i in kept_indices]

4. 提取分类特征编码后的列

分类转换器包含SimpleImputer(带缺失指示器)和OneHotEncoder,需要生成编码后的特征名:

# 获取分类转换器
cat_transformer = preprocessor.named_transformers_['categorical_binary']
# 获取原始分类特征列
cat_features = preprocessor.transformers_[1][2]

# 获取OneHotEncoder编码后的特征名
onehot_encoder = cat_transformer.named_steps['encode']
encoded_cat_features = list(onehot_encoder.get_feature_names_out(cat_features))

# 添加分类特征的缺失指示器列
cat_imputer = cat_transformer.named_steps['imputer']
if hasattr(cat_imputer, 'indicator_'):
    cat_missing_cols = [cat_features[i] + '_missing' for i in cat_imputer.indicator_.features_]
    encoded_cat_features += cat_missing_cols

5. 合并特征名与Lasso系数

最后将所有特征名与Lasso的系数对应起来,整理成DataFrame:

# 合并所有最终特征名
final_feature_names = kept_numeric_features + encoded_cat_features

# 获取Lasso模型的系数
lasso_model = pipeline.named_steps['estimator']
coefficients = lasso_model.coef_

# 生成特征-系数对应表
feature_coef_df = pd.DataFrame({
    '特征名': final_feature_names,
    '系数': coefficients
})

# 按系数绝对值降序排序,方便查看重要特征
feature_coef_df = feature_coef_df.sort_values(by='系数', key=abs, ascending=False)
print(feature_coef_df)

注意事项

  • 确保你的自定义转换器(columnDropperTransformer、ZeroImputer)在transform方法中返回带列名的DataFrame,而非numpy数组,否则无法直接获取列名。如果返回的是数组,需要手动跟踪列的增减。
  • 如果cat_features是在清洗前定义的,要确保这些列没有被cleaner步骤删除,否则需要从cleaned_cols中重新筛选分类列。

内容的提问来源于stack exchange,提问作者Obiii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:45:36