如何从含自定义转换器的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
相关产品推荐
相关产品推荐

