机器学习领域四种类型的分类任务辨析与概述

摘要:

      分类任务是解决各种应用问题的方式。实践中,我们常用机器学习算法将现实问题归纳为分类任务进行解决,一个简单易懂的问题归纳例子就是垃圾邮件的识别问题,解决时常将电子邮件分类为“ 垃圾邮件 ”或“ 非垃圾邮件”。那么算法建模及问题解决应如何从问题域中归纳分类任务类型,且每种分类任务类型都可能会使用专门的建模方法。这都将影响问题的最后解决。面临样本的不同分类标签,如何识别此类问题是何种分类任务变得尤为重要。

      分类任务大致分为四个不同类型:二分类任务、多分类任务、多标签分类任务、样本不均衡分类任务

 

目录

摘要:

分类问题归纳及建模概述:

二分类任务(Binary classification task)

多分类任务(Multi-Class Classification)

多标签分类任务(multi-label classification)

样本不平衡分类任务(Imbalanced Classification)

总结:

分类问题归纳及建模概述:

      在机器学习任务的解决中,分类就是对将要预测的事情进行建模的过程,针对给定输入数据预测了类别标签。

       常见的分类问题有:

       1.判断电子邮件是否为垃圾邮件。
       2.给定一个手写字符,判断是否是已知字符。
       3.根据网站最近的用户行为特征,判断是否流失。
      从建模的角度来看,分类需要训练数据集,其中包含许多可供模型学习的输入和输出。模型将使用训练数据集,计算如何将输入数据的特征最佳映射到特定的类别标签。因此,训练集必须足够具有代表性,并具有每个类别标签需有许多样本。类别标签通常是字符串值,例如“ 是 ”,“ 否 ”,并且在输入给算法模型之前必须将其映射为数值。这就是我们通常所说的映射为one-hot标签,其中为每个类别标签分配一个唯一的整数,例如“ 否 ” = 0,“ 是 ” = 1。有许多不同类型的分类算法可应用于对分类问题的解决。关于如何将分类模型(算法)映射到问题的解决上,目前没有特定的方法或者理论。取而代之的是给定的分类任务,我们通过尝试不同算法去寻找最优的解决该分类问题的模型,所以该问题域常出科研论文。分类问题常用的评价标准为准确率(acc),当然除此之外还有Precision、Recall、F1-Score、Micro-F1、Macro-F1、ROC、AUC等。针对不同类型的分类任务,常使用不同的评价指标,那么分类问题到底可以分为几种不同类型的分类任务呢?

二分类任务(Binary classification task)


      二分类任务是指具有两个类别标签分类任务。

   例如:

      垃圾邮件检测(是否为垃圾邮件)。
      客户流失预测(是否流失)。
      客户购买欲预测(购买或不购买)。
      通常,二分类任务涉及一个属于正常状态的类和另一个属于异常状态的类。例如,“ 非垃圾邮件 ”是正常状态,而“ 垃圾邮件 ”是异常状态。另一个示例是“ 未检测到癌症 ”是涉及医学检查的任务的正常状态,而“ 检测到癌症 ”是异常状态。正常状态的类别分配为类别标签0,状态异常的类别分配为类别标签1。通常使用预测每个示例的伯努利概率分布的模型来对二进制分类任务进行建模。伯努利分布是离散的概率分布,它涵盖了事件的二进制结果为0或1的情况。对于分类,这意味着模型预测了示例属于正常类或异常状态的概率(输出通过概率判断类别) 。常用于解决二分类问题的算法包括:逻辑回归、k邻居、决策树、支持向量机、朴素贝叶斯等。有些算法是专为二分类任务设计的,例如逻辑回归和支持向量机等(通过修改当然可以用于解决多标签分类)。二分类任务的代码示例:

# example of binary classification task
from numpy import where
from collections import Counter
from sklearn.datasets import make_blobs#数据生成器
from matplotlib import pyplot
# define dataset
X, y = make_blobs(n_samples=1000, centers=2, random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize observations by class label
counter = Counter(y)
print(counter)
# summarize first few examples
for i in range(10):
	print(X[i], y[i])
# plot the dataset and color the by class label
for label, _ in counter.items():
	row_ix = where(y == label)[0]
	pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label))
