Я хочу экспортировать python scikit-learn модели в PMML.
Какой пакет python лучше всего подходит?
Я читал о Augustus, но я не смог найти какой-либо пример, используя модели scikit-learn.
Я хочу экспортировать python scikit-learn модели в PMML.
Какой пакет python лучше всего подходит?
Я читал о Augustus, но я не смог найти какой-либо пример, используя модели scikit-learn.
тонкая оболочка вокруг приложения командной строки JPMML-SkLearn. Список поддерживаемых типов Scikit-Learn Estimator и Transformer см. В документации по проекту JPMML-SkLearn.
Как отмечает @user1808924, он поддерживает Python 2.7 или 3.4+. Он также требует Java 1.7 +
Установлен через: (требуется git)
pip install git+https://github.com/jpmml/sklearn2pmml.git
Пример того, как экспортировать дерево классификатора в PMML. Сначала вырастите дерево:
# example tree & viz from http://scikit-learn.org/stable/modules/tree.html
from sklearn import datasets, tree
iris = datasets.load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
Есть две части преобразования SkLearn2PMML, оценщик (наш clf
) и картограф (для шагов предварительной обработки, таких как дискретизация или PCA). Наш картограф довольно простой, поскольку мы не делаем никаких преобразований.
from sklearn_pandas import DataFrameMapper
default_mapper = DataFrameMapper([(i, None) for i in iris.feature_names + ['Species']])
from sklearn2pmml import sklearn2pmml
sklearn2pmml(estimator=clf,
mapper=default_mapper,
pmml="D:/workspace/IrisClassificationTree.pmml")
Возможно (хотя и не документировано) пройти mapper=None
, но вы увидите, что имена предикторов теряются (возврат x1
not sepal length
и т.д.).
Посмотрите на файл .pmml
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PMML xmlns="http://www.dmg.org/PMML-4_3" version="4.3">
<Header>
<Application name="JPMML-SkLearn" version="1.1.1"/>
<Timestamp>2016-09-26T19:21:43Z</Timestamp>
</Header>
<DataDictionary>
<DataField name="sepal length (cm)" optype="continuous" dataType="float"/>
<DataField name="sepal width (cm)" optype="continuous" dataType="float"/>
<DataField name="petal length (cm)" optype="continuous" dataType="float"/>
<DataField name="petal width (cm)" optype="continuous" dataType="float"/>
<DataField name="Species" optype="categorical" dataType="string">
<Value value="setosa"/>
<Value value="versicolor"/>
<Value value="virginica"/>
</DataField>
</DataDictionary>
<TreeModel functionName="classification" splitCharacteristic="binarySplit">
<MiningSchema>
<MiningField name="Species" usageType="target"/>
<MiningField name="sepal length (cm)"/>
<MiningField name="sepal width (cm)"/>
<MiningField name="petal length (cm)"/>
<MiningField name="petal width (cm)"/>
</MiningSchema>
<Output>
<OutputField name="probability_setosa" dataType="double" feature="probability" value="setosa"/>
<OutputField name="probability_versicolor" dataType="double" feature="probability" value="versicolor"/>
<OutputField name="probability_virginica" dataType="double" feature="probability" value="virginica"/>
</Output>
<Node id="1">
<True/>
<Node id="2" score="setosa" recordCount="50.0">
<SimplePredicate field="petal width (cm)" operator="lessOrEqual" value="0.8"/>
<ScoreDistribution value="setosa" recordCount="50.0"/>
<ScoreDistribution value="versicolor" recordCount="0.0"/>
<ScoreDistribution value="virginica" recordCount="0.0"/>
</Node>
<Node id="3">
<SimplePredicate field="petal width (cm)" operator="greaterThan" value="0.8"/>
<Node id="4">
<SimplePredicate field="petal width (cm)" operator="lessOrEqual" value="1.75"/>
<Node id="5">
<SimplePredicate field="petal length (cm)" operator="lessOrEqual" value="4.95"/>
<Node id="6" score="versicolor" recordCount="47.0">
<SimplePredicate field="petal width (cm)" operator="lessOrEqual" value="1.6500001"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="47.0"/>
<ScoreDistribution value="virginica" recordCount="0.0"/>
</Node>
<Node id="7" score="virginica" recordCount="1.0">
<SimplePredicate field="petal width (cm)" operator="greaterThan" value="1.6500001"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="0.0"/>
<ScoreDistribution value="virginica" recordCount="1.0"/>
</Node>
</Node>
<Node id="8">
<SimplePredicate field="petal length (cm)" operator="greaterThan" value="4.95"/>
<Node id="9" score="virginica" recordCount="3.0">
<SimplePredicate field="petal width (cm)" operator="lessOrEqual" value="1.55"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="0.0"/>
<ScoreDistribution value="virginica" recordCount="3.0"/>
</Node>
<Node id="10">
<SimplePredicate field="petal width (cm)" operator="greaterThan" value="1.55"/>
<Node id="11" score="versicolor" recordCount="2.0">
<SimplePredicate field="sepal length (cm)" operator="lessOrEqual" value="6.95"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="2.0"/>
<ScoreDistribution value="virginica" recordCount="0.0"/>
</Node>
<Node id="12" score="virginica" recordCount="1.0">
<SimplePredicate field="sepal length (cm)" operator="greaterThan" value="6.95"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="0.0"/>
<ScoreDistribution value="virginica" recordCount="1.0"/>
</Node>
</Node>
</Node>
</Node>
<Node id="13">
<SimplePredicate field="petal width (cm)" operator="greaterThan" value="1.75"/>
<Node id="14">
<SimplePredicate field="petal length (cm)" operator="lessOrEqual" value="4.8500004"/>
<Node id="15" score="virginica" recordCount="2.0">
<SimplePredicate field="sepal width (cm)" operator="lessOrEqual" value="3.1"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="0.0"/>
<ScoreDistribution value="virginica" recordCount="2.0"/>
</Node>
<Node id="16" score="versicolor" recordCount="1.0">
<SimplePredicate field="sepal width (cm)" operator="greaterThan" value="3.1"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="1.0"/>
<ScoreDistribution value="virginica" recordCount="0.0"/>
</Node>
</Node>
<Node id="17" score="virginica" recordCount="43.0">
<SimplePredicate field="petal length (cm)" operator="greaterThan" value="4.8500004"/>
<ScoreDistribution value="setosa" recordCount="0.0"/>
<ScoreDistribution value="versicolor" recordCount="0.0"/>
<ScoreDistribution value="virginica" recordCount="43.0"/>
</Node>
</Node>
</Node>
</Node>
</TreeModel>
</PMML>
Первый сплит (Node 1) находится на ширине лепестков 0,8. Node 2 (ширина лепестка <= 0,8) захватывает всю сеттозу, и ничего больше.
Вы можете сравнить выход pmml с выходом graphviz
:
from sklearn.externals.six import StringIO
import pydotplus # this might be pydot for python 2.7
dot_data = StringIO()
tree.export_graphviz(clf,
out_file=dot_data,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("D:/workspace/iris.pdf")
# for in-line display, you can also do:
# from IPython.display import Image
# Image(graph.create_png())
Не стесняйтесь попробовать Nyoka. Экспорт моделей SKL, а затем некоторые.
Nyoka библиотека питон, имеющий поддержку Scikit-learn
, XGBoost
, LightGBM
, Keras
и Statsmodels
.
Помимо примерно 500 классов Python, каждый из которых охватывает тег PMML и все параметры/атрибуты конструктора, как определено в стандарте, Nyoka также предоставляет растущее число удобных классов и функций, которые облегчают жизнь Data Scientists, например, путем чтения или записи любого файла PMML. в одной строке кода в вашей любимой среде Python.
Его можно установить из PyPi, используя:
pip install nyoka
import pandas as pd
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, Imputer
from sklearn_pandas import DataFrameMapper
from sklearn.ensemble import RandomForestClassifier
iris = datasets.load_iris()
irisd = pd.DataFrame(iris.data, columns=iris.feature_names)
irisd['Species'] = iris.target
features = irisd.columns.drop('Species')
target = 'Species'
pipeline_obj = Pipeline([
("mapping", DataFrameMapper([
(['sepal length (cm)', 'sepal width (cm)'], StandardScaler()) ,
(['petal length (cm)', 'petal width (cm)'], Imputer())
])),
("rfc", RandomForestClassifier(n_estimators = 100))
])
pipeline_obj.fit(irisd[features], irisd[target])
from nyoka import skl_to_pmml
skl_to_pmml(pipeline_obj, features, target, "rf_pmml.pmml")
from keras import applications
from keras.layers import Flatten, Dense
from keras.models import Model
model = applications.MobileNet(weights='imagenet', include_top=False,input_shape = (224, 224,3))
activType='sigmoid'
x = model.output
x = Flatten()(x)
x = Dense(1024, activation="relu")(x)
predictions = Dense(2, activation=activType)(x)
model_final = Model(inputs =model.input, outputs = predictions,name='predictions')
from nyoka import KerasToPmml
cnn_pmml = KerasToPmml(model_final,dataSet='image',predictedClasses=['cats','dogs'])
cnn_pmml.export(open('2classMBNet.pmml', "w"), 0)
Больше примеров можно найти на странице Nyoka Github.