【问题标题】:Using RandomizedSearchCV in Multi-label classification在多标签分类中使用 RandomizedSearchCV
【发布时间】:2020-10-21 04:05:59
【问题描述】:

我正在使用多标签探针并开始使用sklearn,它提供了非常好的开箱即用的方法来处理多标签。我使用MultiOutputClassifierRandomForestClassifier 作为估计器。具有 4 个类的示例:

import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.multioutput import MultiOutputClassifier

# The data from your screenshot
#  A      B   C    D    E   F    G
x = np.array([
  [133.5, 27, 284, 638, 31, 220],
  [111.9, 27, 285, 702, 36, 230],
  [99.3, 25, 310, 713, 39, 227],
  [102.5, 25, 311, 670, 34, 218]
])

y = np.array([[1, 0, 0, 1],
              [0, 1, 0, 0],
              [0, 0, 0, 1],
              [0, 0, 0, 1]])
forest = RandomForestClassifier(n_estimators=100)
classifier = MultiOutputClassifier(forest)
classifier.fit(x, y)

此代码为每个标签生成一个分类器(在这种情况下,我们将最终得到 4 个分类器)。我的问题是:

  1. 是否可以为每个标签传递不同的分类器(如果有使用 sklearn 的开箱即用实现)
  2. 我尝试将RandomizedSearchCV 直接应用于MultiOutputClassifier,但似乎在所有参数中只选择了一个模型,而不是为每个标签选择一个最佳模型。这样做的动机是什么?相同的模型参数用于不同的分类器?是否可以使用开箱即用的 MultiOutputClassifierRandomizedSearchCV 为每个标签获取最佳模型?

我也尝试了there 中的示例,但它仍然只返回一个最终分类器。

谢谢!

【问题讨论】:

    标签: python numpy machine-learning scikit-learn multilabel-classification


    【解决方案1】:

    您试图实现的目标超出了sklearn.multioutput 模块的目的。在其文档中它说:

    本模块中提供的估算器是元估算器:它们需要在其构造函数中提供基本估算器。 元估计器将单输出估计器扩展到多输出估计器

    在这里,最后一句话是回答您问题的相关内容。 scikit-learn 具有支持开箱即用的多标签问题的估计器,例如 KNeighborsClassifier (reference)。在这种情况下,您也只会得到一个估计器来预测 >1 个标签。

    sklearn.multioutput 模块的目的现在是扩展那些不支持多标签任务的估计器,例如SVC,以便它们提供相同的功能。这并不意味着提供几个具有不同超参数的估计器。这就是为什么您不能将这些元估计器用于您想要完成的任务。

    具体解决您的问题:

    1. 不,这(至少目前)在 scikit-learn 中的此模块或任何其他模块中是不可能的。

    2. 同样,不,因为这违背了sklearn.multioutput 模块的目的。在scikit-learn 中提供这样的功能也不会增加太多便利。如果您想为每个标签使用具有不同超参数的不同估计器,那么您必须单独进行。没有其他方法,任何元估计器都必须这样做。这可能是没有提供此功能的原因。

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2018-03-07
      • 2018-09-07
      • 1970-01-01
      • 2019-04-01
      • 2021-05-04
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多