提示: 本文是模型部署方案的一部分

依赖

步骤

  1. 使用sklearn训练一个模型
  2. 使用sklearn原生API将模型导出为 pickle 格式
  3. 使用 JPMML-SkLearn命令将原始pickle 格式文件转换成JPMML文件

我们开始吧

训练模型 & 导出pickle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import pandas

# 0. 使用pandas加载iris数据集
df = pandas.read_csv("file:./csv/Iris.csv")

iris_X = df[df.columns.difference(["Species"])]
iris_y = df["Species"]

# 1. 创建一个sklearn_pandas.DataFrameMapper对象,它主要提供面向列的特征工程、标准化功能
from sklearn_pandas import DataFrameMapper
from sklearn.preprocessing import StandardScaler
from sklearn2pmml.decoration import ContinuousDomain

column_preprocessor = DataFrameMapper([
(["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"], [ContinuousDomain(), StandardScaler()])
])

# 2. 创建一个Transformer和Selector对象,它主要提供面向表的特征工程、标准化功能
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import Pipeline
from sklearn2pmml import SelectorProxy

table_preprocessor = Pipeline([
("pca", PCA(n_components = 3)),
("selector", SelectorProxy(SelectKBest(k = 2)))
])

# 3. 创建一个Estimator对象
from sklearn.tree import DecisionTreeClassifier

classifier = DecisionTreeClassifier(min_samples_leaf = 5)

# 将上面的对象作为参数与sklearn2pmml.pipeline.PMMLPipeline对象组合起来,此时可以运行一下,看看能不能跑通
from sklearn2pmml.pipeline import PMMLPipeline

pipeline = PMMLPipeline([
("columns", column_preprocessor),
("table", table_preprocessor),
("classifier", classifier)
])
pipeline.fit(iris_X, iris_y)

# 内置的模型验证功能
pipeline.verify(iris_X.sample(n = 15))

# 将拟合好的PMMLPipeline对象,用joblib导出为pickle格式的文件
from sklearn.externals import joblib

joblib.dump(pipeline, "pipeline.pkl.z", compress = 9)

此时,我们得到了原始模型文件

image-20180830134051087.png

转换JPMML

我们需要jpmml-sklearn的帮助,来转换原始模型文件。目前该子项目的最新版本为1.5.4,我们可以下载编译好的jar包,或者自己编译。

image-20180830134831357.png

这里笔者选择自行编译:

1
2
git clone https://github.com/jpmml/jpmml-sklearn.git
cd jpmml-sklearn && mvn clean install -DskipTests

将我们上面得到的原始文件拷贝到jpmml-sklearn目录下, 执行:

1
java -jar target/jpmml-sklearn-executable-1.5-SNAPSHOT.jar --pkl-input pipeline.pkl.z --pmml-output pipeline.pmml

我们成功的得到了pmml模型文件

image-20180830135636503.png

Comments