scikit-learn: 将多输出决策树转换为CoreML模型

我有一个训练好的scikit-learn模型,它使用了多输出决策树(作为RandomForestRegressor)。没有对随机森林回归模型进行任何自定义配置来启用多输出行为,因为多输出行为是内置的。基本上,只要你将多输出训练数据拟合到模型中,模型就会在幕后切换到多输出模式。

此外,RandomForestRegressor是CoreML转换脚本支持的转换器。然而,在转换过程中,我遇到了以下错误和堆栈跟踪:

ValueError: 预期scikit-learn树中只有1个输出。

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_mlfrom sklearn.externals import joblibmodel = joblib.load("ms5000.pkl")print("正在转换模型")coreml_model = sklearn_to_ml.convert(model)print("正在保存CoreML模型")coreml_model.save("ms5000.mlmodel")

我该如何使CoreML转换脚本能够处理多输出决策树?是否可以在不完全重新编写新脚本的情况下对现有脚本进行修改?


回答:

CoreML目前还是一个全新的事物,目前还没有已知的第三方转换脚本来源。

coremltools文档的“模型”部分提供了如何使用Python生成CoreML模型的详细文档。也就是说,你可以使用文档中提供的模型接口将任何机器学习模型转换为CoreML模型。

目前,coremltools不支持多输出回归模型。如果你不想重新发明轮子,你需要通过引入一个新的输入来将模型转换为单输出模型,这个新输入对应于当前预测的输出是哪一个。

无论哪种方式,文档都在那里,应该可以帮助你开始。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注