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
我在 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