在 neuraxle 管道中使用 fit_params
Using fit_params in neuraxle pipeline
我想使用分类器,例如sklearn.linear_model.SGDClassifier
,在 neuraxle 管道中,并使用 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)
但是,为了使分类器适应在线方式,需要为 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 管道中步骤的 fit
或 partial_fit
函数?
我建议您编辑 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()
事实是,如果步骤包含此类方法,对应用方法的调用可以通过管道并应用于所有嵌套步骤。
我想使用分类器,例如sklearn.linear_model.SGDClassifier
,在 neuraxle 管道中,并使用 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)
但是,为了使分类器适应在线方式,需要为 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 管道中步骤的 fit
或 partial_fit
函数?
我建议您编辑 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()
事实是,如果步骤包含此类方法,对应用方法的调用可以通过管道并应用于所有嵌套步骤。