XGBoost用于多标签分类?

问题描述 投票:17回答:3

是否可以使用XGBoost进行多标签分类?现在我使用 OneVsRestClassifier 在...上 GradientBoostingClassifiersklearn. 它的工作原理,但只使用我的CPU的一个核心。在我的数据中,我有大约45个特征,任务是用二进制(布尔)数据预测大约20列。衡量标准是平均精度(map@7)。如果你有一个简短的代码例子来分享,那将是巨大的。

python scikit-learn xgboost multilabel-classification
3个回答
7
投票

有几个方法可以做到这一点,其中一个是你已经建议的方法。

1.

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 (fyi, 你也可以指定 n_jobsOneVsRestClassifier,但这样会占用更多的内存)。)

2.如果你先对你的数据进行一下按摩,使之成为 k 的每一个数据点的副本。k 正确的标签,你可以用黑客的方式来解决一个更简单的多类问题。在这一点上,只要

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

来获得每个类别的分类余量sprobabilities,并决定你想要的预测标签的阈值.注意,这个解决方案并不精确:如果一个产品的标签是 (1, 2, 3),你为每个类人为地引入两个负样本。


2
投票

你可以给每个你想预测的类添加一个标签。例如如果这是你的数据。

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
 2  5  5  5   1     5
 1  3  4  6   2     8
 2  5  5  5   2     3
 1  3  4  6   3     9
 2  5  5  5   3     2

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


0
投票

一种可能的方法是,不使用 OneVsRestClassifier 是针对多类任务的,就是使用 MultiOutputClassifier 来自 sklearn.multioutput 模块。

下面是一个小的可复制的示例代码,其中包含OP所要求的输入特征和目标输出的数量。

import xgboost as xgb
from sklearn.datasets import make_multilabel_classification
from sklearn.model_selection import train_test_split
from sklearn.multioutput import MultiOutputClassifier
from sklearn.metrics import accuracy_score

# create sample dataset
X, y = make_multilabel_classification(n_samples=3000, n_features=45, n_classes=20, n_labels=1,
                                      allow_unlabeled=False, random_state=42)

# split dataset into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

# create XGBoost instance with default hyper-parameters
xgb_estimator = xgb.XGBClassifier(objective='binary:logistic')

# create MultiOutputClassifier instance with XGBoost model inside
multilabel_model = MultiOutputClassifier(xgb_estimator)

# fit the model
multilabel_model.fit(X_train, y_train)

# evaluate on test data
print('Accuracy on test data: {:.1f}%'.format(accuracy_score(y_test, multilabel_model.predict(X_test))*100))
© www.soinside.com 2019 - 2024. All rights reserved.