机器学习模型使用时需要导出后部署在线使用,有些项目需要pmml格式,两种方法,第二种成本更低。
一、什么是PMML
PMML(Predictive Model Markup Language):预测模型标记语言,它用XML格式来描述生成的机器学习模型,是目前表示机器学习模型的实际标准。
若要将在Python中训练好的模型部署到生产上时,可以使用目标环境解析PMML文件的库来加载模型,并做预测。
二、如何导出为PMML
1. sklearn2pmml
这个方法需要安装java
import xgboost as xgb
from sklearn2pmml import sklearn2pmml, make_pmml_pipeline
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据集,这里以Iris为例
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用XGBoost的Scikit-Learn接口训练模型
model = xgb.XGBClassifier(objective='multi:softmax', num_class=3)
model.fit(X_train, y_train)
# 创建PMML兼容的pipeline
pipeline = make_pmml_pipeline(model)
# 导出模型到PMML文件
sklearn2pmml(pipeline, "XGBoost.pmml", with_repr = True)
报错:RuntimeError: Java is not installed, or the Java executable is not on system path
解决办法
遇到这个错误是因为sklearn2pmml库在转换模型到PMML格式时依赖于Java,因为它内部使用了JPMML(Java PMML)库来执行转换过程。如果你没有安装Java或者Java的路径没有被正确配置到系统环境变量中,就会导致这个错误。
解决办法:
1.安装Java: 首先,确保你的系统中安装了Java。你可以从Oracle官网下载适合你操作系统的Java Development Kit (JDK)。对于大多数开发用途,选择最新的长期支持(LTS)版本即可。
2.配置Java环境变量: 安装Java后,需要确保Java的可执行文件(通常是java和javac)所在的目录被添加到了系统的PATH环境变量中。这样,你就可以在任何命令行窗口中直接运行Java命令。
对于Windows:
- 右键点击“此电脑”或“我的电脑”,选择“属性”。 点击“高级系统设置”。
- 在“系统属性”对话框中点击“环境变量”按钮。
- 在“系统变量”区域找到并选择“Path”,然后点击“编辑”。
- 添加JDK的bin目录路径(例如,C:\Program Files\Java\jdk-版本号\bin)
- 到变量值中,使用分号;与其他路径分隔。
对于Linux或macOS:
- 打开终端。
- 编辑.bashrc或.bash_profile(对于macOS Catalina及以上版本,可能需要编辑.zshrc),使用文本编辑器如nano或vim。
- 在文件末尾添加以下行(替换/path/to/jdk为实际的JDK安装路径):
export JAVA_HOME=/path/to/jdk export PATH=$JAVA_HOME/bin:$PATH
- 保存文件并关闭编辑器,然后运行source ~/.bashrc或source ~/.bash_profile(或.zshrc)使更改生效。
- 验证Java安装: 重新打开命令行窗口,运行命令java -version,如果看到Java版本信息输出,则说明Java已正确安装并且环境变量配置成功。
完成以上步骤后,你应该能够使用sklearn2pmml
成功地将XGBoost
模型转换为、PMML
格式了。如果问题仍然存在,可能需要检查是否有其他依赖问题或考虑使用nyoka
作为替代方案。
2. nyoka
这个方法不需要安装java
import xgboost as xgb
from sklearn2pmml import make_pmml_pipeline
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from nyoka import xgboost_to_pmml
# 加载数据集,这里以Iris为例
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用XGBoost的Scikit-Learn接口训练模型
model = xgb.XGBClassifier(objective='multi:softmax', num_class=3)
model.fit(X_train, y_train)
# 创建PMML兼容的pipeline
pipeline = make_pmml_pipeline(model)
# 假设model是之前训练好的xgboost.Booster对象
xgboost_to_pmml(pipeline=pipeline, col_names=data.feature_names, target_name='species', pmml_f_name="XGBoost.pmml")