Параметры не собираются для пользовательской оценки в scikit-learn GridSearchCV - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь и не могу передать параметры в пользовательский оценщик в scikit learn. Я бы хотел, чтобы параметр lr изменился во время поиска по сетке. Проблема в том, что параметр lr не меняется ...

Пример кода копируется и обновляется с здесь

(оригинальный код не работал для меня)

Будет приветствоваться любой полный рабочий пример GridSearchCV с пользовательским оценщиком, с изменением параметров.

Я нахожусь в ubuntu 18.10, используя scikit-learn 0,20,2

from sklearn.model_selection import GridSearchCV
from sklearn.base import BaseEstimator, ClassifierMixin
import numpy as np

class MyClassifier(BaseEstimator, ClassifierMixin):

     def __init__(self, lr=0.1):
         # Some code
         print('lr:', lr)
         return self

     def fit(self, X, y):
         # Some code
         return self

     def predict(self, X):
         # Some code
         return X % 3

params = {
    'lr': [0.1, 0.5, 0.7]
}
gs = GridSearchCV(MyClassifier(), param_grid=params, cv=4)

x = np.arange(30)
y = np.concatenate((np.zeros(10), np.ones(10), np.ones(10) * 2))
gs.fit(x, y)

Тервейзин, Маркус

1 Ответ

0 голосов
/ 28 марта 2019

Вы не смогли увидеть изменение значения lr, так как вы печатаете внутри функции конструктора.

Если мы печатаем внутри функции .fit(), мы можем увидеть изменение значений lr.Это происходит из-за того, что way создаются разные копии оценщиков.См. здесь , чтобы понять процесс создания нескольких копий.

from sklearn.model_selection import GridSearchCV
from sklearn.base import BaseEstimator, ClassifierMixin
import numpy as np

class MyClassifier(BaseEstimator, ClassifierMixin):

    def __init__(self, lr=0):
         # Some code
        print('lr:', lr)
        self.lr = lr

    def fit(self, X, y):
         # Some code
        print('lr:', self.lr)
        return self

    def predict(self, X):
         # Some code
         return X % 3

params = {
    'lr': [0.1, 0.5, 0.7]
}
gs = GridSearchCV(MyClassifier(), param_grid=params, cv=4)

x = np.arange(30)
y = np.concatenate((np.zeros(10), np.ones(10), np.ones(10) * 2))
gs.fit(x, y)
gs.predict(x)

Выход:

lr: 0
lr: 0
lr: 0
lr: 0.1
lr: 0
lr: 0.1
lr: 0
lr: 0.1
lr: 0
lr: 0.1
lr: 0
lr: 0.5
lr: 0
lr: 0.5
lr: 0
lr: 0.5
lr: 0
lr: 0.5
lr: 0
lr: 0.7
lr: 0
lr: 0.7
lr: 0
lr: 0.7
lr: 0
lr: 0.7
lr: 0
lr: 0.1
...