#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
.