使用sklearn.LabelEncoder编码多分类二维数组耗时过长,求高效方案
高效编码列表型特征的优化方案
你当前的遍历编码方式在大数据量下效率低下,核心原因是Python层面的逐行循环开销太大。以下是两种时间复杂度更低、运行速度更快的优化方案:
方案一:字典映射 + Pandas Apply
利用字典的O(1)查找特性,结合Pandas的apply向量化操作替代逐行循环,大幅提升效率:
from sklearn.preprocessing import LabelEncoder import pandas as pd # 初始化LabelEncoder并构建映射字典 unique_words = ['Apple','Jobs','Wozniak'] le = LabelEncoder() le.fit(unique_words) word_code_map = dict(zip(le.classes_, le.transform(le.classes_))) # 批量编码 df['title'] = df['title'].apply(lambda lst: [word_code_map[word] for word in lst])
优势
- 代码简洁直观,保持原列表结构不变
- 字典查找速度远超
LabelEncoder.transform的单次调用,apply基于Pandas内部优化,比Python循环快数倍
方案二:Explode + 批量编码 + 聚合
通过展开列表、批量编码后重新聚合的方式,完全规避Python层面的循环,依赖Pandas底层C实现的操作,适合超大数据量场景:
from sklearn.preprocessing import LabelEncoder import pandas as pd unique_words = ['Apple','Jobs','Wozniak'] le = LabelEncoder() le.fit(unique_words) # 展开列表为单行单元素 df_expanded = df.explode('title') # 批量编码所有元素 df_expanded['title'] = le.transform(df_expanded['title']) # 按原索引重新聚合成列表 df['title'] = df_expanded.groupby(df_expanded.index)['title'].agg(list)
优势
- 全程使用Pandas内置的向量化操作,无Python循环开销
- 数据量越大,相比循环的性能提升越明显
注意事项
- 如果存在未在
unique_words中的异常单词,可在字典映射时添加默认值:word_code_map.get(word, -1),避免KeyError - 两种方案的时间复杂度均为O(N*K)(N为样本数,K为单列表平均长度),但实际运行效率远高于原遍历方案,因为减少了大量Python解释器的开销
内容的提问来源于stack exchange,提问作者baymurat
相关产品推荐
相关产品推荐

