Xg boost用于多标签分类?

2024-03-29 06:54:54 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以使用xgboost进行多标签分类?现在我使用onevsrestcrifier而不是sklearn中的gradientboostingcrifier。它可以工作,但只使用我的CPU的一个内核。在我的数据中,我有大约45个特征,任务是用二进制(布尔)数据预测大约20列。Metric是平均精度(map@7)。如果您有一个简短的代码示例可供共享,那就太好了。


Tags: 数据代码map二进制分类精度特征标签
2条回答

有两种方法可以做到这一点,其中一种是您已经建议的:

一。

from xgboost import XGBClassifier
from sklearn.multiclass import OneVsRestClassifier
# If you want to avoid the OneVsRestClassifier magic switch
# from sklearn.multioutput import MultiOutputClassifier

clf_multilabel = OneVsRestClassifier(XGBClassifier(**params))

clf_multilabel将为每个类提供一个二进制分类器,并且它将使用您在params中指定的任意多个核心(仅供参考,您也可以在OneVsRestClassifier中指定n_jobs,但这会占用更多内存)。

2。 如果您首先通过对每个具有正确标签的数据点进行k拷贝来稍微按摩数据,那么您可以破解一个更简单的多类问题。在那一点上,只是

clf = XGBClassifier(**params)
clf.fit(train_data)
pred_proba = clf.predict_proba(test_data)

获取每个类的分类边距/概率,并确定预测标签所需的阈值。 注意,这个解决方案并不精确:如果一个产品有标签(1, 2, 3),则为每个类人为地引入两个负样本。

您可以为要预测的每个类添加一个标签。 例如,如果这是您的数据:

X1 X2 X3 X4  Y1 Y2 Y3
 1  3  4  6   7  8  9
 2  5  5  5   5  3  2

您只需根据输出向输入添加一个标签,就可以重塑数据的形状,xgboost应该学习如何相应地处理它,如下所示:

X1 X2 X3 X3 X_label Y
 1  3  4  6   1     7
 1  3  4  6   1     5
 1  3  4  6   2     8
 2  5  5  5   2     3
 2  5  5  5   3     9
 2  5  5  5   3     2

这样你会得到一个一维的Y,但是你仍然可以预测许多标签。

相关问题 更多 >