多分类与多标签分类

multiclass与multilabel的区别

  • multiclass分类是指n取1
  • multilabel分类是指n取k

对于xgboost,如果想要做multiclass分类可以借助sklearn的 from sklearn.multiclass import OneVsRestClassifier 。想要做multilabel分类,可以借助sklearn的 from sklearn.multioutput import MultiOutputClassifier。举例如下:

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))

sigmoid与softmax, 多分类/多标签分类问题

结论

  1. 在实际应用中,一般将softmax用于多类分类的使用之中,而将sigmoid用于多标签分类之中。
  2. 对于二分类问题来说,理论上,两者是没有任何区别的。由于我们现在用的Pytorch、TensorFlow等框架计算矩阵方式的问题,导致两者在反向传播的过程中还是有区别的。实验结果表明,两者还是存在差异的,对于不同的分类模型,可能Sigmoid函数效果好,也可能是Softmax函数效果。

softmax激活函数应用于多类分类

使用softmax分类器完成多类分类问题,并将损失函数设置为 categorical_crossentropy 损失函数,softmax的主要作用其实是在计算交叉熵上,将logits转换成一个概率分布后再来计算,然后取概率分布中最大的作为最终的分类结果,这就是将softmax激活函数应用于多分类中。

sigmoid激活函数应用于多标签分类

sigmoid一般不用来做多类分类,而是用来做二分类。在多标签分类中,大多使用 binary_crossentropy 损失函数 。它是将一个标量数字转换到[0,1]之间,如果大于一个概率阈值(一般是0.5),则认为属于某个类别,否则不属于某个类别。
在这里强调一点:将sigmoid激活函数应用于多标签分类时,其损失函数应设置为 binary_crossentropy

posted @ 2021-01-07 23:14  理想几岁  阅读(825)  评论(0编辑  收藏  举报