编码分类变量时丢失多分类目标变量的处理方案咨询
解决多分类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
相关产品推荐
相关产品推荐

