在多标签分类中使用 RandomizedSearchCV

Using RandomizedSearchCV in Multi-label classification

我正在使用多标签 problem,我开始使用 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 中的示例,但它仍然 return 只有一个最终分类器。

谢谢!

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

The estimators provided in this module are meta-estimators: they require a base estimator to be provided in their constructor. The meta-estimator extends single output estimators to multioutput estimators.

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

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

具体解决您的问题:

  1. 不,这(至少目前)无法通过此模块或 scikit-learn 中的任何其他模块实现。

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