You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用含lambda的CountVectorizer后joblib序列化报PicklingError如何解决?

解决CountVectorizer使用lambda导致的PicklingError问题

问题场景

处理包含单字符的数据时,默认CountVectorizer会忽略单字符词,因此用lambda作为tokenizer:

data = ['E', 'C', 'Employee', 'Child']

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(tokenizer=lambda txt: txt.split())
X = vectorizer.fit_transform(data)

但使用joblib.dump保存模型时触发PicklingError:

dump({'RandomForestClassifier':rfc, 'vectorizer':vectorizer}, 'model_rfc.joblib', compress=1) 

错误信息:

PicklingError : Can't pickle <function> <lambda> at 0x0000026C13C94430> : it's not found as __main__.<lambda>

解决方案

方法1:用具名函数替代lambda

Pickle无法序列化匿名lambda函数,因为它无法在模块中找到对应的函数定义。将lambda替换为具名函数即可:

def simple_tokenizer(txt):
    return txt.split()

vectorizer = CountVectorizer(tokenizer=simple_tokenizer)

修改后保存和加载模型就不会出现序列化问题。

方法2:修改CountVectorizer的token_pattern参数(更推荐)

默认CountVectorizer的token_pattern参数值为r'(?u)\b\w\w+\b',该正则只匹配长度≥2的单词。直接修改这个参数来支持单字符词,无需自定义tokenizer:

vectorizer = CountVectorizer(token_pattern=r'(?u)\b\w+\b')

这种方式贴合sklearn原生设计,避免了自定义函数带来的序列化风险,是更优的解决方案。

内容的提问来源于stack exchange,提问作者User2603

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:20:53