scikit-learn模型导出ONNX前须确认支持性、显式声明输入类型与shape、完整转换pipeline、并严格验证输出一致性;否则易因不兼容、shape mismatch、逻辑缺失或精度偏差导致部署失败。

scikit-learn 模型导出 ONNX 前必须确认支持性
不是所有 sklearn 模型都能转 ONNX —— skl2onnx 只支持白名单内的 estimator 和 transformer。比如 RandomForestClassifier、LogisticRegression、StandardScaler 都行,但 IsolationForest 或自定义 TransformerMixin 子类默认不支持,强行调用 convert_sklearn() 会抛 RuntimeError: unable to find converter。
实操建议:
- 查官方支持列表:https://www.php.cn/link/99594d0d5f1bc469d458e58d35823e10,注意版本对应(如 sklearn-onnx 1.15 支持 sklearn 1.3+)
- 训练后立刻验证:用
skl2onnx.convert_sklearn(model, ...)尝试转换,别等到部署阶段才发现不兼容 - 若模型含
FunctionTransformer,确保其func是纯 Python 函数(不能含 NumPy ufunc 或闭包状态)
输入类型和 shape 必须显式声明
ONNX 是静态图格式,skl2onnx 不会自动推断输入维度或数据类型。漏设 initial_types 参数会导致转换失败或推理时 shape mismatch 错误,典型报错是 InvalidGraph: Input shape mismatch。
实操建议:
-
initial_types必须传入list,例如:[('X', FloatTensorType([None, 4]))]表示任意 batch size、4 列特征 - 列数必须与训练时
X_train.shape[1]严格一致;若用Pipeline,要按最终输入特征数算,不是原始 CSV 列数 - 类型优先用
FloatTensorType(对应float32),除非模型明确依赖int64(如某些计数型编码器)
pipeline 转换需统一处理,不能只转最后一步
直接对 Pipeline 对象调用 convert_sklearn() 是可行的,但常见错误是手动拆开 pipeline、只转换最后一个 estimator —— 这样丢失了预处理逻辑,ONNX 模型输入就不再是原始特征,而是中间变换结果,线上根本跑不通。
实操建议:
- 整个 pipeline(含
ColumnTransformer、StandardScaler、OneHotEncoder等)一起传给convert_sklearn() - 确保 pipeline 中所有 step 都在
skl2onnx支持列表里;OneHotEncoder要设drop=None和sparse_threshold=0,否则可能触发不支持路径 - 若 pipeline 含文本处理(如
TfidfVectorizer),需额外安装skl2onnx[extra]并用convert_sklearn(..., options={id(TfidfVectorizer): {'keep_sequence': True}})
验证 ONNX 模型输出是否与 sklearn 一致
转换成功不等于结果正确。常见偏差来源包括:浮点精度差异(尤其在 SVM 或 MLPClassifier 中)、OneHotEncoder 的 missing value 处理逻辑不一致、或 predict_proba 返回顺序与 sklearn 不同(如二分类时 ONNX 可能固定返回 [neg, pos])。
实操建议:
- 用同一组测试样本(
X_test[:5])分别跑 sklearn 的predict()/predict_proba()和 ONNX Runtime 的run() - 数值对比用
np.allclose(y_sklearn, y_onnx, atol=1e-5),别用== - 检查 ONNX 输出名:sklearn pipeline 转换后,输出名可能是
'label'和'probability',而非默认的'output_label',需看onnx_model.graph.output
最易被忽略的是:ONNX 模型默认不保留 sklearn 的 classes_ 属性,做多分类部署时,类别映射必须在转换前固化并写进 post-processing 逻辑里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











