Skip to content

Cannot export XGBClassifier model: TypeError: unsupported operand type(s) for *: 'int' and 'NoneType' #589

Open
@git2621

Description

from sklearn.datasets import load_iris
 
from xgboost.sklearn import XGBClassifier
from xgboost import plot_importance
 
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
 
#记载样本数据集
iris = load_iris()
x,y = iris.data,iris.target
 
#数据集分割
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=123457)
 
xgb_clf = XGBClassifier(
    booster = 'gbtree',
    objective = 'multi:softmax',
    num_class = 3,
    gamma = 0.1,
    max_depth = 6,
    reg_lambda = 2,
    subsample = 0.7,
    colsample_bytree = 0.7,
    min_child_weight = 3,
    eta = 0.1,
    seed = 1000,
    nthread = 4,
)
 
#训练模型
xgb_clf.fit(x_train,y_train,eval_metric='auc')
 
import m2cgen as m2c
xgb_clf.base_score = 0
code = m2c.export_to_c(xgb_clf)
with open ('model.c', 'w') as f:
   f.write(code)

Full trace:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[24], line 3
      1 import m2cgen as m2c
      2 xgb_clf.base_score = 0
----> 3 code = m2c.export_to_c(xgb_clf)
      4 with open ('model.c', 'w') as f:
      5    f.write(code)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\m2cgen\exporters.py:81, in export_to_c(model, indent, function_name)
     61 """
     62 Generates a C code representation of the given model.
     63 
   (...)
     75 code : string
     76 """
     77 interpreter = interpreters.CInterpreter(
     78     indent=indent,
     79     function_name=function_name
     80 )
---> 81 return _export(model, interpreter)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\m2cgen\exporters.py:459, in _export(model, interpreter)
    457 def _export(model, interpreter):
    458     assembler_cls = get_assembler_cls(model)
--> 459     model_ast = assembler_cls(model).assemble()
    460     return interpreter.interpret(model_ast)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\m2cgen\assemblers\boosting.py:214, in XGBoostModelAssemblerSelector.assemble(self)
    213 def assemble(self):
--> 214     return self.assembler.assemble()

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\m2cgen\assemblers\boosting.py:36, in BaseBoostingAssembler.assemble(self)
     34         return self._assemble_bin_class_output(self._all_estimator_params)
     35     else:
---> 36         return self._assemble_multi_class_output(self._all_estimator_params)
     37 else:
     38     result_ast = self._assemble_single_output(self._all_estimator_params, base_score=self._base_score)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\m2cgen\assemblers\boosting.py:62, in BaseBoostingAssembler._assemble_multi_class_output(self, estimator_params)
     58 def _assemble_multi_class_output(self, estimator_params):
     59     # Multi-class output is calculated based on discussion in
     60     # https://github.com/dmlc/xgboost/issues/1746#issuecomment-295962863
     61     # and the enhancement to support boosted forests in XGBoost.
---> 62     splits = _split_estimator_params_by_classes(
     63         estimator_params, self._output_size,
     64         self.multiclass_params_seq_len)
     66     base_score = self._base_score
     67     exprs = [
     68         self._assemble_single_output(e, base_score=base_score, split_idx=i)
     69         for i, e in enumerate(splits)
     70     ]

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\m2cgen\assemblers\boosting.py:347, in _split_estimator_params_by_classes(values, n_classes, params_seq_len)
    342 def _split_estimator_params_by_classes(values, n_classes, params_seq_len):
    343     # Splits are computed based on a comment
    344     # https://github.com/dmlc/xgboost/issues/1746#issuecomment-267400592
    345     # and the enhancement to support boosted forests in XGBoost.
    346     values_len = len(values)
--> 347     block_len = n_classes * params_seq_len
    348     indices = list(range(values_len))
    349     indices_by_class = np.array(
    350         [[indices[i:i + params_seq_len]
    351           for i in range(j, values_len, block_len)]
    352          for j in range(0, block_len, params_seq_len)]
    353         ).reshape(n_classes, -1)

TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'

xgboost version '2.0.3'

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions