机器学习中最常见的四种分类模型

机器学习中最常见的四种分类模型点击蓝字关注我,有干货领取!作者:JasonBrownlee翻译:候博学前言机器学习是一个从训练集中学习出算法的研究领域。分类是一项需要使用机器学习算法的任务,该算法学习如何为数据集…


Jetbrains全系列IDE稳定放心使用

点击蓝字关注我,有干货领取!

机器学习中最常见的四种分类模型

作者:Jason Brownlee
翻译:候博学

前言

机器学习是一个从训练集中学习出算法的研究领域。

分类是一项需要使用机器学习算法的任务,该算法学习如何为数据集分配类别标签。

举一个简单易懂的例子:将电子邮件分类为“ 垃圾邮件 ”或“ 非垃圾邮件”(二分类的典型特征“非此即彼”,关于二分类,后文会涉及)。

你可能会在机器学习中遇到许多不同类型的分类任务,但是其实每种模型都会使用与之相对应的建模方法。

因此在本文中,你将了解到机器学习中不同类型的分类预测建模方法。

  • 分类预测建模将类别标签分配给输入样本;

  • 二分类是指预测两个类别之一(非此即彼),而多分类则涉及预测两个以上类别之一;

  • 多标签分类涉及为每个样本预测一个或多个类别;

  • 在不平衡分类中,样本在各个类别之间的分布不相等;

机器学习中最常见的四种分类模型

概述

本文分为五个部分,它们分别是:

  1. 分类预测建模

  2. 二分类

  3. 多类别分类

  4. 多标签分类

  5. 不平衡分类

分类预测建模

在机器学习中,分类[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。可以看到,具有不平衡类标签属性的数据集在建模方面更具挑战性。

机器学习中最常见的四种分类模型不平衡二元分类数据集的散点图

摘要总结

本文展示了机器学习中不同类型的分类预测建模方法。

具体来说,以下几点:

  • 分类预测建模涉及到将类别标签分配给输入样本(测试集);

  • 二分类是指预测两个类别之一,而多分类则涉及预测两个以上的类别之一;

  • 多标签分类涉及为每个样本预测一个或多个类别;

  • 不平衡分类指的是样本在各个类别之间分布不相等时的分类任务;

参考资料

[1]

分类: https://en.wikipedia.org/wiki/Statistical_classification

[2]

标签编码: https://machinelearningmastery.com/how-to-prepare-categorical-data-for-deep-learning-in-python/

[3]

二分类: https://en.wikipedia.org/wiki/Binary_classification

[4]

make_blobs()函数: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html

[5]

多类别分类: https://en.wikipedia.org/wiki/Multiclass_classification

[6]

make_blobs()函数: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html

[7]

多标签分类: https://en.wikipedia.org/wiki/Multi-label_classification

[8]

照片分类: https://machinelearningmastery.com/object-recognition-with-deep-learning/

[9]

make_multilabel_classification()函数: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html

[10]

不平衡分类: https://machinelearningmastery.com/what-is-imbalanced-classification/

[11]

随机欠采样: https://machinelearningmastery.com/random-oversampling-and-undersampling-for-imbalanced-classification/

[12]

SMOTE过采样: https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/

[13]

make_classification()函数: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html

-END-

往期精选

 

Numpy进阶之排序小技巧

Matplotlib 可视化最有价值的 50 个图表

使用sklearn轻松实现数据缩放

Python大数据分析

data creats value

机器学习中最常见的四种分类模型

长按二维码关注

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185610.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • C语言学生成绩管理系统(设计报告和全部源码)「建议收藏」

    C语言学生成绩管理系统(设计报告和全部源码)「建议收藏」实现如下功能:1)能够实现学生成绩信息的插入、删除和修改;2)能够实现各种查询(分别根据学生学号、姓名、课程名称等);3)能够实现按照考试成绩、总评成绩进行排序;4)能够查询某门课程的最高分、最低分并输出相应学生信息;5)能够查询某门课程的优秀率(90分及以上)、不及格率;学生成绩管理系统设计与实现1)系统功能模块学生成绩管理系统主要功能是。。。。模块结构如“图1-1系统功能结构图”所示。图1-1系统功能结构图我是事先定义了:typedefstructNode{in

    2022年6月20日
  • 共享打印机错误代码709_连接共享打印机错误0*0000011b

    共享打印机错误代码709_连接共享打印机错误0*0000011b最近发现很多用户连接或安装局域网共享的打印机时出现很多问题,常见的错误代码是0x0000011b和0x00000709或0x000006d9这三个错误。要如何解决呢?下面来讲一下如何解决这两个问题。键盘组合键徽标键Win+R键打开运行,在弹出的运行框中输入【services.msc】确定打开服务窗口,检查这两个服务是否已启动:PrintSpooler和WindowsFirewall一般Win7易出的错误6d9是后面的服务未启动所致。依次查找并卸载KB5005565、KB5005566、KB5005…

    2022年9月10日
  • Java泛型详解,史上最全图文详解「建议收藏」

    Java泛型详解,史上最全图文详解「建议收藏」泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它。毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课。一:泛型本质Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛.

    2022年7月8日
  • nextline函数_nextLine()和next()的区别和使用方法

    nextline函数_nextLine()和next()的区别和使用方法最近在笔试,刷剑指Offer时,都是只需要把方法实现了就行。但是!!!笔试时候会发现,大部分会要求你把main函数也code出来,真是醉了,第一次笔试时候搞的晕乎乎的…..废话不多说,那么在写输入输出中,肯定要用到Scanner类了,其中不少都需要读取一个整数或者一个整型数组。当读入整数时(以int为例),直接就nextInt()就好,可是当读入一个整型数组时(数字之间用空格隔开),就涉及到用…

    2022年6月8日
  • ACM中Java输入输出[通俗易懂]

    ACM中Java输入输出[通俗易懂]最初写算法时,是用Scanner的。因为当时接触的测试数据基本都是以算法的复杂度为主,但是后面遇到大量的输入数据时。发现Scanner远远不能满足条件。下面列出几种常用的输入输出方式。(输出统一用printwriter,系统的system.out太慢,结尾要释放缓存才能输出,不然数据放在缓存中输不出来)1:Scanner这个类最慢,但是最好用,因为这个类没有缓存处理,所以io方面大量输入…

    2022年5月18日
  • Mysql判断计算结果,除以100

    Mysql判断计算结果,除以100

    2021年7月13日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号