是否可以使用XGBoost进行多标签分类?现在我使用 OneVsRestClassifier
在...上 GradientBoostingClassifier
从 sklearn
. 它的工作原理,但只使用我的CPU的一个核心。在我的数据中,我有大约45个特征,任务是用二进制(布尔)数据预测大约20列。衡量标准是平均精度(map@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_jobs
在 OneVsRestClassifier
,但这样会占用更多的内存)。)
2.如果你先对你的数据进行一下按摩,使之成为 k
的每一个数据点的副本。k
正确的标签,你可以用黑客的方式来解决一个更简单的多类问题。在这一点上,只要
clf = XGBClassifier(**params)
clf.fit(train_data)
pred_proba = clf.predict_proba(test_data)
来获得每个类别的分类余量sprobabilities,并决定你想要的预测标签的阈值.注意,这个解决方案并不精确:如果一个产品的标签是 (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
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
,但你仍然可以预测许多标签。
一种可能的方法是,不使用 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))