Резюме поиска по сетке с помощью собственного оценщика sklearn на python

#python #search #grid #knn #imputation

#python #Поиск #сетка #knn #вменение

Вопрос:

Я пытаюсь создать свой собственный оценщик (регрессор) и использовать его для вменения (KnnImputation). У меня возникла проблема с использованием поиска по сетке «GridSearchCV». Есть идеи, в чем проблема?

Мой код:

 class KnnImputation(BaseEstimator, RegressorMixin):

    def __init__(self, k=5, distance='euclidean'):
        self.k = k
        self.distance = distance

    def get_params(self, deep=False):
        return {'k': self.k, 'distance': self.distance}

    def set_params(self, **parameters):
        self.k = parameters['k']
        self.distance = parameters['distance']

    def fit(self, X, y):

        self.xTrain = X.values
        self.yTrain = y.values

        return self

    def predict(self, X):
        ........

        return yPred

# scorer:
scorer = make_scorer(mean_squared_error)

kf = KFold(n_splits=10, shuffle=False, random_state=23)
NN = KnnImputation()
gridSearchNN = GridSearchCV(NN, param_grid=params, scoring=scorer, n_jobs=1,
                            cv=kf.split(xTrain, yTrain), verbose=1)
gridSearchNN.fit(X=xTrain, y=yTrain)
  

Моя ошибка:

 ....
  File "C:Users...........dataImputation.py", line 85, in knnImputationMethod
    gridSearchNN.fit(X=xTrain, y=yTrain)
  File "C:Users.....Anaconda3libsite-packagessklearnmodel_selection_search.py", line 740, in fit
    self.best_estimator_.fit(X, y, **fit_params)
AttributeError: 'NoneType' object has no attribute 'fit'
  

Комментарии:

1. Вы задаете два совершенно разных вопроса. Пожалуйста, отредактируйте свой вопрос, чтобы сосредоточиться на одной технической проблеме.

2. @gmds Я меняю заголовок, но это все еще одна проблема, поэтому это один вопрос..

3. Ваш вопрос, почему вы получаете эту ошибку или почему вы получаете печатное сообщение «более 60 раз»?

4. @gmds вопрос в том, «почему я получаю эту ошибку?»

Ответ №1:

Из sklearn исходного кода в sklearn.model_selection._search у нас есть следующий код в fit методе:

 if self.refit:
    self.best_estimator_ = clone(base_estimator).set_params(
        **self.best_params_)
    refit_start_time = time.time()
    if y is not None:
        self.best_estimator_.fit(X, y, **fit_params)
  

Здесь важна строка:

 self.best_estimator_ = clone(base_estimator).set_params(**self.best_params_)
  

Создается клон base_estimator объекта, который является только вашим KNNImputation классом. Затем для этого клонированного оценщика вызывается метод экземпляра set_params() . Затем переменная self.best_estimator указывает на возвращаемое значение set_params() .

В предоставленном вами коде у set_params() метода нет return инструкции, поэтому он возвращает None . Таким образом, вызов self.best_estimator_.fit() эквивалентен None.fit() , что явно не сработает. Вам нужно включить цепочку методов, вернув self внутри set_params() функции.

Соответствующий код будет:

 def set_params(self, **parameters):
    self.k = parameters['k']
    self.distance = parameters['distance']
    return self
  

TL; DR:

Вам нужно включить цепочку методов в set_params возврате self .