转PMML格式的LightGBM模型与原模型预测结果不一致问题求助
一、概率预测偏差5%-10%的排查与解决
确保预处理逻辑完整纳入Pipeline
原Sklearn训练时的特征预处理(如标准化、编码、缺失值填充)必须和LightGBM模型一起封装成Sklearn Pipeline后再导出PMML。如果单独导出模型,PMML不会包含预处理步骤,导致PySpark中输入的特征与训练时不一致,进而产生偏差。示例代码:from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer import lightgbm as lgb # 构建包含预处理的完整Pipeline pipeline = Pipeline([ ("imputer", SimpleImputer(strategy="median")), # 缺失值填充 ("scaler", StandardScaler()), # 标准化 ("lgbm_classifier", lgb.LGBMClassifier(objective="binary")) # 二分类倾向性模型 ]) # 训练Pipeline pipeline.fit(X_train, y_train) # 导出包含完整逻辑的PMML sklearn2pmml(pipeline, 'prod_trained_model.pmml')验证LightGBM参数与PMML输出映射
确认原模型使用objective="binary"(匹配倾向性概率预测的二分类场景),且PMML输出的是predict_proba对应的概率值(而非类别标签)。可以对比单个样本的特征值,分别用原Pipeline和PMML模型计算,逐步核对每一步的输出,定位偏差来源。排查浮点数精度差异
Sklearn与PMML评分引擎的浮点数精度设置可能不同,导致累积误差。可以输出原模型和PMML模型对同一特征向量的中间计算结果(如决策树的分裂值、叶子节点输出),对比差异是否来自精度截断。
二、部分样本输出NaN的排查与解决
检查缺失值处理逻辑
若原模型训练时已处理缺失值,但PMML未包含该逻辑,当输入数据存在缺失值时会输出NaN。必须将缺失值填充步骤加入Pipeline后再导出PMML(参考上述Pipeline示例)。核对特征名称与类型
确保PySpark数据框features_df的列名、数据类型与PMML模型定义的特征完全一致(包括大小写、下划线、数据类型如int/float)。列名不匹配或类型不兼容会导致PMML无法读取特征值,输出NaN。排查异常特征值
提取输出NaN的样本,检查是否存在超出训练数据范围的异常值(如极大值、极小值)。LightGBM对部分异常值有容错处理,但PMML解析引擎可能因数值溢出或非法输入返回NaN。可以对这类异常值做截断或映射处理后再输入PMML模型。验证PMML文件完整性
导出PMML时检查控制台是否有警告或错误信息,确保模型转换完整。可以用PMML规范验证工具检查文件是否合法,避免因模型定义缺失导致的评分错误。
内容的提问来源于stack exchange,提问作者karan

