Реализуйте пользовательский метод .fit () для модели в конвейере sklearn - PullRequest
1 голос
/ 19 апреля 2019

Я использую несколько конвейеров для сравнения при перекрестной проверке.В качестве эталонной модели я хочу включить простую модель, которая использует всегда один и тот же фиксированный коэффициент и, следовательно, не зависит от данных обучения.Чтобы получить желаемую модель, я решил унаследовать все поведение линейной модели sklearns и реализовать собственный метод .fit (), который фактически не смотрит на данные поезда, но всегда использует хранимую модель.

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

Создание моей простой модели эталонного теста и ее сохранение.:

import numpy as np
import pickle
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline

X = np.array([[1],[2],[3]])
y = [10,20,30]

model = LinearRegression(fit_intercept=False).fit(X,y)
pickle.dump(model, open('benchmark_model.txt', 'wb'))
print (model.coef_)

[10.]

Определение моего собственного benchmark_model (), который реализует метод пользовательской подгонки.Метод подбора открывает сохраненную модель

class benchmark_model(LinearRegression):
      def fit(self, X, y = None):
            self = pickle.load(open('benchmark_model.txt', 'rb')) 
            return self

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

X=np.array([[1],[2],[3]])
y=[5,10,15]

model = benchmark_model()
model = model.fit(X,y)

print (model.coef_)
print (model.predict(X))

[10.] [10.20. 30.]

Теперь я сначала использую обычную LinearRegression в качестве части конвейера, которая, кажется, идет как ожидалось:

pipe = Pipeline([('model',LinearRegression())])
pipe.fit(X,y).predict(X)

array ([5., 10., 15.])

Однако, когда я использую свою пользовательскую модель эталонного теста как часть конвейера, она больше не работает.

pipe = Pipeline([('model',benchmark_model())])
pipe.fit(X,y).predict(X)

NotFittedError: Этот экземпляр benchmark_model еще не установлен.Вызовите «fit» с соответствующими аргументами перед использованием этого метода.

1 Ответ

1 голос
/ 19 апреля 2019

Я предполагаю, что конвейер запутывается, когда benchmark_model.fit() возвращает экземпляр класса LinearRegression вместо benchmark_model.Кажется, это работает, если вместо этого мы просто копируем изученные параметры из фиксированной модели:

class benchmark_model(LinearRegression):
    def fit(self, X, y = None):
        fixed_model = pickle.load(open('benchmark_model.txt', 'rb')) 
        self.coef_ = fixed_model.coef_
        self.intercept_ = fixed_model.intercept_
        return self

Теперь fit фактически возвращает экземпляр benchmark_model.

...