使用含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
相关产品推荐
相关产品推荐

