前言
机器学习是一个从训练集中学习出算法的研究领域。
分类是一项需要使用机器学习算法的任务,该算法学习如何为数据集分配类别标签。
举一个简单易懂的例子:将电子邮件分类为“ 垃圾邮件 ”或“ 非垃圾邮件”(二分类的典型特征“非此即彼”,关于二分类,后文会涉及)。
你可能会在机器学习中遇到许多不同类型的分类任务,但是其实每种模型都会使用与之相对应的建模方法。
因此在本文中,你将了解到机器学习中不同类型的分类预测建模方法。
- 分类预测建模将类别标签分配给输入样本;
- 二分类是指预测两个类别之一(非此即彼),而多分类则涉及预测两个以上类别之一;
- 多标签分类涉及为每个样本预测一个或多个类别;
- 在不平衡分类中,样本在各个类别之间的分布不相等;
概述
本文分为五个部分,它们分别是:
- 分类预测建模
- 二分类
- 多类别分类
- 多标签分类
- 不平衡分类
分类预测建模
在机器学习中,分类[1]是指预测建模问题,对给定示例的输入数据预测其类别标签。
分类问题的案例包括:
- 分类一封邮件是否为垃圾邮件。
- 给定一个手写字符,将其分类为已知字符之一。
- 根据最近的用户行为,来将用户分类为是否流失。
从建模的角度来看,分类需要训练数据集,其中包含许多可供学习的输入和输出数据。
模型将使用训练数据集,并计算如何将输入数据样本更加准确地映射到特定的类别标签。
因此,训练数据集必须拥有足够的代表性,并且每个分类标签都拥有很多样本数据。
类别标签通常是字符串值,例如“ spam ”(垃圾邮件),“ not spam ”(非垃圾邮件),并且在提供给建模算法之前必须将其映射为数值。这通常称为标签编码[2],其中为每个类别标签分配一个唯一的整数,例如“ spam ” = 0,“ no spam ” = 1。
有很多不同类型的分类算法可以对分类预测问题进行建模。
关于如何将合适的算法应用到具体分类问题上,没有固定的模式准则。但可以通过试验来确定,通常是试验者使用受控实验,在给定的分类任务中,哪种算法和算法配置拥有最佳性能,从而将其挑选出来。
基于预测结果对分类预测建模算法进行评估。分类准确度是一种常用的度量标准,其通过预测的类别标签来评估模型的性能。即使分类结果不是完美的,但对于许多分类任务来说这是个很好的开始。
某些任务可能需要预测每个样本类别成员的概率,而不是标签。这为预测提供了额外的不确定性,评估预测概率的一种通用判断方法是ROC曲线(积分面积)
你可能会遇到四种主要的分类任务类型,它们分别是:
- 二分类
- 多类别分类
- 多标签分类
- 不平衡分类
让我们来依次仔细研究每个类型。
二分类模型
二分类[3]是指具有两个类别标签的分类任务。
示例包括:
- 电子邮件垃圾邮件检测(是否为垃圾邮件)
- 流失预测(流失与否)
- 转化预测(购买或不购买)
通常,二分类任务涉及一个属于正常状态的类别和一个属于异常状态的类别。
例如,“ 非垃圾邮件 ”是正常状态,而“ 垃圾邮件 ”是异常状态。另一个示例是“ 未检测到癌症 ”是涉及医学检查任务的正常状态,而“ 检测到癌症 ”是异常状态。
正常状态的类分配为类别标签0,状态异常的类分配为类别标签1。
通常先预测每个样本的伯努利概率分布模型,来对二分类任务进行建模。
伯努利分布是离散的概率分布,它涵盖了事件的结果为0或1的两种情况。假如结果预测为1,对于分类来说,这意味着模型预测了数据属于1类,也可以说是异常状态。
可以用于二分类的流行算法包括:
- 逻辑回归(Logistic Regression)
- k最近邻(k-Nearest Neighbors)
- 决策树(Decision Trees)
- 支持向量机(Support Vector Machine)
- 朴素贝叶斯(Naive Bayes)
有些算法是专门为二分类问题而设计的,它们本身不支持两个以上的类型分类。例如逻辑回归和支持向量机。
接下来,让我们仔细看一下数据集,通过实践和思考来训练出对二分类问题的直觉。
我们可以使用make_blobs()函数[4]生成一个合成的二分类数据集。
下面的示例代码生成一个数据集,其中包含1,000个样本,这些样本属于两个类之一,每个类具有两个输入特征。
# 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个样本分为input(X)和output(y)元素。
然后汇总类标签的分布,显示该实例是属于类别0还是类别1,并且每个类别中各有500个样本。
接下来,总结数据集中的前10个样本,显示输入值是数字,目标值是代表类成员类型的整数0或1。
(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
最后,为数据集中的input变量创建散点图,并根据其类值对点进行着色。
我们可以很直观的区分两个不同的集群。
二元分类数据集的散点图
多类别分类模型
多类别分类[5]是指具有两个以上类别标签的分类任务。
示例包括:
- 人脸分类
- 植物种类分类
- 光学字符识别
与二分类不同,多类别分类没有正常和异常结果的概念。相反,样本被分类为属于一系列已知类别中的一个。
在某些问题上,类标签的数量可能非常大。例如,模型可以预测照片属于面部识别系统中的数千个或数万个面部之一。
涉及预测单词序列的问题,例如文本翻译模型,也可以视为一种特殊类型的多类别分类。要预测的单词序列中的每个单词都涉及一个多类分类,其中词汇量定义了可以预测的可能类别的数量,其数量可能是成千上万个单词。
通常使用每个样本的Multinoulli概率分布的模型来对多类分类任务进行建模。
所述Multinoulli概率分布是覆盖情况下的事件将有一个明确的结果,例如离散概率分布ķ在{1,2,3,...,ķ }。对于分类,这意味着模型可以预测样本属于每个类别标签的概率。
许多用于二分类的算法也可以用于解决多分类问题。
可用于多类分类的流行算法包括:
- k最近邻(k-Nearest Neighbors)
- 决策树(Decision Trees)
- 朴素贝叶斯(Naive Bayes)
- 随机森林(Random Forest)
- 梯度Boosting(Gradient Boosting)
这涉及使用一种策略,该策略为每个类别与所有其他类别(称为“一对多”)拟合多个二分类模型,或者为每对类别(称为“一对一”)拟合一个模型。
- 一对多:为每个类别与其它所有类别拟合出一个二分类模型。
- 一对一:为每对类别拟合一个二分类模型。
可以使用这些策略进行多分类的二分类算法包括:
- 逻辑回归(Logistic Regression)
- 支持向量机(Support Vector Machine)
接下来,让我们仔细看一下数据集,通过实践和思考来训练出对多类分类问题的直觉。
我们可以使用make_blobs()函数[6]生成一个综合的多类分类数据集。
下面的代码表示生成一个数据集,其中包含1,000个示例,这些示例属于三个类之一,每个类别具有两个输入特征。
# 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个样本分为input(X)和output(y)。
然后汇总类别标签的分布,显示样本属于类别0,类别1或类别2,并且每个类中大约有333个示例。
接下来,展示数据集中的前10个样本,显示输入值是数字,目标值是代表类别成员类型的整数。
(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
最后,为数据集中的input变量创建散点图,并根据其分类值对点进行着色。
我们可以很容易区分三个不同的集群。
多类分类数据集的散点图
多标签分类模型
多标签分类[7]是指具有两个或多个分类标签的分类任务,其中每个样本可以预测一个或多个分类标签。
考虑照片分类[8]的示例,其中给定的照片可能在场景中具有多个对象,并且模型可以预测照片中存在多个已知对象,例如“ 自行车 ”,“ 苹果 ”,“ 人 ”等。
这与二分类和多分类不同,在二分类和多分类中,为每个样本预测了单个分类标签。
通常使用预测多个输出的模型来对多标签分类任务进行建模,而每个输出都将作为伯努利概率分布(0,1分布)进行预测。本质上,这是对每个样本进行多个二分类预测的模型。
用于二分类或多类分类的分类算法不能直接用于多标签分类。可以使用标准分类算法的专用版本,即所谓的多标签版本算法,包括:
- 多标签决策树(Multi-label Decision Trees)
- 多标签随机森林(Multi-label Random Forests)
- 多标签梯度Boosting(Multi-label Gradient Boosting)
另一种方法是使用单独的分类算法来预测每个类别的标签。
接下来,让我们仔细看一下数据集,通过实践和思考来训练出对多标签分类问题的直觉。
我们可以使用make_multilabel_classification()函数[9]生成一个由算法合成的多标签分类数据集。
下面的代码表示生成一个包含1,000个示例的数据集,每个示例都有两个输入特征。一共有三个类别,每个类别可能带有两个标签(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个示例分为input(X)和output(y)。
接下来,展示数据集中的前10个样本,显示输入值是数字,目标值是代表类标签成员类别的整数。
(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]
不平衡分类模型
不平衡分类[10]是指在分类任务中,每个类别中的样本数不均匀分布。
通常,不平衡分类任务是二分类任务,其中训练数据集中的大多数样本属于正常类,而少数样本属于异常类。
示例包括:
- 欺诈识别
- 离群值检测
- 医学诊断测试
这些问题被建模为二分类任务,尽管可能会需要专门的技术。
通过对多数类别进行欠采样或过采样,使用专门的建模算法来修正训练数据集中样本的组成。
示例包括:
- 随机欠采样[11]
- SMOTE过采样[12]
当将模型拟合到训练数据集上时,可以使用专门的建模算法来关注少数群体,例如成本敏感的机器学习算法。
示例包括:
- 成本敏感逻辑回归(Cost-sensitive Logistic Regression)
- 成本敏感决策树(Cost-sensitive Decision Trees)
- 成本敏感支持向量机(Cost-sensitive Support Vector Machines)
最后,由于报告分类准确性可能会产生误差,因此可能需要其他性能指标来进行评估。
示例包括:
- 精确度 Precision
- 召回度 Recall
- F-Measure
接下来,让我们仔细看一下数据集,通过实践和思考来训练出对不平衡分类问题的直觉。
我们可以使用make_classification()函数[13]生成一个由代码合成的不平衡二分类数据集。
下面的代码表示生成一个数据集,其中包含1,000个示例,这些示例属于两个类之一,每个类具有两个输入特征。
# 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()
首先运行代码,对创建的数据集进行汇总,将1000个示例分为input(X)和output(y)。
然后汇总类标签的分布,显示出来严重的类别不平衡,其中约980个示例属于类别0,约20个示例属于类别1。
接下来,展示数据集中的前10个样本,显示输入值是数字,目标值是代表类成员类别的整数。在这种情况下,我们可以看到,大多数示例都属于类别0。
(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
最后,为数据集中的输入变量创建散点图,并根据其类值对点进行着色。
我们可以看到一个主类,属于类别0,一些零散的则属于类别1。可以看到,具有不平衡类标签属性的数据集在建模方面更具挑战性。
不平衡二元分类数据集的散点图
摘要总结
本文展示了机器学习中不同类型的分类预测建模方法。
具体来说,以下几点:
- 分类预测建模涉及到将类别标签分配给输入样本(测试集);
- 二分类是指预测两个类别之一,而多分类则涉及预测两个以上的类别之一;
- 多标签分类涉及为每个样本预测一个或多个类别;
- 不平衡分类指的是样本在各个类别之间分布不相等时的分类任务