使用coremltools转换XGBoost分类器为Core ML模型时遇类型错误求助
解决XGBoost分类器转Core ML时的TypeError问题
这个问题我之前也碰到过,核心原因是coremltools.converters.xgboost.convert() 只接受XGBoost原生的Booster对象,而你代码里使用的XGBClassifier是XGBoost封装的scikit-learn风格接口类,并不是转换器期待的模型类型,所以触发了TypeError: Unexpected type. Expecting XGBoost model.错误。
另外顺便提一句:你代码里的xib_model.train(X, y)是笔误,应该是xgb_model.fit(X, y)——XGBClassifier遵循scikit-learn规范,用fit()方法训练,而不是train()。
下面给你两种可行的解决方案:
方法一:从XGBClassifier中提取底层Booster模型
如果你已经用XGBClassifier完成了训练,只需要提取它内部的原生Booster模型即可完成转换:
import coremltools import xgboost as xgb # 替换成你的数据加载逻辑 X, y = get_data() # 训练XGBClassifier(注意用fit方法) xgb_model = xgb.XGBClassifier() xgb_model.fit(X, y) # 提取原生Booster模型 booster_model = xgb_model.get_booster() # 转换为Core ML模型,建议指定特征名和目标名(方便后续使用) coreml_model = coremltools.converters.xgboost.convert( booster_model, feature_names=["feature_1", "feature_2", ...], # 替换成你的实际特征名称列表 target="predicted_class" # 自定义目标变量名称 ) # 保存模型 coreml_model.save('my_model.mlmodel')
方法二:直接使用XGBoost原生Booster训练
如果不需要依赖scikit-learn接口,也可以直接用XGBoost的原生流程训练Booster模型,这样转换更直接:
import coremltools import xgboost as xgb # 替换成你的数据加载逻辑 X, y = get_data() # 转换为XGBoost原生的DMatrix格式 dtrain = xgb.DMatrix(X, label=y, feature_names=["feature_1", "feature_2", ...]) # 设置训练参数(根据你的任务调整,比如分类任务用binary:logistic或multi:softmax) params = { 'objective': 'binary:logistic', 'eval_metric': 'logloss', 'max_depth': 3 } # 训练原生Booster模型 booster_model = xgb.train(params, dtrain, num_boost_round=10) # 转换并保存Core ML模型 coreml_model = coremltools.converters.xgboost.convert(booster_model) coreml_model.save('my_model.mlmodel')
验证转换结果
转换完成后,你可以加载模型测试一下,确保输入输出符合预期:
# 加载Core ML模型 loaded_model = coremltools.models.MLModel('my_model.mlmodel') # 用单条样本测试预测(注意输入要和你指定的特征名对应) sample_input = { "feature_1": X[0][0], "feature_2": X[0][1], # 其他特征... } prediction = loaded_model.predict(sample_input) print(prediction)
内容的提问来源于stack exchange,提问作者Karas Kazu
相关产品推荐
相关产品推荐

