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

如何为sklearn的LabelEncoder设置自定义顺序实现有序分类变量编码

1. 自定义编码顺序的实现方案

不需要强行用LabelEncoder,直接通过pandas的map方法自定义映射关系即可,完全符合你要求的「High、Medium、Low」顺序:

# 提前定义有序分类的映射规则
edu_order_map = {
    'High': 2,
    'Medium': 1,
    'Low': 0
}
df['education_level'] = df['education_level'].map(edu_order_map)

如果其他字段也是有序分类,按照同样的逻辑单独定义映射规则即可。

2. 更优的编码方案选择

编码方案要根据分类变量的类型决定:

  • 有序分类变量(比如学历、收入等级这类有明确高低顺序的):用上面的自定义有序编码即可,保留顺序信息的同时不会增加特征维度
  • 无序分类变量(比如性别、省份、职业这类没有高低顺序的):不要用LabelEncoder,避免模型误认为特征存在顺序关系,推荐用独热编码,可直接调用pd.get_dummies()或者sklearn的OneHotEncoder实现
  • 高基数无序分类变量(取值超过10个的):独热编码会导致特征过于稀疏,可选用目标编码、频次编码等方案,注意做交叉验证避免过拟合

3. 缺失值处理方案

针对这类分类场景的缺失值,可根据缺失占比选择对应方案:

  • 缺失占比>30%:该字段信息密度过低,直接删除整个字段
  • 缺失占比<30%:
    1. 可选用众数填充,适合缺失量极小的场景
    2. 可将缺失值单独作为一个分类维度编码,比如给education_level的缺失值赋值为-1,避免丢失样本其他字段的有效信息
    3. 如果后续使用XGBoost、LightGBM等原生支持缺失值的树模型,只需要将缺失值转为统一的占位符(比如np.nan)即可,不需要额外填充

修改后的完整代码

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics

# load train.csv
df = pd.read_csv('./train.csv')
objfeatures = df.select_dtypes(include="object").columns

# 1. 单独处理有序分类字段education_level
edu_order_map = {'High':2, 'Medium':1, 'Low':0}
df['education_level'] = df['education_level'].map(edu_order_map)
# 缺失值处理:这里示例将缺失值设为-1,可根据需求调整
df['education_level'] = df['education_level'].fillna(-1)

# 2. 处理剩余无序分类字段
other_obj_features = [feat for feat in objfeatures if feat != 'education_level']
for feat in other_obj_features:
    # 缺失值单独设为Unknown类别
    df[feat] = df[feat].fillna('Unknown')
    # 无序分类用独热编码,这里如果特征基数小也可以继续用LabelEncoder,根据需求调整
    df = pd.get_dummies(df, columns=[feat], drop_first=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:03