每个程序员都应该知道的 40 个算法(二)(2)https://developer.aliyun.com/article/1506336
PCA 的局限性
PCA 的局限性如下:
- PCA 只能用于连续变量,对于类别变量无关。
- 在聚合时,PCA 近似了组件变量;它以准确性为代价简化了维度的问题。在使用 PCA 之前,应该仔细研究这种权衡。
关联规则挖掘
特定数据集中的模式是需要被发现、理解和挖掘的宝藏。有一组重要的算法试图专注于给定数据集中的模式分析。在这类算法中,较受欢迎的算法之一称为关联规则挖掘算法,它为我们提供了以下功能:
- 衡量模式频率的能力
- 建立模式之间因果关系的能力。
- 通过将它们的准确性与随机猜测进行比较,量化模式的有用性
使用示例
当我们试图调查数据集中不同变量之间的因果关系时,使用关联规则挖掘。以下是它可以帮助回答的示例问题:
- 哪些湿度、云层覆盖和温度值可能导致明天下雨?
- 什么类型的保险索赔可能表明欺诈?
- 哪些药物的组合可能会导致患者并发症?
市场篮分析
在本书中,推荐引擎在第八章“神经网络算法”中进行了讨论。篮子分析是学习推荐的一种简单方法。在篮子分析中,我们的数据只包含有关哪些物品一起购买的信息。它没有任何关于用户或用户是否喜欢个别物品的信息。请注意,获取这些数据要比获取评级数据容易得多。
例如,当我们在沃尔玛购物时,就会产生这种数据,而不需要任何特殊技术来获取数据。这些数据在一段时间内收集起来,被称为交易数据。当将关联规则分析应用于便利店、超市和快餐连锁店中使用的购物车的交易数据集时,就称为市场篮子分析。它衡量了一组物品一起购买的条件概率,有助于回答以下问题:
- 货架上物品的最佳摆放位置是什么?
- 物品在营销目录中应该如何出现?
- 基于用户的购买模式,应该推荐什么?
由于市场篮子分析可以估计物品之间的关系,因此它经常用于大众市场零售,如超市、便利店、药店和快餐连锁店。市场篮子分析的优势在于其结果几乎是不言自明的,这意味着它们很容易被业务用户理解。
让我们来看一个典型的超市。商店中所有可用的唯一物品可以用一个集合 ={item[1],item[2],…,item[m]}来表示。因此,如果那家超市销售 500 种不同的物品,那么 将是一个大小为 500 的集合。
人们会从这家商店购买物品。每当有人购买物品并在柜台付款时,它就会被添加到一个特定交易中的物品集合中,称为项目集。在一段时间内,交易被分组在一个由 表示的集合中,其中 ={t[1],t[2],…,t[n]}。
让我们来看一下只包含四个交易的简单交易数据。这些交易总结在下表中:
t1 | 球门,护腕 |
t2 | 球棒,球门,护腕,头盔 |
t3 | 头盔,球 |
t4 | 球棒、护腕、头盔 |
让我们更详细地看一下这个例子:
={球棒,球门,护腕,头盔,球},它代表了商店中所有可用的唯一物品。
让我们考虑来自 的一个交易 t3。请注意,t3 中购买的物品可以用 itemset[t3]={头盔,球}表示,这表明顾客购买了两件物品。由于这个 itemset 中有两件物品,因此 itemset[t5]的大小被称为两。
关联规则
关联规则通过数学方式描述了各种交易中涉及的物品之间的关系。它通过研究形式为X⇒Y的两个项目集之间的关系来实现这一点,其中X⊂ ,Y⊂ 。此外,X和Y是不重叠的项目集;这意味着 。
关联规则可以用以下形式描述:
{头盔,球}⇒{自行车}
在这里,{头盔,球}是X,{球}是Y。
规则类型
运行关联分析算法通常会从交易数据集中生成大量规则。其中大部分是无用的。为了挑选出可以提供有用信息的规则,我们可以将它们分类为以下三种类型之一:
- 琐碎
- 莫名其妙
- 可操作
让我们更详细地看看每种类型。
琐碎的规则
在生成的大量规则中,许多派生的规则将是无用的,因为它们总结了关于业务的常识。它们被称为琐碎规则。即使琐碎规则的置信度很高,它们仍然是无用的,不能用于任何数据驱动的决策。我们可以安全地忽略所有琐碎规则。
以下是琐碎规则的例子:
- 任何从高楼跳下的人都有可能死亡。
- 更努力工作会导致考试成绩更好。
- 随着温度下降,取暖器的销量会增加
- 在高速公路上超速驾驶会增加事故的可能性。
不可解释规则
在运行关联规则算法后生成的规则中,那些没有明显解释的规则是最难使用的。请注意,规则只有在能帮助我们发现和理解预期最终会导致某种行动的新模式时才有用。如果不是这种情况,我们无法解释事件X导致事件Y的原因,那么它就是一个不可解释的规则,因为它只是一个最终探索两个无关和独立事件之间毫无意义关系的数学公式。
以下是不可解释规则的例子:
- 穿红衬衫的人在考试中得分更高。
- 绿色自行车更容易被盗。
- 购买泡菜的人最终也会购买尿布。
可操作规则
可操作规则是我们正在寻找的黄金规则。它们被业务理解并引发见解。当呈现给熟悉业务领域的观众时,它们可以帮助我们发现事件可能的原因,例如,可操作规则可能根据当前的购买模式建议产品在商店中的最佳摆放位置。它们还可能建议将哪些商品放在一起,以最大化它们一起销售的机会。
以下是可操作规则及其相应的行动的例子:
- **规则 1:**向用户的社交媒体账户展示广告会增加销售的可能性。
**可操作项目:**建议产品的替代广告方式
- **规则 2:**创建更多的价格点会增加销售的可能性。
**可操作项目:**一个商品可能在促销中进行广告,而另一个商品的价格可能会上涨。
排名规则
关联规则有三种衡量方式:
- 物品的支持(频率)
- 置信度
- 提升
让我们更详细地看看它们。
支持
支持度量是一个数字,用来量化我们在数据集中寻找的模式有多频繁。首先计算我们感兴趣的模式出现的次数,然后将其除以所有交易的总数来计算。
让我们看看特定*itemset[a]*的以下公式:
numItemset[a] =包含 itemset[a]的交易数
num[total] =交易总数
仅通过支持,我们就可以了解到模式发生的罕见程度。低支持意味着我们在寻找一种罕见事件。
例如,如果*itemset[a] = {头盔,球}*在六次交易中出现了两次,那么支持(itemset[a])= 2/6 = 0.33。
置信度
置信度是一个数字,通过计算条件概率来量化我们可以将左侧(X)与右侧(Y)关联的强度。它计算了事件X发生的情况下,事件Y会发生的概率。
从数学上讲,考虑规则X ⇒ Y。
这条规则的置信度表示为 confidence(X ⇒ Y),并按以下方式测量:
让我们举个例子。考虑以下规则:
{头盔,球} ⇒ {球门}
这条规则的置信度由以下公式计算:
这意味着如果有人的篮子里有{头盔,球},那么他们还有球门的概率是 0.5 或 50%。
提升
估计规则质量的另一种方法是通过计算提升。提升返回一个数字,量化了规则在预测结果方面相对于仅假设等式右侧的结果的改进程度。如果X和Y项集是独立的,那么提升的计算如下:
关联分析算法
在本节中,我们将探讨以下两种可用于关联分析的算法:
- Apriori 算法:由 Agrawal, R.和 Srikant 于 1994 年提出。
- FP-growth 算法:由 Han 等人于 2001 年提出的改进建议。
让我们看看这些算法各自的情况。
Apriori 算法
Apriori 算法是一种迭代和多阶段的算法,用于生成关联规则。它基于生成和测试的方法。
在执行 apriori 算法之前,我们需要定义两个变量:support[threshold]和 Confidence[threshold]。
该算法包括以下两个阶段:
- 候选生成阶段:它生成包含所有高于 support[threshold]的项集的候选项集。
- 过滤阶段:它过滤掉所有低于预期 confidence[threshold]的规则。
过滤后,得到的规则就是答案。
Apriori 算法的局限性
Apriori 算法中的主要瓶颈是第 1 阶段候选规则的生成,例如, = {item [1] , item [2] , . . . , item [m] } 可以产生 2^m 个可能的项集。由于其多阶段设计,它首先生成这些项集,然后努力找到频繁项集。这个限制是一个巨大的性能瓶颈,使得 apriori 算法不适用于更大的项。
FP-growth 算法
频繁模式增长(FP-growth)算法是对 apriori 算法的改进。它首先展示频繁交易 FP 树,这是一个有序树。它包括两个步骤:
- 填充 FP 树
- 挖掘频繁模式
让我们一步一步地看这些步骤。
填充 FP 树
让我们考虑下表中显示的交易数据。让我们首先将其表示为稀疏矩阵:
ID | 球棒 | 球门 | 防护板 | 头盔 | 球 |
1 | 0 | 1 | 1 | 0 | 0 |
2 | 1 | 1 | 1 | 1 | 0 |
3 | 0 | 0 | 0 | 1 | 1 |
4 | 1 | 0 | 1 | 1 | 0 |
让我们计算每个项的频率,并按频率降序排序:
项 | 频率 |
防护板 | 3 |
头盔 | 3 |
球棒 | 2 |
球门 | 2 |
球 | 1 |
现在让我们根据频率重新排列基于交易的数据:
ID | 原始项 | 重新排序的项 |
t1 | 防护板,球门 | 防护板,球门 |
t2 | 球棒,球门,防护板,头盔 | 头盔,防护板,球门,球棒 |
t3 | 头盔,球 | 头盔,球 |
t4 | 球棒,防护板,头盔 | 头盔,防护板,球棒 |
要构建 FP 树,让我们从 FP 树的第一个分支开始。FP 树以Null作为根开始。为了构建树,我们可以用一个节点表示每个项,如下图所示(这里显示了 t[1]的树表示)。请注意,每个节点的标签都是项的名称,冒号后面附加了其频率。还要注意pads项的频率为 1:
使用相同的模式,让我们绘制所有四个交易,得到完整的 FP 树。FP 树有四个叶节点,每个节点代表与四个交易相关的项集。请注意,我们需要计算每个项的频率,并在多次使用时增加它-例如,将 t[2]添加到 FP 树时,头盔 的频率增加到了两次。类似地,当添加 t[4]时,它再次增加到了三次。结果树如下图所示:
请注意,前面图中生成的 FP 树是有序树。
挖掘频繁模式
FP-growth 树的第二阶段涉及从 FP 树中挖掘频繁模式。通过创建一个有序树,意图是创建一个高效的数据结构,可以轻松导航以搜索频繁模式。
我们从叶节点(即末端节点)开始向上移动-例如,让我们从叶节点项之一 球棒 开始。然后我们需要计算 球棒 的条件模式基。通过指定从叶节点项到顶部的所有路径来计算条件模式基。球棒 的条件模式基如下:
球门: 1 | 护腕: 1 | 头盔: 1 |
护腕: 1 | 头盔: 1 |
球棒 的 频繁模式 如下:
{球门, 护腕, 头盔} : 球棒
{护腕,头盔} : 球棒
使用 FP-growth 的代码
让我们看看如何使用 Python 中的 FP-growth 算法生成关联规则。为此,我们将使用 pyfpgrowth
软件包。首先,如果我们以前从未使用过 pyfpgrowth
,让我们首先安装它:
!pip install pyfpgrowth
然后,让我们导入实现此算法所需的软件包:
import pandas as pd import numpy as np import pyfpgrowth as fp
现在我们将创建以 transactionSet
形式的输入数据:
dict1 = { 'id':[0,1,2,3], 'items':[["wickets","pads"], ["bat","wickets","pads","helmet"], ["helmet","pad"], ["bat","pads","helmet"]] } transactionSet = pd.DataFrame(dict1)
一旦生成了输入数据,我们将生成基于我们传递给 find_frequent_patterns()
的参数的模式。请注意,传递给此函数的第二个参数是最小支持度,在本例中为 1:
patterns = fp.find_frequent_patterns(transactionSet['items'],1)
模式已生成。现在让我们打印模式。模式列出了项的组合及其支持:
现在让我们生成规则:
每个规则都有左侧和右侧,由冒号(:)分隔。它还为我们提供了输入数据集中每个规则的支持。
实际应用-将相似的推文进行聚类
无监督机器学习算法也可以实时应用于将相似的推文进行聚类。它们将执行以下操作:
- 步骤 1- 主题建模: 从给定的一组推文中发现各种主题
- 步骤 2- 聚类: 将每个推文与发现的主题之一关联起来
这种无监督学习的应用如下图所示:
请注意,此示例需要实时处理输入数据。
让我们逐一看看这些步骤。
主题建模
主题建模是发现一组文档中的概念的过程,这些概念可以用来区分它们。在推文的背景下,这是关于找出一组推文可以被分成哪些最合适的主题。潜在狄利克雷分配是一种用于主题建模的流行算法。因为每条推文都是一个短的 144 个字符的文档,通常涉及一个非常特定的主题,我们可以为主题建模目的编写一个更简单的算法。该算法描述如下:
- 对推文进行标记化处理。
- 预处理数据。删除停用词、数字、符号并进行词干处理
- 为推文创建一个术语-文档矩阵(TDM)。选择在唯一推文中出现最频繁的前 200 个词。
- 选择直接或间接代表概念或主题的前 10 个单词。例如时尚、纽约、编程、事故。这 10 个单词现在是我们成功发现的主题,并将成为 tweets 的聚类中心。
让我们继续下一步,即聚类
聚类
一旦我们发现了主题,我们将选择它们作为聚类的中心。然后我们可以运行 k-means 聚类算法,将每个 tweet 分配到其中一个聚类中心。
因此,这是一个实际的例子,说明一组 tweets 如何被聚类成发现的主题。
异常检测算法
异常 的词典定义是与众不同、异常、奇特或不容易分类的东西。它是偏离常规规则的。在数据科学的背景下,异常是偏离预期模式很多的数据点。寻找这样的数据点的技术被称为异常检测技术。
现在让我们看看异常检测算法的一些应用:
- 信用卡欺诈
- 在 磁共振成像(MRI) 扫描中发现恶性肿瘤
- 集群中的故障预防
- 考试中的冒名顶替
- 高速公路上的事故
在接下来的章节中,我们将看到各种异常检测技术。
使用聚类
诸如 k-means 的聚类算法可以用来将相似的数据点分组在一起。可以定义一个阈值,任何超出该阈值的点都可以被分类为异常。这种方法的问题在于,由于异常数据点的存在,k-means 聚类创建的分组本身可能会存在偏差,并可能影响方法的实用性和准确性。
使用基于密度的异常检测
基于密度的方法试图找到密集的邻域。k-最近邻(KNN)算法可以用于此目的。远离发现的密集邻域的异常被标记为异常。
使用支持向量机
支持向量机(SVM)算法可以用来学习数据点的边界。任何超出这些发现的边界的点都被识别为异常。
总结
在本章中,我们看了各种无监督的机器学习技术。我们看了尝试减少我们试图解决的问题的维度的情况,以及不同的方法。我们还研究了无监督机器学习技术在哪些情况下非常有帮助,包括市场篮分析和异常检测。
在下一章中,我们将看看各种监督学习技术。我们将从线性回归开始,然后我们将看看更复杂的监督机器学习技术,如基于决策树的算法、SVM 和 XGBoast。我们还将研究朴素贝叶斯算法,它最适合于非结构化的文本数据。
第七章:传统监督学习算法
在本章中,我们将重点介绍监督式机器学习算法,这是现代算法中最重要的类型之一。监督式机器学习算法的显著特征是使用带标签的数据来训练模型。在本书中,监督式机器学习算法分为两章。在本章中,我们将介绍所有传统的监督式机器学习算法,不包括神经网络。下一章将全面介绍使用神经网络实现监督式机器学习算法。事实上,在这一领域有如此多的持续发展,神经网络是一个值得在本书中单独章节讨论的综合性主题。
因此,这一章是关于监督式机器学习算法的两个部分中的第一部分。首先,我们将介绍监督式机器学习的基本概念。接下来,我们将介绍两种监督式机器模型——分类器和回归器。为了展示分类器的能力,我们将首先提出一个真实世界的问题作为挑战。然后,我们将介绍六种不同的分类算法,用于解决这个问题。然后,我们将专注于回归算法,首先提出一个类似的问题,以便为回归器解决问题。接下来,我们将介绍三种回归算法,并使用它们来解决问题。最后,我们将比较结果,以帮助我们总结本章介绍的概念。
本章的总体目标是让您了解不同类型的监督式机器学习技术,并了解对于某些类别的问题,最佳的监督式机器学习技术是什么。
本章讨论了以下概念:
- 理解监督式机器学习
- 理解分类算法
- 评估分类器性能的方法
- 理解回归算法
- 评估回归算法性能的方法
让我们从理解监督式机器学习背后的基本概念开始。
理解监督式机器学习
机器学习专注于使用数据驱动的方法来创建可以帮助我们做出决策的自主系统,无论是否有人类监督。为了创建这些自主系统,机器学习使用一组算法和方法来发现和制定数据中可重复的模式。在机器学习中最流行和强大的方法之一是监督式机器学习方法。在监督式机器学习中,算法被给定一组输入,称为特征,以及它们对应的输出,称为目标 变量。使用给定的数据集,监督式机器学习算法用于训练一个捕捉特征和目标变量之间复杂关系的模型,该关系由数学公式表示。这个训练好的模型是用于预测的基本工具。
通过训练模型,通过生成未知特征集的目标变量来进行预测。
在监督学习中从现有数据中学习的能力类似于人脑从经验中学习的能力。监督学习中的这种学习能力使用了人脑的一个属性,是将决策能力和智能引入机器的基本途径。
让我们考虑一个例子,我们想要使用监督式机器学习技术训练一个模型,可以将一组电子邮件分类为合法邮件(称为合法)和不需要的邮件(称为垃圾邮件)。首先,为了开始,我们需要过去的例子,这样机器才能学习应该将什么样的电子邮件内容分类为垃圾邮件。这种基于内容的文本数据学习任务是一个复杂的过程,可以通过监督式机器学习算法之一来实现。在这个例子中,可以用来训练模型的一些监督式机器学习算法包括决策树和朴素贝叶斯分类器,我们将在本章后面讨论。
制定监督式机器学习
在深入研究监督式机器学习算法的细节之前,让我们定义一些基本的监督式机器学习术语:
术语 | 解释 |
目标变量 | 目标变量是我们希望模型预测的变量。在监督式机器学习模型中只能有一个目标变量。 |
标签 | 如果我们想要预测的目标变量是一个类别变量,那么它被称为标签。 |
特征 | 用于预测标签的一组输入变量称为特征。 |
特征工程 | 将特征转换为所选监督式机器学习算法准备的过程称为特征工程。 |
特征向量 | 在将输入提供给监督式机器学习算法之前,所有特征都被组合在一个称为特征向量的数据结构中。 |
历史数据 | 用于制定目标变量和特征之间关系的过去数据称为历史数据。历史数据带有示例。 |
训练/测试数据 | 历史数据与示例被分成两部分——一个更大的数据集称为训练数据,一个较小的数据集称为测试数据。 |
模型 | 目标变量和特征之间关系的最佳捕捉模式的数学表达。 |
训练 | 使用训练数据创建模型。 |
测试 | 使用测试数据评估训练模型的质量。 |
预测 | 使用模型预测目标变量。 |
经过训练的监督式机器学习模型能够通过估计特征来预测目标变量。
让我们介绍一下本章中将使用的符号,讨论机器学习技术:
变量 | 含义 |
y | 实际标签 |
ý | 预测标签 |
d | 总示例数量 |
b | 训练示例的数量 |
c | 测试示例的数量 |
现在,让我们看看一些这些术语如何在实际中被制定。
正如我们讨论的,特征向量被定义为一个包含所有特征的数据结构。
如果特征的数量是n,训练示例的数量是b,那么X_train
表示训练特征向量。每个示例都是特征向量中的一行。
对于训练数据集,特征向量由X_train
表示。如果训练数据集中有b个示例,那么X_train
将有b行。如果训练数据集中有n个变量,那么它将有n列。因此,训练数据集将具有n x b的维度,如下图所示:
现在,让我们假设有b个训练示例和c个测试示例。一个特定的训练示例由(X, y)表示。
我们使用上标来指示训练集中的每个训练示例。
因此,我们的标记数据集由 D = {X((1)),y((1))), (X((2)),y((2))), … , (X((d)),y((d)))}表示。
我们将其分为两部分——D[train]和 D[test]。
因此,我们的训练集可以用 D[train] = {X((1)),y((1))), (X((2)),y((2))), … , (X((b)),y((b)))}来表示。
训练模型的目标是对于训练集中的任何第 i 个示例,目标值的预测值应尽可能接近示例中的实际值。换句话说, 。
因此,我们的测试集可以用 D[test] = {X((1)),y((1))), (X((2)),y((2))), … , (X(©),y(©))}来表示。
目标变量的值由向量Y表示:
Y = {y^((1)), y^((2)), …, y^((m))}
理解启用条件
监督式机器学习是基于算法使用示例来训练模型的能力。监督式机器学习算法需要满足一定的启用条件才能执行。这些启用条件如下:
- 足够的示例:监督式机器学习算法需要足够的示例来训练模型。
- 历史数据中的模式:用于训练模型的示例需要具有其中的模式。我们感兴趣事件的发生可能性应取决于模式、趋势和事件的组合。如果没有这些,我们处理的是无法用于训练模型的随机数据。
- 有效的假设:当我们使用示例训练监督式机器学习模型时,我们期望适用于示例的假设在未来也是有效的。让我们看一个实际的例子。如果我们想要为政府训练一个可以预测学生是否会获得签证的机器学习模型,那么理解是在模型用于预测时,法律和政策不会发生变化。如果在训练模型后实施了新的政策或法律,可能需要重新训练模型以纳入这些新信息。
区分分类器和回归器
在机器学习模型中,目标变量可以是类别变量或连续变量。目标变量的类型决定了我们拥有的监督式机器学习模型的类型。基本上,我们有两种类型的监督式机器学习模型:
- 分类器:如果目标变量是类别变量,则机器学习模型称为分类器。分类器可用于回答以下类型的业务问题:
- 这种异常组织生长是否是恶性肿瘤?
- 根据当前的天气条件,明天会下雨吗?
- 基于特定申请人的资料,他们的抵押贷款申请是否应该被批准?
- 回归器:如果目标变量是连续变量,我们训练一个回归器。回归器可用于回答以下类型的业务问题:
- 根据当前的天气条件,明天会下多少雨?
- 具有给定特征的特定房屋的价格将是多少?
让我们更详细地看看分类器和回归器。
理解分类算法
在监督式机器学习中,如果目标变量是类别变量,则模型被归类为分类器:
- 目标变量称为标签。
- 历史数据称为标记数据。
- 需要预测标签的生产数据称为未标记数据。
使用训练模型准确标记未标记数据的能力是分类算法的真正力量。分类器预测未标记数据的标签以回答特定的业务问题。
在我们介绍分类算法的细节之前,让我们首先提出一个业务问题,作为分类器的挑战。然后我们将使用六种不同的算法来回答相同的挑战,这将帮助我们比较它们的方法、途径和性能。
提出分类器挑战
我们将首先提出一个常见的问题,我们将使用它作为测试六种不同分类算法的挑战。这个常见的问题在本章中被称为分类器挑战。使用所有六种分类器来解决同一个问题将帮助我们以两种方式:
- 所有输入变量都需要被处理和组装成一个复杂的数据结构,称为特征向量。使用相同的特征向量可以帮助我们避免为所有六个算法重复数据准备。
- 我们可以通过使用相同的特征向量作为输入来比较各种算法的性能。
分类器挑战是关于预测一个人购买的可能性。在零售行业,可以帮助最大化销售的一件事是更好地了解客户的行为。这可以通过分析历史数据中发现的模式来实现。让我们先阐述问题。
问题陈述
根据历史数据,我们能否训练一个二元分类器,可以预测特定用户最终是否会购买产品?
首先,让我们探索可用于解决这个问题的历史标记数据集:
x € ℜ^b, y € {0,1}
对于特定示例,当y = 1 时,我们称之为正类,当y = 0 时,我们称之为负类。
尽管正类和负类的级别可以任意选择,但定义正类为感兴趣的事件是一个好的做法。如果我们试图为银行标记欺诈交易,那么正类(即y = 1)应该是欺诈交易,而不是相反。
现在,让我们来看一下以下内容:
- 实际标签,用y表示
- 预测的标签,用*y`*表示
请注意,对于我们的分类器挑战,示例中找到的标签的实际值由y表示。如果在我们的示例中,有人购买了一个物品,我们说y = 1。预测值由y`表示。输入特征向量x的维度为 4。我们想确定用户在给定特定输入时购买的概率是多少。
因此,我们希望确定在给定特征向量x的特定值时y = 1 的概率。从数学上讲,我们可以表示如下:
现在,让我们看看如何处理和组装特征向量x中的不同输入变量。在下一节中,将更详细地讨论使用处理管道组装x的不同部分的方法。
使用数据处理管道进行特征工程
为了选择一个特定的机器学习算法的数据准备被称为特征工程,它是机器学习生命周期的一个关键部分。特征工程在不同的阶段或阶段进行。用于处理数据的多阶段处理代码被统称为数据管道。在可能的情况下使用标准处理步骤制作数据管道,使其可重用并减少训练模型所需的工作量。通过使用更多经过测试的软件模块,代码的质量也得到了提高。
让我们为分类器挑战设计一个可重用的处理管道。如前所述,我们将准备数据一次,然后将其用于所有分类器。
导入数据
这个问题的历史数据存储在一个名为dataset
的文件中,格式为.csv
。我们将使用 pandas 的pd.read_csv
函数将数据导入为数据框:
dataset = pd.read_csv('Social_Network_Ads.csv')
特征选择
选择与我们想要解决的问题相关的特征的过程称为特征选择。这是特征工程的一个重要部分。
一旦文件被导入,我们删除User ID
列,该列用于识别一个人,并且在训练模型时应该被排除:
dataset = dataset.drop(columns=['User ID'])
现在让我们预览数据集:
dataset.head(5)
数据集如下:
现在,让我们看看如何进一步处理输入数据集。
独热编码
许多机器学习算法要求所有特征都是连续变量。这意味着如果一些特征是类别变量,我们需要找到一种策略将它们转换为连续变量。独热编码是执行这种转换的最有效方式之一。对于这个特定的问题,我们唯一的类别变量是Gender
。让我们使用独热编码将其转换为连续变量:
enc = sklearn.preprocessing.OneHotEncoder() enc.fit(dataset.iloc[:,[0]]) onehotlabels = enc.transform(dataset.iloc[:,[0]]).toarray() genders = pd.DataFrame({'Female': onehotlabels[:, 0], 'Male': onehotlabels[:, 1]}) result = pd.concat([genders,dataset.iloc[:,1:]], axis=1, sort=False) result.head(5)
一旦转换完成,让我们再次查看数据集:
请注意,为了将变量从类别变量转换为连续变量,独热编码已将Gender
转换为两个单独的列——Male
和Female
。
指定特征和标签
让我们指定特征和标签。我们将使用y
来代表标签,X
代表特征集:
y=result['Purchased'] X=result.drop(columns=['Purchased'])
X
代表特征向量,包含我们需要用来训练模型的所有输入变量。
将数据集分为测试和训练部分
现在,让我们使用sklearn.model_selection import train_test_split
将训练数据集分为 25%的测试部分和 75%的训练部分:
#from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
这已经创建了以下四个数据结构:
X_train
:包含训练数据特征的数据结构X_test
:包含训练测试特征的数据结构y_train
:包含训练数据集中标签值的向量y_test
:包含测试数据集中标签值的向量
缩放特征
对于许多机器学习算法,将变量从0
到1
进行缩放是一个好的做法。这也被称为特征归一化。让我们应用缩放转换来实现这一点:
from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
在我们缩放数据之后,它准备好作为输入用于我们将在后续部分中介绍的不同分类器。
评估分类器
模型训练完成后,我们需要评估其性能。为此,我们将使用以下过程:
- 我们将标签数据集分为两部分——训练部分和测试部分。我们将使用测试部分来评估训练好的模型。
- 我们将使用测试部分的特征来为每一行生成标签。这是我们的预测标签集。
- 我们将比较预测标签集与实际标签以评估模型。
除非我们试图解决的问题非常琐碎,否则在评估模型时会有一些错误分类。我们如何解释这些错误分类以确定模型的质量取决于我们选择使用的性能指标。
一旦我们有了实际标签集和预测标签集,就可以使用一系列性能指标来评估模型。用于量化模型的最佳指标将取决于我们想要解决的业务问题的要求,以及训练数据集的特征。
混淆矩阵
混淆矩阵用于总结对分类器的评估结果。二元分类器的混淆矩阵如下所示:
如果我们正在训练的分类器的标签有两个级别,则称为二元分类器。监督机器学习的第一个关键用例,特别是二元分类器,是在第一次世界大战期间用于区分飞机和飞行鸟。
分类可以分为以下四类:
- 真正例(TP):正确分类的正分类
- 真负例(TN):正确分类的负分类
- 假正例(FP):实际上是负分类的正分类
- 假阴性(FN):实际上是积极的负面分类
让我们看看如何使用这四个类别来创建各种性能指标。
性能指标
性能指标用于量化训练模型的性能。基于此,让我们定义以下四个指标:
指标 | 公式 |
准确率 | |
召回率 | |
精度 | |
F1 分数 |
准确率是所有预测中正确分类的比例。在计算准确率时,我们不区分 TP 和 TN。通过准确率评估模型是直接的,但在某些情况下,它不起作用。
让我们看看我们需要更多的东西来量化模型的性能的情况。其中之一是当我们使用模型来预测罕见事件时,比如以下的例子:
- 一个用于预测银行交易数据库中欺诈交易的模型
- 一个用于预测飞机发动机零部件机械故障可能性的模型
在这两个例子中,我们试图预测罕见事件。在这种情况下,比准确率更重要的是召回率和精度。让我们逐个来看:
- 召回率:这计算了命中率。在前面的例子中,它是模型成功标记的欺诈文件占所有欺诈文件的比例。如果在我们的测试数据集中有 100 万笔交易,其中有 100 笔被确认为欺诈交易,模型能够识别出 78 笔。在这种情况下,召回率值将是 78/100。
- 精度:精度衡量了模型标记的交易中实际上是坏的交易有多少。我们不是专注于模型未能标记的坏交易,而是想确定模型标记的坏交易有多精确。
请注意,F1 分数将召回率和精度结合在一起。如果一个模型的精度和召回率都是完美的,那么它的 F1 分数将是完美的。高 F1 分数意味着我们训练了一个高质量的模型,具有高召回率和精度。
理解过拟合
如果一个机器学习模型在开发环境中表现出色,但在生产环境中明显下降,我们说这个模型是过拟合的。这意味着训练模型过于密切地遵循训练数据集。这表明模型创建的规则中有太多细节。模型方差和偏差之间的权衡最能捕捉到这个概念。让我们逐个来看这些概念。
偏差
任何机器学习模型都是基于某些假设进行训练的。一般来说,这些假设是对一些真实世界现象的简化近似。这些假设简化了特征和特征特性之间的实际关系,并使模型更容易训练。更多的假设意味着更多的偏差。因此,在训练模型时,更简化的假设=高偏差,更符合实际现象的现实假设=低偏差。
在线性回归中,忽略了特征的非线性,并将它们近似为线性变量。因此,线性回归模型天生容易表现出高偏差。
方差
方差量化了模型在使用不同数据集训练时对目标变量的估计准确性。它量化了我们的模型的数学公式是否是底层模式的良好概括。
基于特定情景和情况的特定过拟合规则=高方差,而基于广泛情景和情况的泛化规则=低方差。
我们在机器学习中的目标是训练表现出低偏差和低方差的模型。实现这一目标并不总是容易的,通常会让数据科学家夜不能寐。
偏差-方差权衡
在训练特定的机器学习模型时,很难确定训练模型所包含的规则的正确泛化级别。为了找到正确的泛化级别而进行的挣扎被称为偏差-方差权衡。
请注意,更简化的假设=更泛化=低方差=高方差。
偏差和方差之间的权衡是由算法的选择、数据的特征和各种超参数决定的。根据您尝试解决的具体问题的要求,重要的是在偏差和方差之间取得正确的折衷。
指定分类器的阶段
一旦标记的数据准备好,分类器的开发包括训练、评估和部署。在以下图表中,CRISP-DM(数据挖掘的跨行业标准流程)生命周期展示了实施分类器的这三个阶段(CRISP-DM 生命周期在第五章*,图形算法中有更详细的解释)
在实施分类器的前两个阶段——测试和训练阶段,我们使用标记的数据。标记的数据被分成两个分区——一个更大的分区称为训练数据,一个更小的分区称为测试数据。使用随机抽样技术将输入的标记数据分成训练和测试分区,以确保两个分区都包含一致的模式。请注意,如前图所示,首先是训练阶段,使用训练数据来训练模型。训练阶段结束后,使用测试数据评估训练模型。不同的性能指标用于量化训练模型的性能。评估模型后,我们有模型部署阶段,其中训练好的模型被部署并用于推理,通过标记未标记的数据解决现实世界的问题。
现在,让我们看一些分类算法。
我们将在接下来的部分中看到以下分类算法:
- 决策树算法
- XGBoost 算法
- 随机森林算法
- 逻辑回归算法
- 支持向量机(SVM)算法
- 朴素贝叶斯算法
让我们从决策树算法开始。
决策树分类算法
决策树基于递归分区方法(分而治之),生成一组规则,可用于预测标签。它从根节点开始,分成多个分支。内部节点表示对某个属性的测试,测试的结果由分支到下一级表示。决策树以包含决策的叶节点结束。当分区不再改善结果时,过程停止。
理解决策树分类算法
决策树分类的显著特点是生成可解释的层次规则,用于在运行时预测标签。该算法具有递归性质。创建这些规则层次涉及以下步骤:
- 找到最重要的特征:在所有特征中,算法确定了最能区分训练数据集中数据点的特征。计算基于信息增益或基尼不纯度等指标。
- 分叉:使用最重要的特征,算法创建一个标准,用于将训练数据集分成两个分支:
- 通过满足标准的数据点
- 未通过标准的数据点
- 检查叶节点:如果任何结果分支大多包含一个类的标签,则该分支被确定为最终分支,形成一个叶节点。
- 检查停止条件并重复:如果未满足提供的停止条件,则算法将返回到步骤 1进行下一次迭代。否则,模型被标记为已训练,并且结果决策树的每个最低级节点都被标记为叶节点。停止条件可以简单地定义为迭代次数,或者可以使用默认的停止条件,即一旦每个叶节点达到一定的同质性水平,算法就会停止。
决策树算法可以用以下图解释:
在上图中,根节点包含一堆圆圈和十字。该算法创建了一个标准,试图将圆圈与十字分开。在每个级别,决策树创建数据的分区,预期从第 1 级开始越来越同质。完美的分类器只包含只包含圆圈或十字的叶节点。由于训练数据集固有的随机性,训练完美的分类器通常很困难。
使用决策树分类算法进行分类器挑战
现在,让我们使用决策树分类算法来解决我们之前定义的常见问题,预测客户最终是否购买产品:
- 首先,让我们实例化决策树分类算法,并使用我们为分类器准备的训练部分数据来训练模型:
classifier = sklearn.tree.DecisionTreeClassifier(criterion = 'entropy', random_state = 100, max_depth=2) classifier.fit(X_train, y_train)
- 现在,让我们使用我们训练好的模型来预测我们标记数据的测试部分的标签。让我们生成一个可以总结我们训练好的模型性能的混淆矩阵:
import sklearn.metrics as metrics y_pred = classifier.predict(X_test) cm = metrics.confusion_matrix(y_test, y_pred) cm
这给出了以下输出:
- 现在,让我们通过使用决策树分类算法来计算所创建分类器的
准确率
、召回率
和精确度
值:
accuracy= metrics.accuracy_score(y_test,y_pred) recall = metrics.recall_score(y_test,y_pred) precision = metrics.precision_score(y_test,y_pred) print(accuracy,recall,precision)
- 运行上述代码将产生以下输出:
性能指标帮助我们比较不同的训练建模技术。
决策树分类器的优势和劣势
在本节中,让我们看看使用决策树分类算法的优势和劣势。
优势
以下是决策树分类器的优势:
- 使用决策树算法创建的模型的规则可被人类解释。这样的模型被称为白盒模型。白盒模型是在需要追踪决策的细节和原因时的必要条件。这种透明性在我们想要防止偏见和保护脆弱社区的应用中至关重要。例如,在政府和保险行业的关键用例中,通常需要白盒模型。
- 决策树分类器旨在从离散问题空间中提取信息。这意味着大多数特征都是类别变量,因此使用决策树来训练模型是一个不错的选择。
劣势
以下是决策树分类器的弱点:
- 如果决策树分类器生成的树太深,规则会捕捉太多细节,导致过拟合的模型。在使用决策树算法时,我们需要意识到决策树容易过拟合,因此我们需要及时修剪树以防止这种情况。
- 决策树分类器的一个弱点是它们无法捕捉规则中的非线性关系。
用例
在本节中,让我们看看决策树算法用于哪些用例。
每个程序员都应该知道的 40 个算法(二)(4)https://developer.aliyun.com/article/1506346