Xg加强多标签分类?

use*_*023 15 python multilabel-classification xgboost

是否可以使用xgboost进行多标签分类?现在我使用OneVsRestClassifier而不是sklearn的GradientBoostingClassifier.它可以工作,但只使用我的CPU中的一个核心.在我的数据中,我有~45个功能,任务是用二进制(布尔)数据预测大约20列.度量标准是平均精度(map @ 7).如果你有一个简短的代码分享示例,那就太好了.

Ric*_*c S 10

一种可能的方法,而不是使用OneVsRestClassifierwhich 用于多类任务,是使用MultiOutputClassifierfromsklearn.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))
Run Code Online (Sandbox Code Playgroud)


小智 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))
Run Code Online (Sandbox Code Playgroud)

clf_multilabel将适合每一个类二元分类,它将使用在指定然而,许多核心params(仅供参考,您也可以指定n_jobsOneVsRestClassifier,但吃了更多的内存).

2.如果您首先通过k复制具有k正确标签的每个数据点来稍微按摩您的数据,您可以破解您更简单的多类问题.那时,只是

clf = XGBClassifier(**params)
clf.fit(train_data)
pred_proba = clf.predict_proba(test_data)
Run Code Online (Sandbox Code Playgroud)

获得每个类的分类余量/概率,并确定预测标签所需的阈值.请注意,此解决方案并不准确:如果产品有标签(1, 2, 3),则会为每个类人为地引入两个负样本.

  • 应该注意的是,如果您有很多标签,那么训练成本可能会非常昂贵,因为它为每个标签训练一个模型。我使用“xgboost.XGBClassifier”作为底层分类器,并且使用 5 倍交叉验证进行训练需要几个小时。@marco_ccc 谢谢你,这非常有帮助。 (2认同)