Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在继承期间避免init中的代码重复?扩展xgb.XGBClassifier以处理要素名称_Python_Oop_Inheritance - Fatal编程技术网

Python 如何在继承期间避免init中的代码重复?扩展xgb.XGBClassifier以处理要素名称

Python 如何在继承期间避免init中的代码重复?扩展xgb.XGBClassifier以处理要素名称,python,oop,inheritance,Python,Oop,Inheritance,我在扩展xgb.XGBClassifier类时遇到了具体问题,但它可以作为一般的OOP问题来构建 我的实施基于: 基本上,当提供的数据在DataFrame中时,我希望添加特性名称处理 几句话: XGBClassifierN在_init__uu中具有与基类xgb.XGBClassifier相同的参数, 还有一个附加属性self.feature\u names,由后面的fit方法设置。 其余的可以通过混合来完成。 它起作用了 让我烦恼的是,这堵代码墙在初始化。它是通过复制粘贴默认值完成的,每次xgb

我在扩展xgb.XGBClassifier类时遇到了具体问题,但它可以作为一般的OOP问题来构建

我的实施基于:

基本上,当提供的数据在DataFrame中时,我希望添加特性名称处理

几句话:

XGBClassifierN在_init__uu中具有与基类xgb.XGBClassifier相同的参数, 还有一个附加属性self.feature\u names,由后面的fit方法设置。 其余的可以通过混合来完成。 它起作用了

让我烦恼的是,这堵代码墙在初始化。它是通过复制粘贴默认值完成的,每次xgb.Classifier发生更改时,它都必须更新

是否有任何方法可以简洁地表达这样一种想法:子类XGBClassifierN具有与父类xgb.XGBClassifier相同的参数和默认值,并执行后续操作,如clf=XGBClassifierN_jobs=-1

我试着只使用**kwargs,但没有成功,解释器开始抱怨没有缺少参数,没有双关语意图,并且为了使它基本上可以工作,您需要设置更多的参数

import xgboost as xgb

class XGBClassifierN(xgb.XGBClassifier):
    def __init__(self, base_score=0.5, booster='gbtree', colsample_bylevel=1,
              colsample_bynode=1, colsample_bytree=1, gamma=0,
              learning_rate=0.1, max_delta_step=0, max_depth=3,
              min_child_weight=1, missing=None, n_estimators=100, n_jobs=1,
              nthread=None, objective='binary:logistic', random_state=0,
              reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
              silent=None, subsample=1, verbosity=1, **kwargs): 
        super().__init__(base_score=base_score, booster=booster, colsample_bylevel=colsample_bylevel,
              colsample_bynode=colsample_bynode, colsample_bytree=colsample_bytree, gamma=gamma,
              learning_rate=learning_rate, max_delta_step=max_delta_step, max_depth=max_depth,
              min_child_weight=min_child_weight, missing=missing, n_estimators=n_estimators, n_jobs=n_jobs,
              nthread=nthread, objective=objective, random_state=random_state,
              reg_alpha=reg_alpha, reg_lambda=reg_lambda, scale_pos_weight=scale_pos_weight, seed=seed,
              silent=silent, subsample=subsample, verbosity=verbosity, **kwargs)
        self.feature_names = None

    def fit(self, X, y=None):
        self.feature_names = list(X.columns)
        return super().fit(X, y)

    def get_feature_names(self):
        if not isinstance(self.feature_names, list):
            raise ValueError('Must fit data first!')
        else:
            return self.feature_names

    def get_feature_importances(self):
        return dict(zip(self.get_feature_names(), self.feature_importances_))
我试着只使用**kwargs,但没有成功

“不工作”是对问题最无用的描述。相反,您应该准确地记录发生了什么,以及所有相关的细节

也就是说,如果您的问题是如何避免重新键入完整的父方法签名等,那么实际上您与**kwargs非常接近,只是缺少位置args部分*args:

请注意,这使得签名对于检查pydoc、内置帮助功能、IDE自动完成等都没有用处


编辑:实际上,可能有一种方法-至少,根据,functools.wrapps可以保留修饰函数的签名。还有一个软件提供相同的服务,因此您应该能够重用此代码,以获得您的蛋糕和吃它-

谢谢。我已经更新了这个问题。基本上,解释器抱怨并没有设置所需的参数,但有趣的是,它适用于scikit learn的LogisticRegression,只做了一些小的更改:no*args。顺便说一句,我想要一个签名。@QuantChristo恐怕您添加的详细信息还不够-我们需要一个合适的签名来诊断这个问题。但是无论如何:如果你想使用任何依赖于检查的工具,你没有别的选择,至少我知道,除了维护父方法签名的完整副本。非常感谢Bruno的帮助。我需要检查。我将深入挖掘:我将检查init和元编程中的xgb.XGBClassifier.get_参数。如果我找到了解决方案,我会发布它。@QuantChristo看起来我的python-foo不是以前的样子-cf我编辑过的答案。
def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs)
    self.feature_names = None