精华内容
下载资源
问答
  • 深度学习---标签分类问题

    万次阅读 多人点赞 2018-05-06 11:18:10
    由于本项目既涉及multi-class(分类),也涉及multi-label(标记分类)的部分,multi-class分类网上已经很相关的文章了。这里就说一说multi-label的搭建网络的部分。之后如果时间的时候,再说一说...

    补充:

    (1)、Guide To Multi-Class Multi-Label Classification With Neural Networks In Python

    (2)、多标签分类(multilabel classification )

    1、使用caffe训练一个多标签分类/回归模型

    2、keras解决多标签分类问题

    3、keras: multi-label神经网络

    前沿

    本篇记录一下自己项目中用到的keras相关的部分。由于本项目既有涉及multi-class(多类分类),也有涉及multi-label(多标记分类)的部分,multi-class分类网上已经很多相关的文章了。这里就说一说multi-label的搭建网络的部分。之后如果有时间的时候,再说一说cross validation(交叉验证)和在epoch的callback函数中处理一些多标签度量metric的问题。

    multi-label多标记监督学习

    其实我个人比较喜欢把label翻译为标签。那可能学术上翻译multi-label多翻译为多标记。其实和多标签一个意思。

    multi-class 和 multi-label的区别

    multi-class是相对于binary二分类来说的,意思是需要分类的东西不止有两个类别,可能是3个类别取一个(如iris分类),或者是10个类别取一个(如手写数字识别mnist)。

    而multi-label是更加general的一种情况了,它说为什么一个sample的标签只能有1个呢。为什么一张图片不是猫就是狗呢?难道我不能训练一个人工智能,它能告诉我这张图片既有猫又有狗呢?

    其实关于多标签学习的研究,已经有很多成果了。 
    主要解法是 
    * 不扩展基础分类器的本来算法,只通过转换原始问题来解决多标签问题。如BR, LP等。 
    * 扩展基础分类器的本来算法来适配多标签问题。如ML-kNN, BP-MLL等。 
    这里不展开了。有兴趣的同学可以自己去研究一下。

    keras的multi-label

    废话不多说,直接上代码。这里假设大家是有keras的基础知识的,所以关键代码之外的代码请大家自行脑补。

    def __create_model(self):
        from keras.models import Sequential
        from keras.layers import Dense
        model = Sequential()
        print("create model. feature_dim = %s, label_dim = %s" % (self.feature_dim, self.label_dim))
        model.add(Dense(500, activation='relu', input_dim=self.feature_dim))
        model.add(Dense(100, activation='relu'))
        model.add(Dense(self.label_dim, activation='sigmoid'))
        model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
        return model

    稍微解说一下: 
    * 整个网络是fully connected全连接网络。 
    * 网络结构是输入层=你的特征的维度 
    * 隐藏层是500*100,激励函数都是relu。隐藏层的节点数量和深度请根据自己的数量来自行调整,这里只是举例。 
    * 输出层是你的label的维度。使用sigmoid作为激励,使输出值介于0-1之间。 
    * 训练数据的label请用0和1的向量来表示。0代表这条数据没有这个位的label,1代表这条数据有这个位的label。假设3个label的向量[天空,人,大海]的向量值是[1,1,0]的编码的意思是这张图片有天空,有人,但是没有大海。 
    * 使用binary_crossentropy来进行损失函数的评价,从而在训练过程中不断降低交叉商。实际变相的使1的label的节点的输出值更靠近1,0的label的节点的输出值更靠近0。

    结语

    有了这个结构,就可以run起来一个multi label的神经网络了。这个只是基础中的基础,关于multi-label的度量代码才是我们研究一个机器学习问题的核心。


    4、解决多标签分类问题(包括案例研究)


    一、

    由于某些原因,回归和分类问题总会引起机器学习领域的大部分关注。多标签分类在数据科学中是一个比较令人头疼的问题。在这篇文章中,我将给你一个直观的解释,说明什么是多标签分类,以及如何解决这个问题。

    1.多标签分类是什么?

    让我们来看看下面的图片。

    如果我问你这幅图中有一栋房子,你会怎样回答? 选项为“Yes”或“No”。

    或者这样问,所有的东西(或标签)与这幅图有什么关系?

    在这些类型的问题中,我们有一组目标变量,被称为多标签分类问题。那么,这两种情况有什么不同吗? 很明显,有很大的不同,因为在第二种情况下,任何图像都可能包含不同图像的多个不同的标签。

    但在深入讲解多标签之前,我想解释一下它与多分类问题有何不同,让我们试着去理解这两组问题的不同之处。

    2.多标签vs多分类

    用一个例子来理解这两者之间的区别。

    对于任何一部电影,电影的中央委员会会根据电影的内容颁发证书。例如,如果你看上面的图片,这部电影被评为“UA”(意思是“12岁以下儿童需在父母陪同下观看”)。还有其他类型的证书类,如“A”(仅限于成人)或“U”(不受限制的公开放映),但可以肯定的是,每部电影只能在这三种类型的证书中进行分类。简而言之,有多个类别,但每个实例只分配一个,因此这些问题被称为多类分类问题。

    同时,你回顾一下这张图片,这部电影被归类为喜剧和浪漫类型。但不同的是,这一次,每部电影都有可能被分成一个或多个不同的类别。

    所以每个实例都可以使用多个类别进行分配。因此,这些类型的问题被称为多标签分类问题。

    现在你应该可以区分多标签和多分类问题了。那么,让我们开始处理多标签这种类型的问题。

    3.加载和生成多标签数据集

    Scikit-learn提供了一个独立的库scikit-multilearn,用于多种标签分类。为了更好的理解,让我们开始在一个多标签的数据集上进行练习。scikit-multilearn库地址:http://scikit.ml/api/datasets.html

    你可以从MULAN package提供的存储库中找到实际的数据集。这些数据集以ARFF格式呈现。存储库地址:http://mulan.sourceforge.net/datasets-mlc.html

    因此,为了开始使用这些数据集,请查看下面的Python代码,将其加载到你的计算机上。在这里,我已经从存储库中下载了酵母(yeast)数据集。

    import scipy
    from scipy.io import arff
    data, meta = scipy.io.arff.loadarff('/Users/shubhamjain/Documents/yeast/yeast-train.arff')
    df = pd.DataFrame(data)

    这就是数据集的样子。

    在这里,Att表示属性或独立变量,class表示目标变量。

    出于实践目的,我们有另一个选项来生成一个人工的多标签数据集。

    from sklearn.datasets import make_multilabel_classification
    
    # this will generate a random multi-label dataset
    X, y = make_multilabel_classification(sparse = True, n_labels = 20,
    return_indicator = 'sparse', allow_unlabeled = False)

    让我们了解一下上面所使用的参数。

    sparse(稀疏):如果是True,返回一个稀疏矩阵,稀疏矩阵表示一个有大量零元素的矩阵。

    n_labels:每个实例的标签的平均数量。

    return_indicator:“sparse”在稀疏的二进制指示器格式中返回Y。

    allow_unlabeled:如果是True,有些实例可能不属于任何类。

    你一定会注意到,我们到处都使用了稀疏矩阵,而scikit-multilearn也建议使用稀疏格式的数据,因为在实际数据集中非常罕见。一般来说,分配给每个实例的标签的数量要少得多。

    好了,现在我们已经准备好了数据集,让我们快速学习解决多标签问题的技术。

    4.解决多标签分类问题的技术

    基本上,有三种方法来解决一个多标签分类问题,即:

    1. 问题转换
    2. 改编算法
    3. 集成方法

    4.1问题转换

    在这个方法中,我们将尝试把多标签问题转换为单标签问题。这种方法可以用三种不同的方式进行:

    1. 二元关联(Binary Relevance)
    2. 分类器链(Classifier Chains)
    3. 标签Powerset(Label Powerset)

    4.4.1二元关联(Binary Relevance)

    这是最简单的技术,它基本上把每个标签当作单独的一个类分类问题。例如,让我们考虑如下所示的一个案例。我们有这样的数据集,X是独立的特征,Y是目标变量。

    在二元关联中,这个问题被分解成4个不同的类分类问题,如下图所示。

    我们不需要手动操作,multi-learn库在python中提供了它的实现。那么,让我们看看它在随机生成的数据上的实现。

    # using binary relevance
    from skmultilearn.problem_transform import BinaryRelevance
    from sklearn.naive_bayes import GaussianNB
    
    # initialize binary relevance multi-label classifier
    # with a gaussian naive bayes base classifier
    classifier = BinaryRelevance(GaussianNB())
    
    # train
    classifier.fit(X_train, y_train)
    
    # predict
    predictions = classifier.predict(X_test)

    注意:在这里,我们使用了Naive Bayes的算法,你也可以使用任何其他的分类算法。

    现在,在一个多标签分类问题中,我们不能简单地用我们的标准来计算我们的预测的准确性。所以,我们将使用accuracy score。这个函数计算子集的精度,这意味着预测的标签集应该与真正的标签集完全匹配。

    那么,让我们计算一下预测的准确性。

    from sklearn.metrics import accuracy_score
    accuracy_score(y_test,predictions)
    0.45454545454545453

    我们的准确率达到了45%,还不算太糟。它是最简单和有效的方法,但是这种方法的惟一缺点是它不考虑标签的相关性,因为它单独处理每个目标变量。

    4.1.2分类器链(Classifier Chains)

    在这种情况下,第一个分类器只在输入数据上进行训练,然后每个分类器都在输入空间和链上的所有之前的分类器上进行训练。
    让我们试着通过一个例子来理解这个问题。在下面给出的数据集里,我们将X作为输入空间,而Y作为标签。

    在分类器链中,这个问题将被转换成4个不同的标签问题,就像下面所示。黄色部分是输入空间,白色部分代表目标变量。

    这与二元关联非常相似,唯一的区别在于它是为了保持标签相关性而形成的。那么,让我们尝试使用multi-learn库来实现它。

    # using classifier chains
    from skmultilearn.problem_transform import ClassifierChain
    from sklearn.naive_bayes import GaussianNB
    
    # initialize classifier chains multi-label classifier
    # with a gaussian naive bayes base classifier
    classifier = ClassifierChain(GaussianNB())
    
    # train
    classifier.fit(X_train, y_train)
    
    # predict
    predictions = classifier.predict(X_test)
    
    accuracy_score(y_test,predictions)
    0.21212121212121213

    我们可以看到,使用这个我们得到了21%的准确率,这比二元关联要低得多。可能是因为没有标签相关性,因为我们已经随机生成了数据。

    4.1.3标签Powerset(Label Powerset)

    在这方面,我们将问题转化为一个多类问题,一个多类分类器在训练数据中发现的所有唯一的标签组合上被训练。让我们通过一个例子来理解它。

    在这一点上,我们发现x1和x4有相同的标签。同样的,x3和x6有相同的标签。因此,标签powerset将这个问题转换为一个单一的多类问题,如下所示。

    因此,标签powerset给训练集中的每一个可能的标签组合提供了一个独特的类。让我们看看它在Python中的实现。

    # using Label Powerset
    from skmultilearn.problem_transform import LabelPowerset
    from sklearn.naive_bayes import GaussianNB
    
    # initialize Label Powerset multi-label classifier
    # with a gaussian naive bayes base classifier
    classifier = LabelPowerset(GaussianNB())
    
    # train
    classifier.fit(X_train, y_train)
    
    # predict
    predictions = classifier.predict(X_test)
    
    accuracy_score(y_test,predictions)
    0.5757575757575758

    这使我们在之前讨论过的三个问题中得到了最高的准确性,57%。唯一的缺点是随着训练数据的增加,类的数量也会增加。因此,增加了模型的复杂性,并降低了精确度。

    现在,让我们看一下解决多标签分类问题的第二种方法。

    4.2改编算法

    改编算法来直接执行多标签分类,而不是将问题转化为不同的问题子集。例如,kNN的多标签版本是由MLkNN表示的。那么,让我们快速地在我们的随机生成的数据集上实现这个。

    from skmultilearn.adapt import MLkNN
    
    classifier = MLkNN(k=20)
    
    # train
    classifier.fit(X_train, y_train)
    
    # predict
    predictions = classifier.predict(X_test)
    
    accuracy_score(y_test,predictions)
    0.69

    很好,你的测试数据已经达到了69%的准确率。

    在一些算法中,例如随机森林(Random Forest)和岭回归(Ridge regression),Sci-kit learn提供了多标签分类的内置支持。因此,你可以直接调用它们并预测输出。

    如果你想了解更多关于其他类型的改编算法,你可以查看multi-learn库。地址:http://scikit.ml/api/api/skmultilearn.adapt.html#module-skmultilearn.adapt

    4.3集成方法

    集成总是能产生更好的效果。Scikit-Multilearn库提供不同的组合分类功能,你可以使用它来获得更好的结果。

    对于直接实现,你可以查看:http://scikit.ml/api/classify.html#ensemble-approaches

    5.案例研究

    在现实世界中,多标签分类问题非常普遍。所以,来看看我们能在哪些领域找到它们。

    5.1音频分类

    我们知道歌曲会被分类为不同的流派。他们也被分类为,如“放松的平静”,或“悲伤的孤独”等等情感或情绪的基础。

    来源:http://lpis.csd.auth.gr/publications/tsoumakas-ismir08.pdf

    5.2图像分类

    使用图像的多标签分类也有广泛的应用。图像可以被标记为不同的对象、人或概念。

    5.3生物信息学

    多标签分类在生物信息学领域有很多用途,例如,在酵母数据集中的基因分类。它还被用来使用几个未标记的蛋白质来预测蛋白质的多重功能。

    5.4文本分类

    谷歌新闻所做的是,将每条新闻都标记为一个或多个类别,这样它就会显示在不同的类别之下。
    例如,看看下面的图片。

    图片来源:https://news.google.com/news/headlines/section/topic/TECHNOLOGY.en_in/Technology?ned=in&hl=en-IN

    同样的新闻出现在“Technology”,“Latest” 等类别中,因为它已经被分类为不同的标签。从而使其成为一个多标签分类问题。

     

    二、

    多标记分类和传统的分类问题相比较,主要难点在于以下两个方面

    (1)类标数量不确定,有些样本可能只有一个类标,有些样本的类标可能高达几十甚至上百个。

    (2)类标之间相互依赖,例如包含蓝天类标的样本很大概率上包含白云,如何解决类标之间的依赖性问题也是一大难点。

    对于多标记学习领域的研究,国外起步较早,起源于2000年Schapire R E等人提出的基于boost方法的文本多分类,著名的学者有G Tsoumakas、Eyke Hüllermeier、Jesse Read,Saso Dzeroski等等。在国内,南京大学的周志华和张敏灵和哈工大的叶允明等等学者在这一领域较都有很好研究成果。

    目前有很多关于多标签的学习算法,依据解决问题的角度,这些算法可以分为两大类:一是基于问题转化(Problem Transformation)的方法,二是基于算法适应的方法和算法适应方法(Algorithm Adaptation)。基于问题转化的多标记分类是转化问题数据,使之适用现有算法;基于算法适应的方法是指针对某一特定的算法进行扩展,从而能够直接处理多标记数据,改进算法,适应数据。基于这两种思想,目前已经有多种相对成熟的算法被提出,如下图所示:



    问题转化方法(Problem Transformation):该类方法的基本思想是通过对多标记训练样本进行处理,将多标记学习问题转换为其它已知的学习问题进行求解。代表性学习算法LP[[1]],Binary Relevance[[2]],Calibrated Label Ranking[[3]], Random k-labelsets[[4]]。总体来说,这类方法有考虑类标之间的联系,但是对于类标较多、数据量较大的数据集,这类方法的计算复杂度是一个很明显的缺陷。

    算法适应方法与问题转化方法不同,问题转化方法是将多标记问题转化成一个或者多个单类标问题,算法适应方法是在多标记的基础上研究算法。近年来,用于多标记的算法适应的算法越来越多,代表性学习算法ML-kNN[[5]],Rank-SVM[[6]],LEAD[[7]],CML。

    对于分类策略,基于考察标记之间相关性的不同方式,已有的多标记学习算法的策略思路大致可以分为以下三类[[8]]:

    a) “一阶(first-order)”策略:该类策略通过逐一考察单个标记而忽略标记之间的相关性,如将多标记学习问题分解为个独立的二类分类问题,从而构造多标记学习系统。该类方法效率较高且实现简单,但由于其完全忽略标记之间可能存在的相关性,其系统的泛化性能往往较低。

    b) “二阶(second-order)”策略:该类策略通过考察两两标记之间的相关性,如相关标记与无关标记之间的排序关系,两两标记之间的交互关系等等,从而构造多标记学习系统。该类方法由于在一定程度上考察了标记之间的相关性,因此其系统泛化性能较优。

    c) “高阶(high-order)”策略:该类策略通过考察高阶的标记相关性,如处理任一标记对其它所有标记的影响,处理一组随机标记集合的相关性等等,从而构造多标记学习系统。该类方法虽然可以较好地反映真实世界问题的标记相关性,但其模型复杂度往往过高,难以处理大规模学习问题。

    [[1]] Madjarov G, Kocev D, Gjorgjevikj D, et al. An extensive experimental comparison of methods for multi-label learning[J]. Pattern Recognition, 2012, 45(9): 3084-3104.


    [[2]] Boutell M R, Luo J, Shen X, Brown C M. Learning multi-label scene classification. Pattern Recognition, 2004, 37(9): 1757-1771.


    [[3]] Fürnkranz J, Hüllermeier E, Loza Mencía E, Brinker K. Multilabel classification via calibrated label ranking. Machine Learning, 2008, 73(2): 133-153.


    [[4]] Tsoumakas G, Vlahavas I. Random k-labelsets: An ensemble method for multilabel classification. In: Kok J N, Koronacki J, de Mantaras R L, Matwin S, Mladenič D, Skowron A, eds. Lecture Notes in Artificial Intelligence 4701, Berlin: Springer, 2007, 406-417.


    [[5]] Zhang M-L, Zhou Z-H. ML-kNN: A lazy learning approach to multi-label learning. Pattern Recognition, 2007, 40(7): 2038-2048.


    [[6]] Elisseeff A, Weston J. A kernel method for multi-labelled classification. In: Dietterich T G, Becker S, Ghahramani Z, eds. Advances in Neural Information Processing Systems 14 (NIPS’01), Cambridge, MA: MIT Press, 2002, 681-687.


    [[7]] Zhang M-L, Zhang K. Multi-label learning by exploiting label dependency. In: Pro ceedings of the 16th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD’10), Washington, D. C., 2010, 999-1007.


    [[8]] Zhang M L, Zhang K. Multi-label learning by exploiting label dependency[C]// ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 2010:999-1008.





    展开全文
  • 二分类和多分类问题的评价指标总结

    万次阅读 多人点赞 2019-07-09 18:51:55
    评价分类问题的性能指标一般是分类准确率,即对于给定的数据,分类正确的样本数占总样本数的比例。 注意:准确率这一指标在Unbalanced数据集上的表现很差,因为如果我们的正负样本数目差别很大,比如正样本100个,负...

    1 二分类评价指标

    准确率,精确率,召回率,F1-Score, AUC, ROC, P-R曲线

    1.1 准确率(Accuracy)

    评价分类问题的性能指标一般是分类准确率,即对于给定的数据,分类正确的样本数占总样本数的比例
    注意:准确率这一指标在Unbalanced数据集上的表现很差,因为如果我们的正负样本数目差别很大,比如正样本100个,负样本9900个,那么直接把所有的样本都预测为负, 准确率为99%,但是此分类模型实际性能是非常差的,因为它把所有正样本都分错了。

    1.2 精确率(Precision)

    对于二分类问题常用的评价指标是精确率和召回率。通常以关注的类为正类,其他类为负类,分类器在数据集上的预测或者正确或者不正确,我们有4中情况:

    • TP:True Positive, 把正类预测为正类;
    • FP:False Positive,把负类预测为正类;
    • TN:True Negative, 把负类预测为负类;
    • FN:False Negative,把正类预测为负类

    在混淆矩阵中表示如下:
    在这里插入图片描述
    精确率是指在预测为正类的样本中真正类所占的比例,直观上来解释精确率就是说
    我现在有了这么的预测为正的样本,那么这些样本中有多少是真的为正呢?

      P = TP/(TP+FP)
    

    1.3 查全率(召回率 Recall)

    召回率是指在所有的正类中被预测为正类的比例,直观上来说召回率表示我现在预测为正的这些值中,占了所有的为正的样本的多大比例呢?

    R = TP/(TP+FN)
    

    不同的分类问题,对精确率和召回率的要求也不同。
    例如:假币预测,就需要很高的精确率,我需要你给我的预测数据具有很高的准确性。
    肿瘤预测就需要很高的召回率。“宁可错杀三千,不可放过一个”。

    1.4 F1-Score

    F1-Score: 精确率和召回率的调和平均。 即:

    2/F1 = 1/P + 1/R
    F1=2P*R/(P+R)
    

    因为Precision和Recall是一对相互矛盾的量,当P高时,R往往相对较低,当R高时, P往往相对较低,所以为了更好的评价分类器的性能,一般使用F1-Score作为评价标准来衡量分类器的综合性能。

    1.5 ROC曲线和AUC

    TPR:True Positive Rate,真正率, TPR代表能将正例分对的概率

    TPR=TP/TP+FN
    

    FPR: False Positive Rate, 假正率, FPR代表将负例错分为正例的概率

    FPR=FP/FP+TN
    

    使用FPR作为横坐标,TPR作为纵坐标得到ROC曲线如下
    在这里插入图片描述
    ROC曲线中的四个点和一条线

    • (0,1): FN = 0, FP = 0, 表示所有样本都正确分类,这是一个完美的分类器;

    • (1,0):TN = 0, TP = 0, 表示所有样本都分类错误,这是一个最糟糕的分类器;

    • (0, 0): FP = 0, TP = 0, 表示所有样本都分类为负

    • (1,1): TN = 0, FN = 0, 表示左右样本都分类为正

    经过以上分析,ROC曲线越靠近左上角,该分类器的性能越好。
    上图虚线与 y = x,该对角线实际上表示一个随机猜测的分类器的结果。

    ROC曲线画法:在二分类问题中,我们最终得到的数据是对每一个样本估计其为正的概率值(Score),我们根据每个样本为正的概率大小从大到小排序,然后按照概率从高到低,一次将“Score”值作为阈值threshold,当测试样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。每次选取一个不同的threshold,就可以得到一组FPR和TPR,即ROC曲线上的一点。

    AUC:(Area Under roc CurveROC)曲线下的面积,引入AUC的原因是量化评价指标。
    AUC的面积越大,分类效果越好。AUC小于1,另一方面,正常的分类器你应该比随机猜测效果要好吧?所以 0.5 <= AUC <= 1

    AUC表征了分类器把正样本排在负样本前边的能力。这里的意思其实是指数据按照其为正的概率从大到小排序之后,正样本排在负样本前边的能力。AUC越大,就有越多的正样本排在负样本前边。极端来看,如果ROC的(0, 1)点,所有的正样本都排在负样本的前边。

    1.6 ROC 与 P, R对比

    **ROC曲线特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。**在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。)
    下图是ROC曲线和Precision-Recall曲线的对比:
    在这里插入图片描述
    a,c为ROC曲线,b,d为P-R曲线;
    a,b 为在原始测试集(balanced)上的结果,c,d为把原始数据集的负样本增加10倍后的结果。很明显,ROC曲线基本保持不变,P-R曲线变化较大。

    为什么取AUC较好?因为一个二分类问题,如果你取P或R的话,那么你的评价结果和你阈值的选取关系很大,但是我这个一个分类器定了,我希望评价指标是和你取得阈值无关的,也就是需要做与阈值无关的处理。所以AUC较P-R好

    from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
    acc = accuracy_score(y_true, y_pred)
    

    2 多分类评价指标

    对于二分类问题,我们有很多评价指标,因为只有正类和负类两种,往往我们只关心正类的准确率和召回率。但是对于多分类问题,有些二分类的评价标准就不怎么适用了。最近实习涉及到多分类,在模型评价指标选取费了不少时间,对于常用的多分类评价指标进行整理以便日后使用。一种方法是将多分类问题转化为多个2vs2问题进行讨论,步骤比较复杂。还有一种是直接定义的多分类指标。

    2.1 多分类转化为2vs2问题来评价

    准确率:与二分类相同,预测正确的样本占总样本的比例。
    精确率: ‘macro’, 对于每个标签,分别计算Precision,然后取不加权平均
    查全率: ‘macro’,对于每个标签,分别计算Recall,然后取不加权平均
    F1-Score‘macro’, 对于每个标签,分别计算发,然后取不加权平均
    ‘micro’, 将n个二分类评价的TP,FP,FN对应相加,计算P和R,然后求得F1
    一般macro-f1和micro-f1都高的分类器性能好

    2.2 直接定义的多分类指标

    2.2.1Kappa系数

    kappa系数是用在统计学中评估一致性的一种方法,取值范围是[-1,1],实际应用中,一般是[0,1],与ROC曲线中一般不会出现下凸形曲线的原理类似。这个系数的值越高,则代表模型实现的分类准确度越高。
    在这里插入图片描述

    • P0表示总体分类精度
    • Pe表示SUM(第i类真实样本数*第i类预测出来的样本数)/样本总数平方
      在这里插入图片描述
    from sklearn.metrics import cohen_kappa_score
    kappa = cohen_kappa_score(y_true,y_pred,label=None) #(label除非是你想计算其中的分类子集的kappa系数,否则不需要设置)
    
    
    2.2.2. 海明距离

    海明距离也适用于多分类的问题,简单来说就是衡量预测标签与真实标签之间的距离,取值在0~1之间。距离为0说明预测结果与真实结果完全相同,距离为1就说明模型与我们想要的结果完全就是背道而驰。

    from sklearn.metrics import hamming_loss
    ham_distance = hamming_loss(y_true,y_pred)
    
    2.2.3.杰卡德相似系数

    它与海明距离的不同之处在于分母。当预测结果与实际情况完全相符时,系数为1;当预测结果与实际情况完全不符时,系数为0;当预测结果是实际情况的真子集或真超集时,距离介于0到1之间。
    我们可以通过对所有样本的预测情况求平均得到算法在测试集上的总体表现情况。

    from sklearn.metrics import jaccard_similarity_score
    jaccrd_score = jaccrd_similarity_score(y_true,y_pred,normalize = default)
    
    #normalize默认为true,这是计算的是多个类别的相似系数的平均值,normalize = false时分别计算各个类别的相似系数
    
    2.2.4.铰链损失

    铰链损失(Hinge loss)一般用来使“边缘最大化”(maximal margin)。损失取值在0~1之间,当取值为0,表示多分类模型分类完全准确,取值为1表明完全不起作用。

    from sklearn.metrics import hinge_loss
    hinger = hinger_loss(y_true,y_pred)
    

    参考文档:https://www.cnblogs.com/futurehau/p/6109772.html
    https://www.jianshu.com/p/573ba75aec94

    展开全文
  • XGBoost解决多分类问题

    万次阅读 2016-09-03 19:25:19
    XGBoost解决多分类问题

    XGBoost解决多分类问题

    写在前面的话

        XGBoost官方给的二分类问题的例子是区别蘑菇有无毒,数据集和代码都可以在xgboost中的demo文件夹对应找到,我是用的Anaconda安装的XGBoost,实现起来比较容易。唯一的梗就是在终端中运行所给命令:  ../../xgboost mushroom.conf 时会报错,是路径设置的问题,所以我干脆把xgboost文件夹下的xgboost.exe拷到了mushroom.conf配置文件所在文件夹下,这样直接定位到该文件夹下就可以运行: xgboost mushroom.conf。二分类数据预处理,也就是data wraggling部分的代码有一定的借鉴意义,值得一看。
        多分类问题给的例子是根据34个特征识别6种皮肤病,由于终端中运行runexp.sh没有反应,也不报错,所以我干脆把数据集下载到对应的demo文件夹下了,主要的代码如下,原来有部分比较难懂的语句我自己加了一些注释,这样理解起来就会顺畅多了。

    #! /usr/bin/python
    import numpy as np
    import xgboost as xgb
    
    # label need to be 0 to num_class -1
    # if col 33 is '?' let it be 1 else 0, col 34 substract 1
    data = np.loadtxt('./dermatology.data', delimiter=',',converters={33: lambda x:int(x == '?'), 34: lambda x:int(x)-1 } )
    sz = data.shape
    
    train = data[:int(sz[0] * 0.7), :] # take row 1-256 as training set
    test = data[int(sz[0] * 0.7):, :]  # take row 257-366 as testing set
    
    train_X = train[:,0:33]
    train_Y = train[:, 34]
    
    
    test_X = test[:,0:33]
    test_Y = test[:, 34]
    
    xg_train = xgb.DMatrix( train_X, label=train_Y)
    xg_test = xgb.DMatrix(test_X, label=test_Y)
    # setup parameters for xgboost
    param = {}
    # use softmax multi-class classification
    param['objective'] = 'multi:softmax'
    # scale weight of positive examples
    param['eta'] = 0.1
    param['max_depth'] = 6
    param['silent'] = 1
    param['nthread'] = 4
    param['num_class'] = 6
    
    watchlist = [ (xg_train,'train'), (xg_test, 'test') ]
    num_round = 5
    bst = xgb.train(param, xg_train, num_round, watchlist );
    # get prediction
    pred = bst.predict( xg_test );
    
    print ('predicting, classification error=%f' % (sum( int(pred[i]) != test_Y[i] for i in range(len(test_Y))) / float(len(test_Y)) ))
    
    # do the same thing again, but output probabilities
    param['objective'] = 'multi:softprob'
    bst = xgb.train(param, xg_train, num_round, watchlist );
    # Note: this convention has been changed since xgboost-unity
    # get prediction, this is in 1D array, need reshape to (ndata, nclass)
    yprob = bst.predict( xg_test ).reshape( test_Y.shape[0], 6 )
    ylabel = np.argmax(yprob, axis=1)  # return the index of the biggest pro
    
    print ('predicting, classification error=%f' % (sum( int(ylabel[i]) != test_Y[i] for i in range(len(test_Y))) / float(len(test_Y)) ))
    

        结果如下:
    [0]	train-merror:0.011719	test-merror:0.127273
    [1]	train-merror:0.015625	test-merror:0.127273
    [2]	train-merror:0.011719	test-merror:0.109091
    [3]	train-merror:0.007812	test-merror:0.081818
    [4]	train-merror:0.007812	test-merror:0.090909
    predicting, classification error=0.090909
    [0]	train-merror:0.011719	test-merror:0.127273
    [1]	train-merror:0.015625	test-merror:0.127273
    [2]	train-merror:0.011719	test-merror:0.109091
    [3]	train-merror:0.007812	test-merror:0.081818
    [4]	train-merror:0.007812	test-merror:0.090909
    predicting, classification error=0.090909
        
        不管是直接返回诊断类型,还是返回各类型的概率,然后取概率最大的那个对应的类型的index,结果都是一样的。

    结语

        强烈建议大家使用python notebook来实现代码,当有不明白的代码时看一下执行后的结果能帮助我们很快理解。同时要感叹一下, 看大神们的代码感觉好牛X,对我这个XGBoost paper看过两遍还没能完全领略算法精髓的人来说只能拿来主义了,希望后面有机会去读一读算法源码。


    展开全文
  • 关于少量数据的多分类问题

    千次阅读 2018-08-27 21:10:18
     原始数据可以从链接中下载,是一关于某项疾病的分类问题,表格中最后一列为标签,前面的278列是各项特征指标。其中标签为1 的为为患病样本,标签为2——15的为确定的患病的样本,标签为16的为不确定的患病样本。...

    问题陈述和分析

         原始数据可以从链接中下载,是一关于某项疾病的分类问题,表格中最后一列为标签,前面的278列是各项特征指标。其中标签为1 的为为患病样本,标签为2——15的为确定的患病的样本,标签为16的为不确定的患病样本。标签中缺少11、12、13的样本。对于这类问题首先想到的就是传统的机器学习方法SVM,再比较新颖的是lasso还有xgboost等方法。对于SVM分类器直接将特征送入模型中,用不超过70% 的数据训练,用剩余的数据进行测试。对于xgboost可以直接进行处理。对于lasso,可以用于特征降维与特征选择,将选择后的特征送入xgboost进行学习。整个工程代码和数据在这里

    SVM 三分类

            因为从患病和不患病的角度看,这其实就是一个二分类问题,但是考虑到还有一种不确定的心脏病类型,问题可以看成一个三分类问题。首先将数据集分成训练集和测试集,其中训练集的样本数量为310个,测试集的样本数量为142个。

    在数据处理的时候将空值置为0,将label放在数据的第一列,并保存为csv格式文件。训练集文件名为data_two_test.csv,测试集文件为data_two_test.csv。

    训练过程与测试结果

            整个框架是在tensorflow下进行的,训练和测试被我写在一个工程里,命名为svm_3_c权值文件保存在model1_1里。Batch设为100,迭代次数也是100。Optimizer是梯度下降法。

    在迭代100次后学习到的结果如下:

     

    测试仍然是每次取100组数据进行测试,取10次最后取平均值。考虑其稳定性继续做了四次测试,测试精度在0.9附近。可以认为三分类有较高的精度。

    虽然三分类具有较高的精度,但是这并不是我们想得到的结果。想象病人得知自己得了某种确定的疾病,但是还不知道是哪一种确定的疾病,无论是心情还是对于整个治疗都没有什么帮助。但是三分类对于医生做进一步的诊断提供了有效且高精度的参考,如果患者得了某种确定的疾病,仍需人工的介入才能得到准确的诊断。

    Xgboost + Lasso六分类

    虑到xgboost的良好表现试着采用xgboost进行多分类。xgboost的数据需要进行预处理。还有一点就是标签不平衡问题,为了解决这个问题,又进行了六分类。六分类主要是考虑到不确定的心脏病类型仅有22个样本,所以我对确定的心脏病类型的185个样本重新分组得到六分类的结果。

     

    训练过程与测试结果

    xgboost的相关实验做了四组。第一组实验是源数据在无特征降维与选择下的实验,第二组是在lasso二分类标签下特征选择后再进行分类,第三组是在lasso三分类标签下特征选择后再进行分类,第四组是lasso六分类标签下特征选择后再进行实验。这几个实验分别在test_exp1、test_exp2、test_exp3、test_exp4文件夹中。

    在第二组实验中,使用特征从279维降到25维准确率比没有使用特征选择时降低了。第三组实验中特征从279维降到30维,准确率有所提高。第四组实验将特征维度降低到36维,准确率已经比没有降低特征维度要高。所以使用特征选择可以有效的提升分类的准确度。

    SVM 十三分类

    由特征降维和特征选择能有效改善分类结果的启示,我又将这279个特征进行了特征排序,排序用的是ensemble里的随机森林回归。在此基础上对svm分类器进行优化。

    由于每个score是一个三维向量,我的操作是求得平均值后在进行指数操作,底数是100000,这个数没有任何含义,只是为了将每个特征得分很好的区分开。这样操作的结果使这279个特征的得分变换范围变成0.27-4.13之间。得分最高的特征是‘V2 R wave amplitude’特征,得分最低的是‘Height’特征。

    这个小节的实验将分成两个部分,一个是没有进行特征选择的svm分类器,一个是进行特征选择的svm分类器。

    训练过程与测试结果

    实验一

    不进行特征选的svm13分类器的训练类似三分类,仍然在tensorflow框架下迭代100次,这里选择100次是因为实验室电脑比较老的原因。在编程实现要注意几个维度的变化即可。

    测试结果准确率分别是0.86100006、0.796、0.88500005、0.80200005。

    实验二

    只提取得分前名的20个特征进行分类,同样迭代100次,做四次得到训练结果如下图所示。只提取得分前名的20个特征进行分类,同样迭代100次,做四次得到训练结果如下图所示。

    测试结果分别为0.8549999、0.8809999、0.82、0.857。个人感觉对比不明显,我将迭代次数从100升至1000。没有进行特征选择,做了两组实验结果分别为0.897、0.866。进行了特征选择的结果分别是0.916、0.896我将迭代次数上升至10000次,没有进行特征选择的测试精度分别为0.872、0.77,进行了特征选择的0.878、0.866。

    总结

            整个实验的实现以及完成是在不断学习和改进的过程中进行的。从前期模型论证,到特征工程是不断的实验论证,改代码的过程。尤其是最近实验室换电脑来回折腾耽搁了很多工作,思路也从svm转移到了xgboost,还有laasso。

            之所以从xgboost又回到svm是因为做了一些实验发现精度很难提高,尤其是在svm还保持比较高的精度的前提下,xgboost的精度仍然在0.6左右徘徊时,毅然放弃了使用xgboost方法。

             后来想了想,有一个原因非常重要,就是数据集不够大。传统的svm方法在针对小数据集类问题表现非常好,而xgboost相关方法从2014年开始在各大数据挖掘类比赛中表现抢眼,一个关键问题就是,比赛中的数据集基本上都是百万级别的,所以精度不高是情有可原的。

    展开全文
  • 新闻分类:多分类问题

    千次阅读 2018-09-13 21:25:54
    因为多个类别,且每个数据点只能划分到一个类别,所以是单标签、多分类问题 准备数据 首先,加载数据 from keras.datasets import reuters (train_data, train_labels), (test_data, test_labels)...
  • 【火炉炼AI】机器学习010-用朴素贝叶斯分类器解决多分类问题 【本文所使用的Python库和版本号】: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2   前面讲到了使用逻辑回归分类器解决多分类问题...
  • 多分类问题评价指标

    千次阅读 2019-09-02 15:26:39
    而针对多分类问题来说,有些二分类的评价准则就相对而言不怎么适用了。虽然可以将多分类问题转化为多个2vs2问题进行讨论,步骤繁杂的同时效果也得不到保障。目前在进行多模态的一个分类研究,在模型评价时也废了不少...
  • 机器学习中的多分类问题

    千次阅读 2018-11-19 07:15:55
    相信大家对于二分类问题已经了切实地理解了。特别是,对于最普遍使用的二分类学习算法——逻辑回归,从模型到代价函数,再到梯度下降,都应该很清楚了。 不过在现实生活中,我们面对的分类问题肯定不只二分类。...
  • 二分类器解决多分类问题

    千次阅读 2019-05-14 16:38:20
    假设一共1,2,3,4,5个类别的数据 对于第1类,训练一个分类器:第1类是正样本,其余类的样本都是负样本 对于第2类,训练一个分类器:第2类是正样本,其余类的样本都是负样本 以此类推,一共训练出五个分类器 在...
  • 在机器学习中经常将多分类问题处理成二分类问题,给出三种以上的拆分策略 1) 一对一(One vs. One, 简称OvO) OvO将N个类别两两配对,从而产生N(N-1)/2个二分类任务。在测试阶段,新样本将同时提交给所有分类器,...
  • LSTM处理多分类问题

    万次阅读 2019-06-03 14:54:13
    最近由于项目需求,尝试各种模型实现多分类。 # coding=gbk import numpy as np import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split data = pd.read_csv('data/...
  • 二分类、多分类与多标签的基本概念 二分类:表示分类任务中两个类别,比如我们想识别一幅图片是不是猫。也就是说,训练一个分类器,输入一幅图片,用特征向量x表示,输出是不是猫,用y=0或1表示。二类分类是假设...
  • 使用监督学习的问题可以被分为两类:回归问题和分类问题。 2回归问题和分类问题 回归问题:如果我们预测的结果是以连续数字进行表示,即我们将在连续函数中对个输入变量建立映射关系时,则这样的问题称之为...
  • 支持向量机SVM—实现多分类问题的解决方案前言一、支持向量机SVM如何应用在多分类问题中?二、解决方案1.引入库2.读入数据3.读入数据4.读入数据总结 前言 众所周知,支持向量机SVM是机器学习中典型的二值分类算法。...
  • 目录 1. 二分类评价指标 ...2分类问题的混淆矩阵是2*2的,通常以关注的类为正类,另一个类为负类,分类器在数据集上的预测或者正确或者不正确,我们4种情况: 1)TP:True Positive,实际为正类并预测为正...
  • 解决多标签多分类中损失函数选择及样本不均衡问题的2个帖子 https://cloud.tencent.com/developer/ask/226097 https://discuss.pytorch.org/t/multi-label-multi-class-class-imbalance/37573 主要弄明白 nn....
  • SVM如何解决多分类问题

    千次阅读 2015-08-07 14:41:27
    从 SVM的那几张图可以看出来,SVM是一种典型的两类分类器,即它只回答属于正类还是负类的问题。而现实中要解决的问题... 还以文本分类为例,现成的方法,其中一种一劳永逸的方法,就是真的一次性考虑所有样本,
  • 分类问题

    千次阅读 2018-08-03 20:10:19
    (1)如果用回归函数去做分类,当数据不是线性的,会有问题。 (2)怎么解决呢? 将非线性转为线性(这也是逻辑回归的本质)。 (3)如何转呢? 施加函数。 (4)施加什么函数? 施加logistic函数(由于图形...
  • 分类问题的交叉熵损失函数; 在二分类问题中,损失函数为交叉熵损失函数。对于样本(x,y)来讲,x为样本 y为对应的标签。在二分类问题中,其取值的集合可能为{0,1},我们假设某个样本的真实标签为yt,该...多分类...
  • 把问题转化为一个或个单目标分类问题,或是回归问题。2)算法适应。修改学习算法使得能直接处理multilabel的数据。问题转化方法 dubbed PTx法。包括PT1 对有多标签的数据随机选取一个标签 PT2 直接把标签数大于1...
  • 补充:(1)、Guide To Multi-Class Multi-Label Classification With Neural Networks In Python(2)、标签分类(multilabel classification )1、使用caffe训练一个标签分类/回归模型2、keras解决...
  • SVM解决多分类问题的方法 SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要两类:一类是直接法,直接在目标函数上进行修改,将多个分类面...
  • 怎么将二分类模型应用到多分类问题 二分类模型数量众多,但实际应用中往往待预测类别数量不只2个,于是了一些将二分类模型应用到多分类的方法。 常见二分类模型 One-vs-Rest One-vs-One Directed Acyclic ...
  • 本人理解:多分类变成多个二分类,比如说当前类别A,训练集的标签为属于A的为1,其他为0,该值为连续值(概率),基于这所有的样本生成一棵树;结果为对类别A的预测值f(x);然后B标签,C标签同理可得;然后通过...
  • 标签分类问题

    万次阅读 2017-03-28 17:39:25
    把问题转化为一个或个单目标分类问题,或是回归问题。 2)算法适应。修改学习算法使得能直接处理multilabel的数据。 问题转化方法 dubbed PTx法。包括 PT1 对有多标签的数据随机选取一个...
  • 多分类问题的交叉熵计算

    千次阅读 2018-07-27 06:36:58
    多分类问题的交叉熵   在多分类问题中,损失函数(loss function)为交叉熵(cross entropy)损失函数。对于样本点(x,y)来说,y是真实的标签,在多分类问题中,其取值只可能为标签集合labels. 我们假设K个标签值...
  • sklearn 随机森林(Random Forest)多分类问题

    千次阅读 热门讨论 2020-12-17 16:33:43
    重要的参数分类器的个数(n_estimators)、特征选择算法(critirion)、单个决策树的最大深度(max_depth)等。 预处理 import pandas as pd path = "../Data/classify.csv" rawdata = pd.read_csv(path) X = raw...
  • 机器学习中多分类问题解决思路

    千次阅读 2018-07-01 22:16:40
    机器学习中如何应对多分类问题,一般我们只知道二分类问题比较好弄,很多算法在书上都是以二分类问题介绍原理。对于多分类的情况该怎么办呢?在这里我举一个有趣例子来阐述思路。案例:对于一个汽车的好坏评价,总共...
  • 常用的分类问题中的损失函数

    万次阅读 2019-04-20 12:43:26
    在监督式机器学习中,无论是回归问题还是分类问题,都少不了使用损失函数(Loss Function)。**损失函数(Loss Function)**是用来估量模型的预测值 f(x) 与真实值 y 的不一致程度。若损失函数很小,表明机器学习...
  • 机器学习多分类(一对多)问题

    千次阅读 2019-05-13 00:35:53
    直接上图,分三类!...巧妙地转化为了三个二分类问题,将会得到3个分类器 从前面我们可以知道,其实得到的函数值返回就是是正类的概率,三个分类器得到3个概率,最大的那个对应的那类则是答案 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 900,760
精华内容 360,304
关键字:

有什么问题是多分类问题