在多标签分类中使用 RandomizedSearchCV
Using RandomizedSearchCV in Multi-label classification
我正在使用多标签 problem,我开始使用 sklearn
,它提供了非常好的开箱即用方法来处理多标签。我使用 MultiOutputClassifier
和 RandomForestClassifier
作为估算器。示例 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 个分类器)。我的问题是:
- 是否可以为每个标签传递不同的分类器(如果使用
sklearn
有任何开箱即用的实现)
- 我尝试将
RandomizedSearchCV
直接应用于 MultiOutputClassifier
,但似乎在所有参数中只选择了一个模型,而不是为每个标签选择一个最佳模型。这样做的动机是什么?相同的模型参数用于不同的分类器?是否可以使用开箱即用的 MultiOutputClassifier
和 RandomizedSearchCV
来获得每个标签的最佳模型?
我也尝试了 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
,以便它们提供相同的功能。它并不意味着提供多个具有不同超参数的估计器。这就是为什么你不能使用这些元估计来完成你想要完成的事情。
具体解决您的问题:
不,这(至少目前)无法通过此模块或 scikit-learn
中的任何其他模块实现。
同样,不,因为这违背了 sklearn.multioutput
模块的目的。在 scikit-learn
中提供这样的功能也不会增加太多便利。如果你想为每个标签使用不同的估计器和不同的超参数,那么你必须单独进行。没有其他办法,任何元估计器都必须这样做。这可能是不提供此功能的原因。
我正在使用多标签 problem,我开始使用 sklearn
,它提供了非常好的开箱即用方法来处理多标签。我使用 MultiOutputClassifier
和 RandomForestClassifier
作为估算器。示例 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 个分类器)。我的问题是:
- 是否可以为每个标签传递不同的分类器(如果使用
sklearn
有任何开箱即用的实现) - 我尝试将
RandomizedSearchCV
直接应用于MultiOutputClassifier
,但似乎在所有参数中只选择了一个模型,而不是为每个标签选择一个最佳模型。这样做的动机是什么?相同的模型参数用于不同的分类器?是否可以使用开箱即用的MultiOutputClassifier
和RandomizedSearchCV
来获得每个标签的最佳模型?
我也尝试了 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
,以便它们提供相同的功能。它并不意味着提供多个具有不同超参数的估计器。这就是为什么你不能使用这些元估计来完成你想要完成的事情。
具体解决您的问题:
不,这(至少目前)无法通过此模块或
scikit-learn
中的任何其他模块实现。同样,不,因为这违背了
sklearn.multioutput
模块的目的。在scikit-learn
中提供这样的功能也不会增加太多便利。如果你想为每个标签使用不同的估计器和不同的超参数,那么你必须单独进行。没有其他办法,任何元估计器都必须这样做。这可能是不提供此功能的原因。