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

编码分类变量时丢失多分类目标变量的处理方案咨询

解决多分类Logistic Regression目标列被误编码的问题

核心问题

你错误地将目标列action1_preflop与特征列一同做了独热编码,导致目标被拆分为三个二元列。而多分类逻辑回归的训练要求目标是单一的类别列(字符串或整数标签),不需要独热编码。


解决方案

1. 正确的编码流程:先分离特征与目标

这是最根本的解决方式,从源头避免目标列被编码:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import LogisticRegression

# 假设原始数据框为df
# 1. 分离特征和目标列
X = df.drop('action1_preflop', axis=1)  # 所有特征列(不含目标)
y = df['action1_preflop']  # 单一目标列,值为'r'/'c'/'f'

# 2. 仅对特征中的分类变量做编码
# 替换成你实际的分类特征列名
categorical_features = ['feature1', 'feature2', 'feature3']

# 构建预处理器:只编码指定分类特征,保留其他数值特征
preprocessor = ColumnTransformer(
    transformers=[
        ('cat_encoder', OneHotEncoder(sparse_output=False, drop='first'), categorical_features)
    ],
    remainder='passthrough'
)

# 对特征列做编码
X_encoded = preprocessor.fit_transform(X)

# 3. 训练多分类逻辑回归
model = LogisticRegression(
    multi_class='multinomial',  # 必须指定多分类模式
    solver='lbfgs',
    max_iter=1000  # 增大迭代次数确保收敛
)
model.fit(X_encoded, y)

2. 已编码目标列的还原方法

如果已经不小心把目标列拆成了三个子列,可以反向恢复为单一目标列:

# 假设编码后的目标列是这三个
target_cols = ['action1_preflop_r', 'action1_preflop_f', 'action1_preflop_c']

# 找到每行值为1的列名,提取最后一个后缀作为类别
y_restored = df[target_cols].idxmax(axis=1).str.split('_').str[-1]

# 之后用y_restored作为目标训练模型即可

关键注意事项

  • 永远只对输入特征做编码处理,目标列不需要(也不应该)做独热编码。
  • sklearn的LogisticRegression在multi_class='multinomial'模式下,可以直接接收字符串类型的类别标签,无需额外转成整数(当然用LabelEncoder转成整数也没问题,效果一致)。

内容的提问来源于stack exchange,提问作者Raphaël Ambit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:40:28