2015-10-19 21 views
8

私は、python scikit-learnモデルをPMMLにエクスポートしたいと思います。エクスポートpython scikitモデルをpmmlに学習

どのようなpythonパッケージが最適ですか?

私は約Augustusを読んでいましたが、scikit-learnモデルを使用している例は見つかりませんでした。

+0

(https://github.com:

あなたはgraphviz出力にPMML出力を比較することができます/ jpmml/sklearn2pmml)パッケージ。 – user1808924

+0

JPMML-SkLearnもPython 2.7をサポートしていますが、現時点では宣伝されていません。 – user1808924

+0

jpmml-sklearnパッケージは、Python 3.4からサポートしています。 Python 2.7をサポートする代替手段がありますか – Selva

答えて

8

SkLearn2PMML

JPMML-SkLearnコマンドラインアプリケーションの周りに薄いラッパーです。サポートされているScikit-Learn EstimatorとTransformerの種類については、JPMML-SkLearnプロジェクトのドキュメントを参照してください。

@ user1808924は、Python 2.7または3.4+をサポートしています。また、Java 1.7以降

を介してインストール

が必要です:PMMLに分類器ツリーをエクスポートする方法の

pip install git+https://github.com/jpmml/sklearn2pmml.git 

例(gitが必要です)。まず木を育てる:

# 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などの前処理工程のために)マッパーには2つの部分があります。私たちのマッパーは、基本的なものではありません。

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ない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> 

最初のスプリット(ノード1)は0.8で、花びらの幅です。ノード2(花びらの幅< = 0.8)は、他に何もセットオザをすべて捕捉します。あなたは[sklearn2pmml]を使用してPMMLにモデルや変圧器をScikit・ラーン変換することができます

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()) 

enter image description here

+0

マッパーを使用しないときにプレディクタ名を保持する方法はありますか?私は本当に評価者の側でそれらを知る必要がありますが、これのためだけにマッパーを構築することは、あまりにも多くの過剰なものです。 – KidCrippler

+0

@Kマッパーなしでプレディクタ名を保存する方法を理解できませんでした。あなたは質問を投稿しようとすることができます。 – C8H10N4O2

+3

答えは廃止されたようです: 'sklearn2pmml'は' PMMLPipeline'を使用するようになりました。 – sds

関連する問題