pyplot.legend()
pyplot.show()

#构造数据的输出示例:
(1000, 2) (1000,)

Counter({0: 500, 1: 500})

[-3.05837272  4.48825769] 0
[-8.60973869 -3.72714879] 1
[1.37129721 5.23107449] 0
[-9.33917563 -2.9544469 ] 1
[-11.57178593  -3.85275513] 1
[-11.42257341  -4.85679127] 1
[-10.44518578  -3.76476563] 1
[-10.44603561  -3.26065964] 1
[-0.61947075  3.48804983] 0
[-10.91115591  -4.5772537 ] 1

上述示例解释的二分类任务的样本标签输出:

多(类别)分类任务(Multi-Class Classification)

    多类别分类是指具有两个以上类别标签的分类任务。

     示例包括:

      人脸识别分类。
       植物种类分类。
      手写数字识别分类。
      与二分类不同,多类别分类没有正常和异常结果的概念。相反,示例被分类为属于一系列已知类别中的一个。在某些问题上,类标签的数量可能非常大。例如,模型可以预测照片属于面部识别系统中的数千个或数万个面部的某一个类别。涉及预测单词序列的问题,例如文本翻译模型,也可以视为一种特殊类型的多类分类。要预测的单词序列中的每个单词都涉及一个多类分类,其中词汇的大小定义了可以预测的可能类的数量,其大小可能是成千上万个单词。通常使用预测每个示例的Multinoulli概率分布的模型来对多类分类任务进行建模。所述Multinoulli分布是覆盖的情况下的事件将有一个明确的结果,例如离散概率分布ķ在{1,2,3,...,ķ }。对于分类,这意味着模型可以预测示例属于每个类别标签的概率。用于二进制分类的许多算法可以用于多分类。可用于多类分类的流行算法包括:k邻居、决策树。随机森林等;设计用于二分类的算法同样可以适用于多分类问题。

# example of multi-class classification task
from numpy import where
from collections import Counter
from sklearn.datasets import make_blobs
from matplotlib import pyplot
# define dataset
X, y = make_blobs(n_samples=1000, centers=3, random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize observations by class label
counter = Counter(y)
print(counter)
# summarize first few examples
for i in range(10):
	print(X[i], y[i])
# plot the dataset and color the by class label
for label, _ in counter.items():
	row_ix = where(y == label)[0]
	pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label))
pyplot.legend()
pyplot.show()
#输出显示
(1000, 2) (1000,)

Counter({0: 334, 1: 333, 2: 333})

[-3.05837272  4.48825769] 0
[-8.60973869 -3.72714879] 1
[1.37129721 5.23107449] 0
[-9.33917563 -2.9544469 ] 1
[-8.63895561 -8.05263469] 2
[-8.48974309 -9.05667083] 2
[-7.51235546 -7.96464519] 2
[-7.51320529 -7.46053919] 2
[-0.61947075  3.48804983] 0
[-10.91115591  -4.5772537 ] 1

上述示例解释的多分类任务的样本标签输出:

多标签分类任务(multi-label classification)


   多标签分类是指具有两个或多个分类标签的分类任务,其中每个示例可以预测一个或多个分类标签。例如照片分类的例子,其中给定的照片可能在场景中具有多个对象,并且模型可以预测照片中存在多个已知对象,例如“ 自行车 ”,“ 苹果 ”,“ 人 ”等。在自然语言处理领域,常见的就是一个对实体即是属于A关系,也属于B关系(实体关系抽取问题)。这与二元分类和多分类不同,在二分类和多分类中,为每个示例预测了单个分类标签。通常使用预测多个输出的模型来对多标签分类任务进行建模,而每个输出都将作为伯努利概率分布进行预测。本质上,这是一个对每个示例进行多个二进制分类预测的模型。用于二分类或多类分类的分类算法不能直接用于多标签分类。可以使用标准分类算法的专用版本,即所谓的算法的多标签版本,例如:多标签决策树(ML-Decision Tree)等;另一种方法是使用单独的分类算法来预测每个类别的标签。

