如何在cross_val_predict中传递自定义模型

时间:2019-05-28 15:59:25

标签: python scikit-learn xgboost

在预测中,我想使用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'

任何想法如何通过?

1 个答案:

答案 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()。但是我不知道这是否会在另一个阶段引起问题。