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

如何在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']])

关键说明

  1. handle_unknown='ignore'的作用:当测试集出现训练集未见过的分类时,独热编码会将该分类对应的所有列设为0,模型基于已有特征的系数完成预测,避免手动补系数的麻烦。
  2. Pipeline的优势:确保训练集和测试集使用完全一致的预处理逻辑,杜绝数据泄露或手动处理的错误。
  3. 系数解释:通过preprocessor.get_feature_names_out()可获取预处理后的特征名,与模型系数一一对应,方便分析变量对目标的影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:15:37