Использование fit_params в конвейере neuraxle

#machine-learning #scikit-learn #neuraxle

#машинное обучение #scikit-learn #neuraxle

Вопрос:

Я хочу использовать классификатор, например, the sklearn.linear_model.SGDClassifier , в конвейере neuraxle и использовать его в режиме онлайн partial_fit . У меня есть классификатор, завернутый в SKLearnWrapper with use_partial_fit=True , вот так:

 from neuraxle.pipeline import Pipeline
from neuraxle.steps.sklearn import SKLearnWrapper
from sklearn.linear_model import SGDClassifier

p = Pipeline([
    SKLearnWrapper(SGDClassifier(), use_partial_fit=True)
    ]
)

X = [[1.], [2.], [3.]]
y = ['class1', 'class2', 'class1']

p.fit(X, y)
  

Однако, чтобы классификатор соответствовал онлайн-моде, необходимо предоставить дополнительный аргумент classes partial_fit функции, который содержит возможные классы, встречающиеся в данных, например classes=['class1', 'class2'] , по крайней мере, при первом вызове. Таким образом, приведенный выше код приводит к ошибке:

 ValueError: classes must be passed on the first call to partial_fit.
  

Такая же проблема возникает и для других fit_params подобных sample_weight . В стандартном конвейере sklearn fit_params может быть передано отдельным шагам с помощью синтаксиса <имя шага> __<имя параметра>, например, для sample_weight параметра:

 from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline

q = Pipeline([
    ('clf', SGDClassifier())
])

q.fit(X, y, clf__sample_weight=[0.25, 0.5, 0.25])
  

Конечно, стандартный конвейер sklearn не позволяет вызывать partial_fit в классификаторе, поэтому я хочу использовать конвейер neuraxle в первую очередь.

Есть ли какой-либо способ передать дополнительные параметры функциям fit или partial_fit шага в конвейере neuraxle?

Ответ №1:

Я предлагаю вам отредактировать SKLearnWrapper, чтобы добавить аргументы к методу partial_fit, переопределив его, и добавить недостающие аргументы, которые вы хотели бы иметь.

Вы также можете добавить метод к этому разветвленному SKLearnWrapper следующим образом. Аргументы классов могут быть изменены с помощью метода apply, вызываемого позже извне конвейера.

 ConfigurablePartialSGDClassifier(SKLearnWrapper)

    def __init__(self):
        super().__init__(SGDClassifier(), use_partial_fit=True)

    def update_classes(self, classes: List[str]):
        self.classes = classes

    def _sklearn_fit_without_expected_outputs(self, data_inputs):
        self.wrapped_sklearn_predictor.partial_fit(data_inputs, classes=self.classes)
  

Затем вы можете сделать:

 p = Pipeline([
    ('clf', ConfigurablePartialSGDClassifier())
])

X1 = [[1.], [2.], [3.]]
X2 = [[4.], [5.], [6.]]
Y1 = [0, 1, 1]
Y2 = [1, 1, 0]
classes = ['class1', 'class2', 'class1']

p.apply("update_classes", classes)
p.fit(X1, Y1)
p.fit(X2, Y2)

  

Обратите внимание, что p это также могло быть просто определено таким образом, чтобы получить такое же поведение:

 p = ConfigurablePartialSGDClassifier()
  

Дело в том, что вызовы методов apply могут проходить через конвейеры и применяться ко всем вложенным шагам, если шаги содержат такие методы.