在 neuraxle 管道中使用 fit_params

Posted

技术标签:

【中文标题】在 neuraxle 管道中使用 fit_params【英文标题】:Using fit_params in neuraxle pipeline 【发布时间】:2021-02-05 11:52:28 【问题描述】:

我想使用分类器,例如sklearn.linear_model.SGDClassifier,在 neuraxle 管道中,并使用 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)

但是,为了以在线方式拟合分类器,需要为 partial_fit 函数提供一个附加参数 classes,其中包含数据中可能出现的类,例如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 管道。

有没有办法将附加参数传递给 neuraxle 管道中步骤的 fitpartial_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()

问题是,对应用方法的调用可以通过管道传递,并且如果步骤包含此类方法,则应用于所有嵌套步骤。

【讨论】:

以上是关于在 neuraxle 管道中使用 fit_params的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地处理 Neuraxle 管道中的错误和/或丢失数据?

如何正确实现过滤 data_inputs 的 Neuraxle 管道步骤?

如何使用 neuraxle 实现延迟数据加载的存储库?

Neuraxle 中的默认超参数值

在带有 OneVsRestClassifier 的 Neuraxle Pipeline 中使用 predict_proba() 代替 predict()

是否可以将多个管道组合到 Neuraxle 或 sklearn 中的单个估计器中以创建多输出分类器并一次性适应