XGBoost 继承:__init__() 有一个意外的关键字参数“标签”

Posted

技术标签:

【中文标题】XGBoost 继承:__init__() 有一个意外的关键字参数“标签”【英文标题】:XGBoost Inheritance: __init__() got an unexpected keyword argument 'labels' 【发布时间】:2021-02-08 04:17:51 【问题描述】:

我正在重构一些 XGBoost 功能,以尽量减少我的数据科学项目中的重复代码。我在任何模型构建开始时都会运行一组通用的预处理步骤,并希望创建一个父类Model,以便为算法准备好我的数据。

import xgboost as xgb
from sklearn.preprocessing import OrdinalEncoder
from sklearn.compose import make_column_transformer

class Model:
    def __init__(self, dataframe, features, target, encoder):
        self.source = dataframe

        self.subset = self.source [self.source[target].notna()]

        self.X = self.subset[features]
        self.y = self.subset[target]

        self.categorical_features = list(self.X.select_dtypes(include = 'object').columns)
        self.encoder = encoder
        self.preprocessor = make_column_transformer((self.encoder, self.categorical_features), remainder = 'passthrough')
        self.preprocessor.fit (self.source[features])

        self.X = self.preprocessor.transform (self.X)

        self.X_train, self.X_test, self.y_train, self.y_test = train_test_split (self.X, self.y, test_size = 0.2)

class Model_XGB(Model):
    def fit(self, verbose = False):
        self.dtrain = xgb.DMatrix (self.X_train, labels = self.y_train)
        self.dtest = xgb.DMatrix (self.X_test, labels = self.y_test)

        params = 'max_depth': 2, 'eta': 1, 'objective': 'reg:squarederror', 'eval_metric': 'mae'
        evallist = [(self.dtrain, 'train'), (self.dtest, 'eval')]
        num_round = 300
        self.booster = xgb.train (param, self.dtrain, num_round, evallist, early_stopping_rounds=10, verbose_eval = verbose)

model_xgb = Model_XGB(data, best_features, 'area', OrdinalEncoder())
model_xgb.fit (verbose = True)

我的问题是,当我创建一个名为 Model_XGB 的子类并尝试添加一个新方法 fit 时,我收到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-71-e24c05d6f4dc> in <module>
     34 
     35 model_xgb = Model_XGB(data, best_features, 'area', OrdinalEncoder())
---> 36 model_xgb.fit (verbose = True)
     37 model_xgb.predict (data[best_features])

<ipython-input-71-e24c05d6f4dc> in fit(self, verbose)
     19 class Model_XGB(Model):
     20     def fit(self, verbose = False):
---> 21         self.dtrain = xgb.DMatrix (self.X_train, labels = self.y_train)
     22         self.dtest = xgb.DMatrix (self.X_test, labels = self.y_test)
     23 

TypeError: __init__() got an unexpected keyword argument 'labels'

我何时将labels 传递给__init__()labelsxgb 的方法参数。我对python中的继承有什么误解,还是与这些包有关?

【问题讨论】:

请使用完整的错误回溯更新您的问题。 【参考方案1】:

想通了 - 参数名称是 label 而不是 labels!我以为__init__() 指的是对象而不是DMatrix

【讨论】:

以上是关于XGBoost 继承:__init__() 有一个意外的关键字参数“标签”的主要内容,如果未能解决你的问题,请参考以下文章

经典类与新式类的继承顺序

当父级不从对象继承时,Python 2.x 超级 __init__ 继承不起作用

继承类中的python __init__方法

Python:__init__ 中的继承和默认值

使用 __init__ 继承属性

用XGBoost迭代读取数据集