示例
from sklearn.preprocessing import OrdinalEncoder
def label_encoding(X_train, X_test, cat_cols):
"""标签编码(序号编码)"""
encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)
X_train[cat_cols] = encoder.fit_transform(X_train[cat_cols])
X_test[cat_cols] = encoder.transform(X_test[cat_cols])
return X_train, X_test
调用示例
# 导入必要的库
from sklearn.preprocessing import OrdinalEncoder
import pandas as pd
# 准备数据
X_train = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red'],
'size': ['S', 'M', 'L', 'M']
})
X_test = pd.DataFrame({
'color': ['red', 'yellow', 'blue'],
'size': ['M', 'L', 'XL'] # 'XL' 是未知类别
})
cat_cols = ['color', 'size']
# 应用编码
X_train_encoded, X_test_encoded = label_encoding(X_train, X_test, cat_cols)
print("训练集编码后:\n", X_train_encoded)
print("测试集编码后:\n", X_test_encoded)
# 输出显示 'XL' 被编码为 -1
使用场景建议
适合使用该函数的情况:
-
决策树、随机森林、XGBoost等树模型(对数值大小不敏感)
-
有序分类特征
-
类别数量极多(>100个)
-
内存受限的环境
不适合使用该函数的情况:
-
线性模型(如逻辑回归、SVM)
-
神经网络(需要标准化处理)
-
类别间无天然顺序关系
-
对特征解释性要求高
对于encoder 的使用
def label_encoding_fit(X_train, cat_cols):
"""训练时调用:返回编码后的数据和 encoder 实例"""
encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)
X_train_encoded = X_train.copy()
X_train_encoded[cat_cols] = encoder.fit_transform(X_train_encoded[cat_cols])
return X_train_encoded, encoder
def label_encoding_transform(X, encoder, cat_cols):
"""推理时调用:加载 encoder 进行转换"""
X_encoded = X.copy()
X_encoded[cat_cols] = encoder.transform(X_encoded[cat_cols])
return X_encoded