包含pandas操作的sklearn完整pipeline能否序列化到ONNX供.NET使用
结论
包含全量数据预处理逻辑的sklearn pipeline可以整体序列化到ONNX格式,前提是所有pandas层面的数据操作都要替换为支持ONNX转换的预处理算子,整合到Pipeline内部。
具体操作方法
- 替换pandas原生操作:不要在Pipeline外部单独调用pandas的
drop()、fillna()等方法处理数据,将这些逻辑全部替换为sklearn生态中支持ONNX导出的算子:- 删除指定列:通过
sklearn.compose.ColumnTransformer指定需要保留的列列表,剩余列会被自动过滤,无需单独实现删除逻辑 - 缺失值填充:使用
sklearn.impute.SimpleImputer实现均值、中位数、固定值等常见填充策略 - 其他数据转换操作如类别编码、数值标准化等,都可以用sklearn原生的
OneHotEncoder、StandardScaler等组件实现
- 删除指定列:通过
- 组装全链路Pipeline:通过
sklearn.pipeline.Pipeline按顺序拼接所有预处理算子和下游预测模型,确保从原始输入到预测输出的所有逻辑都封装在Pipeline内部 - 导出ONNX文件:使用
skl2onnx库的convert_sklearn方法完成导出,导出时需要和实际输入的特征维度、数据类型匹配,指定正确的输入规格
.NET侧调用说明
- .NET侧不需要额外实现删除列、填充缺失值等预处理逻辑,所有逻辑已经内置在导出的ONNX文件中
- 只需要将接收到的JSON数据按照ONNX模型要求的输入格式整理为张量,调用Microsoft.ML.OnnxRuntime库加载ONNX文件即可完成端到端推理
特殊场景说明:如果存在无法用sklearn原生算子实现的自定义数据转换逻辑,需要先将该逻辑实现为符合sklearn接口的自定义Transformer,并且适配ONNX转换规则后再整合到Pipeline中,否则这部分逻辑不会被包含在导出的ONNX文件里,会导致两端推理结果不一致。
内容的提问来源于stack exchange,提问作者gap210
相关产品推荐
相关产品推荐

