Core ML MLOneHotEncoder 更新后报错:"unknown category String"
Core ML 14.1.2中MLOneHotEncoder未知分类问题的解决方案
1. MLOneHotEncoder处理未知分类的行为变更
Core ML 14.x版本确实调整了MLOneHotEncoder的默认行为:在13.0.1及更早版本中,编码器会默认将未知分类映射为全0向量或自动忽略;而14.1.2开始,默认启用严格校验模式,输入的分类必须属于训练阶段定义的类别集合,否则直接抛出MLOneHotEncoder: unknown category String错误。这一变更的目的是强化输入数据的一致性,避免因未知分类导致的预测结果偏差。
2. 处理未知字符串分类的推荐实践
- 配置编码器的未知处理策略:训练模型时,明确设置MLOneHotEncoder的
handleUnknown参数(Create ML工具中对应"未知类别处理"选项,coremltools中通过OneHotEncoder的参数配置)为"ignore"(将未知分类映射为全0向量)或"useEncodedValue"(使用自定义编码值),恢复旧版本的兼容行为。 - 客户端预处理过滤:在预测前添加数据校验逻辑,将输入中的未知分类映射到训练时存在的类别(比如映射到数据集中出现频率最高的类别),或者统一归为提前定义的"其他"类别(需确保训练数据中包含该类别)。
- 扩展训练数据集:如果业务中存在频繁出现的未知分类,可将这类数据补充到训练集中重新训练模型,让编码器提前学习这些类别。
3. 模型训练与预处理的修改建议
- 若要保持和旧版本一致的预测逻辑,必须修改模型训练代码或配置:在训练阶段设置MLOneHotEncoder的未知处理策略为非严格模式,重新导出Core ML模型。
- 若不想重新训练模型,可在客户端添加预处理步骤:对输入的分类字段进行校验,过滤掉不在模型类别集合中的值,或进行映射处理后再传入模型预测。
内容的提问来源于stack exchange,提问作者Simon Bogutzky
相关产品推荐
相关产品推荐

