在Scikit-learn中对多列同属性特征执行一致的Label Encoding
如何在Scikit-learn中对多列特征执行统一的Label Encoding
这问题我碰到过好多次了,要实现多列中相同取值的编码一致,关键是不能单独对每列训练编码器,而是要让编码器先学习所有列的共同类别集合。下面给你一步步实现:
核心思路
我们需要先把所有涉及的列(Origin和Destination)的取值合并,让LabelEncoder学习所有可能的类别,之后再用这个训练好的编码器分别转换每一列,这样就能保证同一个取值在不同列的编码完全一致。
具体实现步骤
1. 导入所需库
import pandas as pd from sklearn.preprocessing import LabelEncoder
2. 构造原始数据
先把你的数据转换成Pandas DataFrame,方便后续处理:
# 原始数据 data = { 'Origin': ['China', 'China', 'USA', 'USA', 'USA', 'Russia'], 'Destination': ['USA', 'Turkey', 'China', 'Turkey', 'Russia', 'China'] } df = pd.DataFrame(data)
3. 训练统一的LabelEncoder
合并两列的所有取值,提取唯一类别后训练编码器:
# 合并Origin和Destination的所有值,获取全部唯一类别 all_unique_categories = pd.concat([df['Origin'], df['Destination']]).unique() # 初始化编码器并拟合所有类别 label_encoder = LabelEncoder() label_encoder.fit(all_unique_categories)
4. 转换目标列
用训练好的编码器分别转换Origin和Destination列:
# 对两列进行编码转换 df['Origin_encoded'] = label_encoder.transform(df['Origin']) df['Destination_encoded'] = label_encoder.transform(df['Destination'])
5. 查看结果
运行以下代码就能得到你想要的统一编码结果:
print(df[['Origin_encoded', 'Destination_encoded']])
输出结果示例:
Origin_encoded Destination_encoded 0 0 3 1 0 2 2 3 0 3 3 2 4 3 1 5 1 0
(注:编码数字可能和你示例中的略有不同,取决于类别排序,但同一取值的编码在两列是完全一致的)
为什么不能单独编码?
如果分别对每列调用LabelEncoder().fit_transform(),每列的编码器是独立训练的。比如Origin列的China可能被编码为0,但Destination列的China可能因为该列的类别顺序不同被编码为其他值,模型会把这两个相同的取值当成不同的特征,完全不符合我们的需求。
内容的提问来源于stack exchange,提问作者Desmond Momanyi
相关产品推荐
相关产品推荐

