2017-07-24 5 views
2

Ich habe ein geschultes scikit-learn-Modell, das einen Entscheidungsbaum mit mehreren Ausgängen verwendet (als RandomForestRegressor). Es wurde keine benutzerdefinierte Konfiguration explizit für das Random Forest Regression-Modell erstellt, um das Multi-Ausgabe-Verhalten zu aktivieren, da das Multi-Output-Verhalten integriert ist. Solange Sie Trainingsdaten mit mehreren Ausgängen an das Modell anpassen, wechselt das Modell im Hintergrund in den Multi-Output-Modus.scikit-learn: Konvertieren Multi-Output-Entscheidungsbaum zu CoreML-Modell

Zusätzlich ist der RandomForestRegressor ein unterstützter Transformator, den die CoreML-Konvertierungsskripts liefern. Doch während der Konvertierung, bekomme ich diesen Fehler w/Stack-Trace:

ValueError: Expected only 1 output in the scikit-learn tree.

Traceback (most recent call last): 
    File "/Users/user0/Desktop/model_convert.py", line 7, in <module> 
    coreml_model = sklearn_to_ml.convert(model) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_converter.py", line 146, in convert 
    sk_obj, input_features, output_feature_names, class_labels = None) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_converter_internal.py", line 297, in _convert_sklearn_model 
    last_spec = last_sk_m.convert(last_sk_obj, current_input_features, output_features)._spec 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_random_forest_regressor.py", line 53, in convert 
    return _MLModel(_convert_tree_ensemble(model, feature_names, target)) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 195, in convert_tree_ensemble 
    scaling = scaling, mode = mode, n_classes = n_classes, tree_index = tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 68, in _recurse 
    _recurse(coreml_tree, scikit_tree, tree_id, left_child_id, scaling, mode, n_classes, tree_index) 
    File "/Library/Python/2.7/site-packages/coremltools/converters/sklearn/_tree_ensemble.py", line 75, in _recurse 
    raise ValueError('Expected only 1 output in the scikit-learn tree.') 
ValueError: Expected only 1 output in the scikit-learn tree. 

Der einfache Umwandlungscode ist unten:

from coremltools.converters import sklearn as sklearn_to_ml 
from sklearn.externals import joblib 

model = joblib.load("ms5000.pkl") 

print("Converting model") 
coreml_model = sklearn_to_ml.convert(model) 

print("Saving CoreML model") 
coreml_model.save("ms5000.mlmodel") 

Was kann ich tun, um das CoreML Conversion-Skript aktivieren Multi-Output-Entscheidungsbäume behandeln? Kann ich die bestehenden Skripte ändern, ohne das Rad komplett neu zu erfinden?

Antwort

0

CoreML ist (gerade jetzt) ​​eine brandneue Sache, daher gibt es derzeit keine bekannten Quellen für Konvertierungsskripte von Drittanbietern.

Der Abschnitt "Modelle" der coremltools documentation enthält ausführliche Dokumentation zur Verwendung von Python zur Erstellung eines CoreML-Modells. Davon abgesehen können Sie jedes maschinelle Lernmodell mithilfe der in der Dokumentation bereitgestellten Modellschnittstellen in ein CoreML-Modell übersetzen.

Im Moment unterstützt coremltools keine Multi-Output-Regressionsmodelle. Wenn Sie das Rad nicht neu erfinden möchten, müssen Sie das Modell in ein einzelnes Ausgabemodell umwandeln, indem Sie eine neue Eingabe eingeben, die dem Ausgang entspricht, für den die aktuelle Vorhersage bestimmt ist.

Wie auch immer, die Dokumentation ist da, damit Sie anfangen können.