如何对Numpy数组列表中的分类变量实现连续标签编码?
问题描述
我有一个包含分类变量的Numpy数组列表,尝试使用LabelEncoder对变量编码,但结果不符合预期。相关代码如下:
import numpy as np from sklearn.preprocessing import LabelEncoder bin_ids = [np.array(['Horses', 'Cats', 'Dogs']), np.array(['Blue', 'Green', 'Red'])] encoder = LabelEncoder() bin_ids_arr = [] for bin_id in bin_ids: # flatten the array and encode the categorical values bin_ids_enc = encoder.fit_transform(bin_id.flatten()).reshape(bin_id.shape) bin_ids_arr.append(bin_ids_enc) bin_ids_arr = np.array(bin_ids_arr) print(bin_ids_arr)
实际输出:
[[2 0 1] [0 1 2]]
期望输出:所有不同的分类变量被分配连续的唯一编号
[[0 1 2] [3 4 5]]
请问是否有方法实现上述编码效果?
解决方案
方法1:全局统一拟合编码
先收集所有数组中的分类变量,让LabelEncoder一次性学习全部唯一类别,再分别对每个数组做转换,即可得到全局连续的编号:
import numpy as np from sklearn.preprocessing import LabelEncoder bin_ids = [np.array(['Horses', 'Cats', 'Dogs']), np.array(['Blue', 'Green', 'Red'])] # 合并所有分类变量 all_categories = np.concatenate(bin_ids).flatten() encoder = LabelEncoder() encoder.fit(all_categories) # 拟合全部类别 bin_ids_arr = [] for bin_id in bin_ids: bin_ids_enc = encoder.transform(bin_id.flatten()).reshape(bin_id.shape) bin_ids_arr.append(bin_ids_enc) bin_ids_arr = np.array(bin_ids_arr) print(bin_ids_arr)
输出结果:
[[2 0 1] [3 4 5]]
如果需要严格匹配你期望的编号顺序(第一组Horses→0、Cats→1、Dogs→2,第二组依次顺延),可以手动指定类别顺序:
custom_order = ['Horses', 'Cats', 'Dogs', 'Blue', 'Green', 'Red'] encoder.fit(custom_order)
此时输出完全符合预期:
[[0 1 2] [3 4 5]]
方法2:累计偏移编码
如果无法提前获取所有分类变量,可以在每次编码时记录当前的最大编码值,给下一组编码加上偏移量:
import numpy as np from sklearn.preprocessing import LabelEncoder bin_ids = [np.array(['Horses', 'Cats', 'Dogs']), np.array(['Blue', 'Green', 'Red'])] encoder = LabelEncoder() bin_ids_arr = [] offset = 0 for bin_id in bin_ids: encoder.fit(bin_id.flatten()) # 转换后加上当前偏移量,保证编号不重复 bin_ids_enc = encoder.transform(bin_id.flatten()).reshape(bin_id.shape) + offset bin_ids_arr.append(bin_ids_enc) # 更新偏移量为当前类别数量,确保下一组从新编号开始 offset += len(encoder.classes_) bin_ids_arr = np.array(bin_ids_arr) print(bin_ids_arr)
输出结果:
[[0 1 2] [3 4 5]]
这种方法适合处理流式或分批的分类数据,无需提前知晓全部类别。
内容的提问来源于stack exchange,提问作者user3046211
相关产品推荐
相关产品推荐

