如何在Sklearn Pipeline中处理独热编码的未见过分类变量
问题描述
在训练数据集df_train中,需对变量x1应用3次多项式变换,对color变量做独热编码,目标是获取各自变量的系数并预测测试数据集df_test的目标变量Y:
- 训练集仅包含
green、red、purple三种颜色 - 测试集新增了训练集未见过的
yellow和black分类变量 - 希望结合Sklearn的
Pipeline、ColumnTransformer和PolynomialFeatures完成流程,但手动处理测试集时遇到未见过分类的系数缺失问题
解决方案
核心思路是用Sklearn Pipeline端到端处理特征工程与建模,避免手动处理测试集特征导致的错误。关键配置是给OneHotEncoder添加handle_unknown='ignore'参数,让模型自动忽略训练集未见过的分类变量。
完整实现代码
import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer # 训练数据 x1 = [28.0, 29.0, 12.0, 12.0, 42.0] x2 = [0.36, 0.53, 0.45, 0.48, 0.4] y = [59.5833333333333, 59.5833333333333, 10.0, 10.0, 47.0833333333333] color = ['green','red','red','purple','purple'] df_train = pd.DataFrame({ 'x1': x1, 'x2': x2, 'y': y, 'color': color }) # 测试数据 x1_test = [35.0, 28.0, 30.0, 32.0, 46.0] x2_test = [0.44, 0.44, 0.6, 0.39, 0.39] color_test = ['green','red','purple','yellow','black'] df_test = pd.DataFrame({ 'x1': x1_test, 'x2': x2_test, 'color': color_test }) # 定义特征矩阵与目标变量 X_train = df_train[['x1', 'x2', 'color']] y_train = df_train['y'] # 预处理配置:OneHotEncoder添加handle_unknown='ignore'处理未见过的分类 preprocessor = ColumnTransformer( transformers=[ ('encoder', OneHotEncoder(sparse_output=False, handle_unknown='ignore'), ['color']), ('transformer', PolynomialFeatures(degree=3, include_bias=False), ['x1']), ], remainder='passthrough' ) # 构建Pipeline串联预处理与模型 pipeline = Pipeline([ ('preprocessor', preprocessor), ('regressor', LinearRegression(fit_intercept=True)) ]) # 训练模型 pipeline.fit(X_train, y_train) # 获取变量与系数的对应关系 coeffs = pipeline['regressor'].coef_ feature_names = preprocessor.get_feature_names_out() coeff_map = dict(zip(feature_names, coeffs)) print("变量系数对应关系:") for feature, coeff in coeff_map.items(): print(f"{feature}: {coeff}") print(f"截距项:{pipeline['regressor'].intercept_}") # 直接对测试集做预测,无需手动处理特征 df_test['yhat'] = pipeline.predict(df_test) print("\n测试集预测结果:") print(df_test[['x1', 'x2', 'color', 'yhat']])
关键说明
handle_unknown='ignore'的作用:当测试集出现训练集未见过的分类时,独热编码会将该分类对应的所有列设为0,模型基于已有特征的系数完成预测,避免手动补系数的麻烦。- Pipeline的优势:确保训练集和测试集使用完全一致的预处理逻辑,杜绝数据泄露或手动处理的错误。
- 系数解释:通过
preprocessor.get_feature_names_out()可获取预处理后的特征名,与模型系数一一对应,方便分析变量对目标的影响。
内容的提问来源于stack exchange,提问作者user032020
相关产品推荐
相关产品推荐

