我想使用分类器,例如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
函数?
答案 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方法的调用可以通过管道,并且如果所有嵌套步骤都包含此类方法,则这些调用将应用于所有嵌套步骤。