下面这个例子:每个输入样本都有两个输入特征。一共有三个类别,每个类别可能带有两个标签(0或1)之一。

# example of a multi-label classification task
from sklearn.datasets import make_multilabel_classification
# define dataset
X, y = make_multilabel_classification(n_samples=1000, n_features=2, n_classes=3, n_labels=2, random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize first few examples
for i in range(10):
	print(X[i], y[i])
#样本输出显示
(1000, 2) (1000, 3)

[18. 35.] [1 1 1]
[22. 33.] [1 1 1]
[26. 36.] [1 1 1]
[24. 28.] [1 1 0]
[23. 27.] [1 1 0]
[15. 31.] [0 1 0]
[20. 37.] [0 1 0]
[18. 31.] [1 1 1]
[29. 27.] [1 0 0]
[29. 28.] [1 1 0]

样本不平衡分类任务(Imbalanced Classification)


      不平衡分类是指分类任务,其中每个类别中的示例数不均匀分布。通常,不平衡分类任务是二分类任务,其中训练数据集中的大多数示例属于正常类,而少数示例属于异常类。

       例如以下问题的解决:

       欺诈识别。
       离群值检测。
       肺炎识别。
      这些问题问题的解决需要通过归纳为二分类任务进行解决,尽管可能需要专门的技术。可以通过对多数类别进行欠采样或对多数类别进行过度采样来使用专门技术来更改训练数据集中样本的组成。例如:随机欠采样。SMOTE过采样。当将模型拟合到训练数据集上时,可以使用专门的建模算法来关注少数群体,例如使用敏感的机器学习算法。例如:敏感的Logistic回归(Cost-sensitive Logistic Regression)等方法,或者针对模型的损失函数进行改进,例如基于权值的焦点损失函数,更多的去关注负样本。最后,由于检测分类准确性可能会产生误差,因此需要更复杂的性能评价指标。例如:P,R,F等;下面给出了样本不平衡分类问题的示例代码和图:

# example of an imbalanced binary classification task
from numpy import where
from collections import Counter
from sklearn.datasets import make_classification
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_classes=2, n_clusters_per_class=1, weights=[0.99,0.01], random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize observations by class label
counter = Counter(y)
print(counter)
# summarize first few examples
for i in range(10):
	print(X[i], y[i])
# plot the dataset and color the by class label
for label, _ in counter.items():
	row_ix = where(y == label)[0]
	pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label))
pyplot.legend()
pyplot.show()
#汇总类标签的分布,显示严重的类不平衡,其中约980个示例属于类0,约20个示例属于类1。
(1000, 2) (1000,)

Counter({0: 983, 1: 17})

[0.86924745 1.18613612] 0
[1.55110839 1.81032905] 0
[1.29361936 1.01094607] 0
[1.11988947 1.63251786] 0
[1.04235568 1.12152929] 0
[1.18114858 0.92397607] 0
[1.1365562  1.17652556] 0
[0.46291729 0.72924998] 0
[0.18315826 1.07141766] 0
[0.32411648 0.53515376] 0

 上述示例解释的样本标签输出:

                                     

总结:

          二分类任务的解决是分类问题的基础,基于二分类任务我们可以去解决多分类任务。但是多标签分类任务的准确率亟待我们寻求更为成熟的方法进行解决。尤其是在自然语言处理领域,要想对提高概率任务的准确率,必须要使模型算法能够准确捕获文本语义特征,才能达到更为精准的标签分类。但是面对样本不平衡问题,尤其是在深度学习领域缺少数据集的情况下,如何在不使用额外人工帮助的情况下(增加负样本数据量等)提高此类任务的准确率仍旧值得关注。

原创文章 54 获赞 252 访问量 20万+

猜你喜欢

转载自blog.csdn.net/weixin_40651515/article/details/105643302