Использование fit_params в конвейере neuraxle
Я хочу использовать классификатор, например
sklearn.linear_model.SGDClassifier
, в конвейере нервной оси и подогнать его в режиме онлайн с помощью
partial_fit
. У меня классификатор, завернутый вSKLearnWrapper
с участием
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
функции ступени в трубопроводе нервной оси?
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()
Дело в том, что вызовы для применения методов могут проходить через конвейеры и применяться ко всем вложенным шагам, если они содержат такие методы.