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

已生成哑变量后,如何拆分训练测试集并设置Loan_Status目标变量?

分类变量哑编码与数据集拆分的正确流程

核心问题梳理

你当前的误区是把目标变量Loan_Status也纳入了哑编码范围,并且混淆了「编码时机」和「数据集拆分时机」的顺序。正确的逻辑是:目标变量不需要做哑编码(二分类场景下),且必须先拆分数据集,再对特征做编码,避免数据泄露。


最佳实践步骤(推荐)

1. 先分离特征与目标变量,转换目标变量为数值型

原始数据中Loan_Status是二分类标签(Y/N),直接转成0/1即可,不需要做哑编码:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

# 分离特征(去掉目标列)和标签
X = df1.drop('Loan_Status', axis=1)
# 将Y/N转为1/0,方便模型训练
y = df1['Loan_Status'].map({'Y': 1, 'N': 0})

2. 拆分训练集与测试集

这一步必须在编码前完成,避免测试集的类别信息提前泄露给训练过程:

# 按8:2拆分,random_state保证结果可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

3. 仅对特征列做哑编码(训练集拟合,测试集转换)

用ColumnTransformer统一处理分类列编码,确保训练集和测试集使用完全相同的编码规则:

# 定义需要编码的分类特征列
cat_cols = ['Gender', 'Married', 'Dependents', 'Education', 'Self_Employed']

# 创建预处理管道:对分类列做独热编码(drop='first'避免多重共线性),其他列保持原样
preprocessor = ColumnTransformer(
    transformers=[
        ('onehot', OneHotEncoder(drop='first', sparse_output=False), cat_cols)
    ],
    remainder='passthrough'
)

# 仅在训练集上拟合编码器,再分别转换训练/测试集
X_train_encoded = preprocessor.fit_transform(X_train)
X_test_encoded = preprocessor.transform(X_test)

你当前已生成全量哑编码的补救方案

如果已经对包括Loan_Status在内的所有列做了哑编码,也可以临时补救:

# 取其中一个哑编码列作为标签(比如Loan_Status_Y代表Y=1,N=0)
y = df_dummies['Loan_Status_Y']
# 特征集去掉两个Loan_Status的哑编码列
X = df_dummies.drop(['Loan_Status_Y', 'Loan_Status_N'], axis=1)

# 拆分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

⚠️ 注意:这种方法存在数据泄露风险(编码规则基于全量数据,包括测试集),模型泛化能力可能受影响,优先推荐前面的最佳流程。


为什么不能先编码再拆分?

  • 数据泄露:如果先对全量数据做编码,测试集的类别分布会被提前纳入编码规则,导致模型在测试集上的表现虚高,无法反映真实泛化能力。
  • 目标变量冗余:二分类目标变量做哑编码会生成两列互补的特征,完全没必要,单列数值标签更符合模型输入要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:54:14