You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Sklearn2pmml导出PMML时遇'classes_'参数异常求助

解决XGBClassifier导出PMML时classes_属性为空的错误

问题分析

错误提示显示Java端无法识别xgboost.sklearn.XGBClassifier.classes_的数组类型,即便你确认该属性是有效的array([0, 1]),本质是sklearn2pmml在序列化XGBoost模型时,对numpy数组格式的类别信息解析失败,或是模型训练与PMML封装的流程衔接有问题。

解决方案

1. 用PMMLPipeline包裹完整流程(推荐)

不要单独训练模型后再封装,而是把LabelEncoder和XGBClassifier整合进PMMLPipeline,让工具完整追踪所有步骤的元数据:

from sklearn.preprocessing import LabelEncoder
from sklearn2pmml import PMMLPipeline, sklearn2pmml
import xgboost as xgb
import os

# 初始化未训练的XGBClassifier实例
model = xgb.XGBClassifier()

# 构建包含预处理和模型的完整Pipeline
pipeline = PMMLPipeline([
    ("label_encoder", LabelEncoder()),
    ("classifier", model)
])

# 训练整个Pipeline
pipeline.fit(X_train, y_train)

# 设置字段信息(注意修正拼写错误:Traget → Target)
pipeline.active_fields = list(X_train.columns)
pipeline.target_fields = ['Target']

# 导出PMML
sklearn2pmml(pipeline, os.path.join('test.pmml'), debug=True)

2. 手动转换classes_为Python列表(备选)

如果坚持单独训练模型,可将numpy数组类型的classes_转为Python列表,避免Java端解析失败:

from sklearn.preprocessing import LabelEncoder
import sklearn2pmml as skpmml
from sklearn2pmml import PMMLPipeline, sklearn2pmml
import os

# 原训练流程
y_h_train = LabelEncoder().fit_transform(y_train.copy(deep=True))
modele_label_encoded = model.fit(X_train, y_h_train)

# 手动将classes_转为列表
modele_label_encoded.classes_ = modele_label_encoded.classes_.tolist()

# 封装并导出PMML
cols_used = list(X_train.columns)
pmml_model = skpmml.make_pmml_pipeline(modele_label_encoded)
pmml_model.active_fields = cols_used
pmml_model.target_fields = ['Target']
skpmml.sklearn2pmml(pmml_model, os.path.join('test.pmml'), debug=True)

3. 检查版本兼容性

确保依赖库版本匹配:

  • sklearn2pmml版本 ≥ 0.96.0
  • XGBoost版本 ≥ 1.3.0
    版本不兼容可能导致模型元数据传递异常。

内容的提问来源于stack exchange,提问作者Adept

火山引擎 最新活动