如何在不同机器间同步Polars的Categorical物理编码?
实现Polars Categorical跨机器一致编码的方案
不需要依赖pl.StringCache的全局状态,直接通过预定义分类列表的方式就能保证不同机器上的Categorical物理编码一致,全程用Polars实现:
训练机器端:保存分类编码规则
在训练时提取Categorical的分类列表并持久化,建议包含所有可能出现的类别(包括推理阶段可能遇到的):
import polars as pl import json with pl.StringCache(): # 训练数据的Categorical系列 s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical) # 获取完整分类列表(若有多个训练数据集,建议合并所有唯一类别) all_categories = s1.cat.categories().to_list() # 将分类列表保存到文件(也可使用pickle等格式) with open("categorical_codes.json", "w") as f: json.dump(all_categories, f)
推理机器端:加载并应用编码规则
加载保存的分类列表,创建或转换Categorical系列时强制使用该规则:
import polars as pl import json # 加载预定义的分类列表 with open("categorical_codes.json", "r") as f: saved_categories = json.load(f) # 方式1:创建Series时直接指定分类规则 s2 = pl.Series( "color", ["blue", "red", "green"], dtype=pl.Categorical.with_categories(saved_categories) ) # 方式2:对已有Series转换为指定分类(处理未知类别) # s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical) # s2 = s2.cat.set_categories(saved_categories, strict=False)
关键说明
pl.Categorical.with_categories()会直接基于指定的分类列表生成编码,完全不依赖全局的StringCache,确保跨机器的编码一致性。- 如果推理时遇到训练时未出现的类别(比如示例中的
blue),strict=False会将其转换为null;若需要保留未知类别,训练时就要提前把所有可能的类别加入到all_categories中。 - 验证编码一致性:可通过
cat.codes()方法查看物理编码,相同类别在两台机器上的编码值完全一致。
内容的提问来源于stack exchange,提问作者McToel
相关产品推荐
相关产品推荐

