Как передать пользовательскую модель в cross_val_predict - PullRequest
0 голосов
/ 28 мая 2019

Я хочу создать модель выживания xgboost с output_margin = True в прогнозе.Тем не менее, у 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 голосов
/ 29 мая 2019

Скорее всего (при отсутствии полного дампа ошибок это только предположение) проблема заключается в реализации clone в sklearn. Эта функция используется функцией перекрестной проверки для создания копий входной модели и использования их для запуска обучения в параллельных потоках . Способ работы clone состоит в том, что он извлекает все параметры из модели и создает объект того же типа с этими параметрами (см. здесь ). Так что в вашем случае он пытается вызвать PredictWithOutputMargin(parameters_of_sklearn_model), что соответствует вашему конструктору.

Полагаю, способ преодолеть эту конкретную проблему - вернуть {'mode': self.model} в PredictWithOutputMargin.get_params(). Но я не знаю, вызовет ли это проблемы где-то на другом этапе.

...