Xg加强多标签分类?

时间:2016-12-01 17:33:33

标签: python xgboost multilabel-classification

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

3 个答案:

答案 0 :(得分:6)

有几种方法可以做到这一点,其中一种方法就是你已经建议过的方法:

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_jobs中指定OneVsRestClassifier,但这会占用更多的记忆。)

2。 如果您首先通过制作k个具有k正确标签的数据点的副本来稍微按下您的数据,那么您就可以解决更简单的多类问题。那时,只是

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

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

答案 1 :(得分: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,但仍可以预测许多标签。

答案 2 :(得分:1)

一种可能的方法,而不是使用用于多类任务的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))