在预测中,我想使用output_margin = True做xgboost生存模型。但是,sklearn没有任何方法可以传递新参数来进行预测,但是确实有合适的方法。
所以我写了以下课程
class PredictWithOutputMargin:
def __init__(self, model):
self.model = model
def predict(self, X):
return self.model.predict(self, X, output_margin=True)
def fit(self, X, y, **kwargs):
return self.model.fit(X, y, **kwargs)
def get_params(self, deep = False):
return self.model.get_params(deep)
然后将其传递给
from sklearn.model_selection import cross_val_predict as cvp
model = PredictWithOutputMargin(model_instance)
cv_score = cvp(model, train_x, train_y, cv=cv, n_jobs=-1, method=method)
这里的方法是预测值,cv是5。
但是,当我运行代码时,出现以下错误。
TypeError: __init__() got an unexpected keyword argument 'base_score'
任何想法如何通过?
答案 0 :(得分:0)
最有可能的问题(在没有完整的错误转储的情况下,这只是一个猜测),问题出在sklearn中clone
的实现中。交叉验证功能to create copies of the input model and use those to spawn training in parallel threads使用此功能。 clone
的工作方式是,它从模型中检索所有参数,并使用这些参数创建相同类型的对象(请参见here)。因此,在您的情况下,它尝试调用PredictWithOutputMargin(parameters_of_sklearn_model)
,它确实与您的构造函数匹配。
我想,解决此特定问题的方法是在{'mode': self.model}
中返回PredictWithOutputMargin.get_params()
。但是我不知道这是否会在另一个阶段引起问题。