首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >coreML工具无法将XGBoost分类器转换为coreML模型

coreML工具无法将XGBoost分类器转换为coreML模型
EN

Stack Overflow用户
提问于 2018-01-01 05:56:57
回答 1查看 394关注 0票数 4

我有一个关于coremltools的问题。

我想将经过训练的xgboost分类器模型转换为coreML模型。

代码语言:javascript
复制
import coremltools
import xgboost as xgb


X, y = get_data()

xgb_model = xgb.XGBClassifier()
xib_model.train(X, y)
coreml_model = coremltools.converters.xgboost.convert(xgb_model)
coremltools.save('my_model.mlmodel')

错误信息如下:

代码语言:javascript
复制
>>> coremltools.converters.xgboost.convert(xgb_model)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/karas/.pyenv/versions/anaconda2-4.3.0/lib/python2.7/site-packages/coremltools/converters/xgboost/_tree.py", line 51, in convert
    return _MLModel(_convert_tree_ensemble(model, feature_names, target, force_32bit_float = force_32bit_float))
  File "/Users/karas/.pyenv/versions/anaconda2-4.3.0/lib/python2.7/site-packages/coremltools/converters/xgboost/_tree_ensemble.py", line 143, in convert_tree_ensemble
    raise TypeError("Unexpected type. Expecting XGBoost model.")
TypeError: Unexpected type. Expecting XGBoost model.
EN

回答 1

Stack Overflow用户

发布于 2018-05-10 16:39:05

快速解决方案:

代码语言:javascript
复制
coreml_model = coremltools.converters.xgboost.convert(xgb_model._Booster)

关于这个转换器的更多信息:我刚刚遇到了这个问题,所以我调试到_tree_ensemble.py中,下面是我发现的:

第一个参数'model‘应该是_xgboost.core.Booster_xgboost.XGBRegressor,或者是前两个数据的.json文件的路径。此外,如果使用.json文件,则必须提供第二个参数feature_names

此外,根据the python examples on github的说法,还有另一种方法可以获得模型:

代码语言:javascript
复制
import numpy as np
import scipy.sparse
import pickle
import xgboost as xgb

### simple example
# load file from text file, also binary buffer generated by xgboost
dtrain = xgb.DMatrix('../data/agaricus.txt.train')
dtest = xgb.DMatrix('../data/agaricus.txt.test')

# specify parameters via map, definition are same as c++ version
param = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic'}

# specify validations set to watch performance
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
num_round = 2
booster = xgb.train(param, dtrain, num_round, watchlist)

注意这里的booster_xgboost.core.Booster

然后你可以这样做

代码语言:javascript
复制
import coremltools
coreml_model = coremltools.converters.xgboost.convert(booster)
coreml_model.save('my_model.mlmodel')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48045914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档