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

Posted

技术标签:

【中文标题】在带有 OneVsRestClassifier 的 Neuraxle Pipeline 中使用 predict_proba() 代替 predict()【英文标题】:Using predict_proba() instead predict() in Neuraxle Pipeline with OneVsRestClassifier 【发布时间】:2020-11-01 02:34:57 【问题描述】:

我正在尝试设置一个使用 sklearns OneVsRestClassifier (OVR) 的 Neuraxle 管道

Neuraxle 管道中的每个有效步骤都必须实现 fit()transform() 方法。

为了使用 sklearns 管道步骤,Neuraxle 使用 SKLearnWrapper 将 OVR predict() 方法映射到 SKLearnWrapper 的 transform() 方法。

    有没有办法修改此行为,以便将 predict_proba() 方法映射到 OVR 的 transform() 方法?

    或者是否有其他方法可以检索计算出的概率?

【问题讨论】:

【参考方案1】:

很好的问题!

我们已经有办法解决这个问题了。

假设你编写一个这样的类:

class MyWrapper(BaseStep): 

    def transform(self, data_inputs): 
        return sigmoid(data_inputs)

    def predict_proba(self, data_inputs): 
        return data_inputs

你可以这样做:

step = MyWrapper()

然后,一旦你准备好替换方法,使用Neuraxle's mutate函数:

step = step.mutate(new_method='predict_proba', method_to_assign_to='transform')

然后,每当调用.transform() 时,都会调用predict_proba 方法。即使您的 step 在其他步骤中被包裹(嵌套)得更深,变异也会起作用。

请注意,我们可能应该修改 sklearn 包装器以允许这样做。我在这里添加了问题: https://github.com/Neuraxio/Neuraxle/issues/368

因此,在解决此问题之前,您可以执行 class MySKLearnWrapper(SKLearnWrapper): ...(继承自 SKLearnWrapper 以对其进行修改)并自行定义 predict_proba,就像这里建议的那样:https://github.com/Neuraxio/Neuraxle/pull/363/files

【讨论】:

以上是关于在带有 OneVsRestClassifier 的 Neuraxle Pipeline 中使用 predict_proba() 代替 predict()的主要内容,如果未能解决你的问题,请参考以下文章

带有 SVC 的 OneVsRestClassifier 和带有 decision_function_shape='ovr' 的 SVC 有啥区别?

OneVsRestClassifier 的损失函数

OneVsRestClassifier(svm.SVC()).predict() 给出连续值

如何在 scikit-learn 中为 OneVsRestClassifier 设置类权重?

使用 OneVsRestClassifier 时全为零

使用 OneVsRestClassifier 时如何传递 XGBoost 拟合参数?