Post-在 scikit 学习管道中处理分类器输出

Post-process classifier output in scikit learn Pipeline

我在 scikit 中使用 Pipeline 学习将一些预处理与 OneClassSVM 组合在一起作为最终分类器。为了计算合理的指标,我需要一个 post-processing,它将 OneClassSVM 的 -1,1 输出转换为 0 和 1。是否有任何结构化的方法来添加这样的 post-processing Pipeline? 最终估算器后不能使用变形金刚。

我们开发了 PipeGraph,它是 Scikit-Learn Pipeline 的扩展,允许您获取中间数据,构建类似工作流的图表,特别是解决这个问题(请参阅 [=10= 画廊中的示例) ] )

您可以将 class sklearn.preprocessing.TransformedTargetRegressor 与您的 SVM class 作为回归器一起使用,并使用 inverse_func 参数在 class 之后转换您的标签化.

但是,由于 TransformedTargetRegressor 应该在拟合之前将您的标签转换为新的 space,并将预测的标签重新映射到原始 space,因此它需要一个标签数组在拟合之前进行变换,并且不接受空目标或 None 目标作为输入。因此,您需要为您的管道提供一个虚拟目标,这会使您的代码有点混乱。

示例:

import numpy as np
from sklearn.compose import TransformedTargetRegressor
from sklearn.svm import OneClassSVM
from sklearn.pipeline import Pipeline

X = np.random.random((10, 2))

regressor = OneClassSVM(gamma='auto')
svm = TransformedTargetRegressor(regressor=regressor,
    inverse_func=lambda x: (x+1)//2, # Function that remaps your labels
    check_inverse=False) # If not set to False, this code will generate an error since the provided inverse_func is not the inverse of the default func argument, which is the identity function

pipeline = Pipeline([
    ('svm', svm)
])

pipeline.fit(X, np.zeros((1,1))) # An array of fake label is provided to the pipeline
pipeline.predict(X)

输出:

array([[0],
       [1],
       [1],
       [1],
       [1],
       [0],
       [1],
       [0],
       [0],
       [0]])

请注意,如果您需要通过带有字典的 Pipeline 将参数传递给您的 OneClassSVM classifier,例如在使用 GridSearchCV 的网格搜索中,您需要将 regressor__ 添加到 svm__ 和参数名称之间的参数键名称中。例如,svm__kernel 变为 svm__regressor__kernel

还有 2 种方法可以考虑:

(1) 创建一个OneClassSVM 的包装分类器。在包装器分类器的预测函数中调用 OneClassSVM 的预测,并在 return 之前进行转换。分类器模板见下面的link: https://scikit-learn.org/stable/developers/develop.html

(2) 创建一个简单的分类器进行转换,然后使用 StackingClassifier 将 OneClassSVM 和简单的分类器链接在一起: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.StackingClassifier.html