我正在处理多标签问题,并开始使用sklearn
,它提供了非常好的开箱即用的方法来处理多标签问题。我使用了MultiOutputClassifier
,并以RandomForestClassifier
作为估计器。以下是一个包含4个类别的示例:
import numpy as npfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.multioutput import MultiOutputClassifier# 来自你截图的数据# A B C D E F Gx = 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个分类器)。我的问题是:
- 是否可以为每个标签传递不同的分类器(如果
sklearn
有这样的开箱即用实现的话) - 我尝试将
RandomizedSearchCV
直接应用于MultiOutputClassifier
,但似乎只有一个模型在所有参数中被选中,而不是为每个标签选择最佳模型。这背后的动机是什么?不同分类器使用相同的模型参数吗?是否可以使用开箱即用的MultiOutputClassifier
和RandomizedSearchCV
来获取每个标签的最佳模型?
我也尝试了这里的示例,但它仍然只返回一个最终分类器。
谢谢!
回答:
你试图实现的功能超出了sklearn.multioutput
模块的目的。在其文档中提到:
该模块提供的估计器是元估计器:它们需要在构造函数中提供一个基础估计器。元估计器将单输出估计器扩展为多输出估计器。
这里,最后一句是回答你问题的最相关部分。scikit-learn
有一些开箱即用支持多标签问题的估计器,比如KNeighborsClassifier
(参考)。在这种情况下,你也只会得到一个估计器来预测多个标签。
sklearn.multioutput
模块的目的是为了扩展那些不支持多标签任务的估计器,比如SVC
,使它们提供相同的功能。它并不是为了提供多个具有不同超参数的估计器。这就是为什么你不能使用这些元估计器来实现你想要的功能。
针对你的具体问题:
-
不,这(至少目前)在
scikit-learn
的这个或任何其他模块中都是不可能的。 -
同样,不行,因为这违背了
sklearn.multioutput
模块的目的。在scikit-learn
中提供这样的功能也不会增加太多便利。如果你想为每个标签使用具有不同超参数的不同估计器,那么你必须单独进行操作。没有其他方法,任何元估计器都必须这样做。这可能是为什么没有提供这种功能的原因。