在neuraxle管道中使用fit_params

时间:2020-10-22 12:53:00

标签: machine-learning scikit-learn neuraxle

我想使用分类器,例如sklearn.linear_model.SGDClassifier,在神经网络管道中,并使用partial_fit以在线方式进行拟合。我将分类器包裹在 SKLearnWrapperuse_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管道的原因。

有没有办法将其他参数传递给神经网络管道中某个步骤的fitpartial_fit函数?

1 个答案:

答案 0 :(得分:0)

我建议您编辑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方法的调用可以通过管道,并且如果所有嵌套步骤都包含此类方法,则这些调用将应用于所有嵌套步骤。