Python 如何在继承期间避免init中的代码重复?扩展xgb.XGBClassifier以处理要素名称
我在扩展xgb.XGBClassifier类时遇到了具体问题,但它可以作为一般的OOP问题来构建 我的实施基于: 基本上,当提供的数据在DataFrame中时,我希望添加特性名称处理 几句话: XGBClassifierN在_init__uu中具有与基类xgb.XGBClassifier相同的参数, 还有一个附加属性self.feature\u names,由后面的fit方法设置。 其余的可以通过混合来完成。 它起作用了 让我烦恼的是,这堵代码墙在初始化。它是通过复制粘贴默认值完成的,每次xgb.Classifier发生更改时,它都必须更新 是否有任何方法可以简洁地表达这样一种想法:子类XGBClassifierN具有与父类xgb.XGBClassifier相同的参数和默认值,并执行后续操作,如clf=XGBClassifierN_jobs=-1 我试着只使用**kwargs,但没有成功,解释器开始抱怨没有缺少参数,没有双关语意图,并且为了使它基本上可以工作,您需要设置更多的参数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
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