如何为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%:
- 可选用众数填充,适合缺失量极小的场景
- 可将缺失值单独作为一个分类维度编码,比如给
education_level的缺失值赋值为-1,避免丢失样本其他字段的有效信息 - 如果后续使用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
相关产品推荐
相关产品推荐

