LabelEncoder处理中文/emoji字符串本身不报错,但需先处理缺失值且字典序编码无语义;OneHotEncoder需前置OrdinalEncoder;高基数短文本宜用HashingVectorizer;强语义场景应采用sentence-transformers等嵌入方案并标准化。

用 LabelEncoder 直接编码含中文/emoji的字符串会报错
直接对含非ASCII字符(如中文、日文、emoji)的字符串列调用 LabelEncoder.fit_transform() 通常不会失败,但容易忽略两个关键问题:一是 LabelEncoder 本身不处理缺失值(np.nan),遇到就抛 ValueError: Input contains NaN;二是它把字符串按字典序映射为整数,但这个顺序毫无语义意义,比如“苹果”和“香蕉”被编成 0 和 1,模型无法感知它们在语义空间中的邻近性。
实操建议:
- 先用
pandas.isna()检查并显式处理缺失值(填充或丢弃),别依赖LabelEncoder自动跳过 - 避免对高基数(>100 类)的文本特征用
LabelEncoder,尤其当类别名本身带语义时(如商品品类名、城市名) - 若必须用整数编码,优先用
pd.Categorical(...).codes,它对NaN返回-1,行为更可控
用 OneHotEncoder 处理中文特征前必须先做 OrdinalEncoder
OneHotEncoder 默认只接受数值型输入(除非设置 handle_unknown='ignore' 且 dtype=object),直接传入中文字符串会报 ValueError: Expected 2D array, got 1D array instead 或更隐蔽的 TypeError: argument must be a string or a number —— 实际是内部尝试调用 str.encode() 失败。
正确链路是:OrdinalEncoder → OneHotEncoder,且必须注意:
-
OrdinalEncoder的handle_unknown='use_encoded_value'和unknown_value=-1要配对使用,否则新出现的中文词(如测试集里没见过的城市名)会直接报错 -
OneHotEncoder必须设sparse_output=False(新版默认为True),否则返回稀疏矩阵,后续和numpy数组拼接易出错 - 如果特征列含空字符串
'',它会被当成一个独立类别,需提前用.replace('', np.nan)清洗
对短文本(如标签、品牌名)用 HashingVectorizer 更省内存
当文本特征实际是短字符串(如“iOS17”、“小米14”、“#旅行”),且类别总数大(几千以上)、稀疏度高时,OneHotEncoder 会生成巨宽的稀疏矩阵,吃光内存。这时 HashingVectorizer 是更务实的选择——它不保存词汇表,直接用哈希函数把字符串映射到固定长度向量。
关键参数控制:
- 设
n_features=2**16(65536)通常够用,太大浪费内存,太小哈希冲突增多 - 必须关掉
lowercase=False,否则“iPhone”和“IPHONE”被当作同一词(中文虽不受影响,但保持习惯一致) - 不要用
analyzer='char',对中文单字哈希会丢失语义;保留默认'word'即可(它把整个字符串当一个 token) - 输出是
scipy.sparse.matrix,训练树模型前建议转成.toarray(),但线性模型可直接喂稀疏矩阵
真正需要语义信息时,别硬编码,用预训练小模型提取向量
如果文本特征本身携带强语义(如用户填写的“兴趣标签”:“健身”、“烘焙”、“量子物理”),整数或 one-hot 都无法建模它们之间的相似性。这时候该上轻量级文本嵌入。
推荐方案:用 sentence-transformers 的 all-MiniLM-L6-v2(仅 80MB,中文支持好):
- 先用
pip install sentence-transformers安装,别用transformers原生 API,封装更简单 - 批量处理(别单条调用
model.encode()),1000 条中文标签约 2 秒内完成,输出 384 维numpy.ndarray - 注意清洗:去除首尾空格、过滤纯空白字符串,否则嵌入向量全零,拖慢训练
- 如果部署环境不能跑 PyTorch,改用
fasttext的中文预训练 bin 文件(如cc.zh.300.bin),用get_word_vector()提取,速度更快但粒度限于词级别
最常被忽略的一点:嵌入向量必须和数值特征一起做标准化(如 StandardScaler),否则模型权重会严重偏向嵌入维度。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











