scikit-learn: преобразовать дерево решений с несколькими выходами в модель CoreML

У меня есть обученная модель scikit-learn, которая использует дерево решений с несколькими выходами (как RandomForestRegressor). Для модели регрессии случайного леса не было явной настраиваемой конфигурации для включения поведения с несколькими выходами, поскольку поведение с несколькими выходами является встроенным. По сути, пока вы подгоняете обучающие данные с несколькими выходами к модели, модель будет незаметно переключаться в режим с несколькими выходами.

Кроме того, RandomForestRegressor - это поддерживаемый преобразователь, поставляемый скриптами преобразования CoreML. Однако во время преобразования я получаю эту ошибку с трассировкой стека:

ValueError: ожидается только 1 вывод в дереве scikit-learn.

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.

Ниже приведен простой код преобразования:

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

Что я могу сделать, чтобы скрипт преобразования CoreML обрабатывал деревья решений с несколькими выходами? Могу ли я внести изменения в существующие сценарии, не изобретая велосипед полностью с помощью нового сценария?


person jshapy8    schedule 24.07.2017    source источник


Ответы (1)


CoreML - это (прямо сейчас) совершенно новая вещь, поэтому в настоящее время нет никаких известных источников сторонних скриптов преобразования.

В разделе «Модели» coremltools документации содержится подробная документация по использованию Python для создания модели CoreML. При этом вы можете преобразовать любую модель машинного обучения в модель CoreML, используя интерфейсы модели, представленные в документации.

В настоящий момент coremltools не поддерживает модели регрессии с несколькими выходами. Если вы не хотите изобретать колесо, вам нужно будет преобразовать модель в модель с одним выходом, введя новый вход, который соответствует выходу, для которого предназначен текущий прогноз.

В любом случае, документация есть, чтобы вы начали.

person jshapy8    schedule 05.08.2017