决策树完全指南
关于机器学习中的顶级算法,你需要知道的一切
Photo by Helena Hertz on Unsplash
一开始,学习机器学习(ML)可能会令人生畏。像“梯度下降”、“潜在狄利克雷分配”或“卷积层”这样的术语会吓到很多人。但是也有友好的方式进入这个领域,我认为从决策树开始是一个明智的决定。
决策树可能是最有用的监督学习算法之一。与无监督学习(没有输出变量来指导学习过程,数据由算法探索以找到模式)相反,在监督学习中,你的现有数据已经被标记,你知道你想要在你获得的新数据中预测哪种行为。这是自动驾驶汽车用来识别行人和物体的算法类型,或者是组织用来估计客户终身价值和客户流失率的算法类型。
在某种程度上,监督学习就像跟着老师学习,然后将知识应用到新数据中。
DTs 是 ML 算法,它基于一个描述性特征将数据集逐步分成更小的数据组,直到它们达到足够小的集合,可以用某个标签来描述。他们要求你有被标记的数据(用一个或多个标签标记,像植物图片中的植物名称),所以他们试图根据这些知识标记新的数据。
DTs 算法完美地解决了分类问题(机器将数据分类到类别中,如电子邮件是否是垃圾邮件)和回归问题(机器预测值,如房地产价格)。当因变量为连续变量或定量变量时,使用回归树(例如,如果我们想要估计客户拖欠贷款的概率),当因变量为分类变量或定性变量时,使用分类树(例如,如果我们想要估计一个人的血型)。
DTs 的重要性依赖于它们在现实世界中有很多应用的事实。作为 ML 中最常用的算法之一,它们被应用于几个行业中的不同功能:
- DTs 正被用于医疗保健行业,以改善早期检测认知障碍中阳性病例的筛查,并识别未来发展为某种类型痴呆症的主要风险因素。
- 索菲娅,成为沙特公民的机器人,使用 DTs 算法与人类聊天。事实上,使用这些算法的聊天机器人已经通过应用创新的调查和友好的聊天从客户那里收集数据,为健康保险等行业带来了好处。谷歌最近收购了 Onward ,这是一家使用 DTs 开发聊天机器人的公司,这些聊天机器人在提供世界一流的客户服务方面具有非凡的功能,而亚马逊也在向同一方向投资,以引导客户快速找到解决方案。
- 通过训练 DTs 从卫星图像中识别森林损失的不同原因,有可能预测森林干扰的最可能原因,如野火、植树造林、大规模或小规模农业以及城市化。DTs 和卫星图像也被用于农业对不同的作物类型进行分类,并识别它们的物候阶段。
- DTs 是对文本进行情感分析并识别其背后的情感的伟大工具。情绪分析是一种强大的技术,可以帮助组织了解客户的选择和他们的决策驱动因素。
- 在环境科学中,DTs 可以帮助确定应对入侵物种的最佳策略,范围从根除到遏制,以及减缓扩散。
- DTs 还用于改进金融欺诈检测。麻省理工学院表明,它可以通过使用经过多种原始数据来源训练的 DTs 来显著提高替代性 ML 模型的性能,以找到与欺诈案件相匹配的交易和信用卡模式。
由于各种原因,DTs 非常受欢迎,因为它们的可解释性可能是它们最重要的优势。它们可以很快被训练出来,而且很容易理解,这为它们打开了通向远远超越科学壁垒的新领域的可能性。如今,DTs 在商业环境中非常流行,其使用也扩展到了民用领域,其中一些应用引起了极大的关注。
芝麻信用公司(隶属于阿里巴巴的一家公司)使用 DTs 和其他算法来构建一个社会评估系统,考虑了各种因素,如支付账单和其他在线活动的准时性。在中国,一个好的“芝麻分”的好处包括在交友网站上更高的知名度,以及在你需要看医生时不用排队。事实上,在中国政府宣布将把所谓的社会信用体系应用于航班和火车,并在一年内禁止有不良行为的人乘坐此类交通工具后,人们担心该体系最终会产生一个庞大的“ML 支持的老大哥”。
基础知识
在电影 Bandersnatch (来自网飞的独立黑镜剧集)中,观众可以互动地选择不同的叙事路径,到达不同的故事线和结局。在电影讲故事的背后隐藏着一系列复杂的决定,让观众以一种选择自己的冒险模式移动,为此网飞必须找到一种方法,在以简单的方式呈现每个场景的同时加载多个版本。实际上,网飞制片人所做的是将电影分段,并为观众设置不同的分支点,从而得出不同的结果。换句话说,这就像建造一台 DT 一样。
DTs 由节点、分支和叶子组成。每个节点代表一个属性(或特征),每个分支代表一个规则(或决策),每个叶子代表一个结果。树的深度由层数定义,不包括根节点。
In this example, a DT of 2 levels.
DTs 对数据应用自上而下的方法,因此给定一个数据集,它们试图对它们之间相似的观察值进行分组和标记,并寻找最佳规则来拆分它们之间不相似的观察值,直到它们达到一定程度的相似性。
他们使用分层拆分过程,在每一层,他们尝试将数据拆分成两个或更多组,以便属于同一组的数据彼此最相似(同质性),而组之间尽可能不同(异质性)。
分割可以是二进制(将每个节点分割成最多两个子组,并尝试找到最佳分割),或多路(将每个节点分割成多个子组,使用与现有不同值一样多的分割)。在实践中,通常会看到带有二进制拆分的 DTs,但是知道多路拆分有一些优点是很重要的。多路分割耗尽了一个名义属性中的所有信息,这意味着一个属性很少在从根到叶的任何路径中出现一次以上,这使得 DTs 更容易理解。事实上,分割数据的最佳方式可能是为给定的要素找到一组间隔,然后根据这些间隔将数据分割成几个组。
On the left hand side, a DT with binary splitting, as opposed to a DT with multiway splitting on the right.
在二维术语中(仅使用 2 个变量),DTs 将数据领域划分为一组矩形,并在每个矩形中建立一个模型。它们简单而强大,对于数据科学家来说是一个很好的工具。
Right figure shows the partition of the bidimensional data space produced by the DT on the left (binary split). In practice, however, DTs use numerous variables (usually more than 2).
DT 中的每个节点都充当某个条件的测试用例,从该节点开始的每个分支都对应于该测试用例的一个可能的答案。
修剪那棵树
随着 DTs 中拆分数量的增加,它们的复杂性也会增加。一般来说,简单的 DTs 比超级复杂的 DTs 更受欢迎,因为它们更容易理解,并且不太可能陷入过度拟合。
过度拟合指的是一种模型,它对训练数据(它用来学习的数据)学习得如此之好,以至于它在推广到新的(看不见的)数据时遇到了问题。
换句话说,模型学习训练数据中的细节和噪声(数据集中不相关的信息或随机性),以至于对模型在新数据上的性能产生负面影响。这意味着训练数据中的噪声或随机波动被模型拾取并学习为概念。
While the black line fits the data well, the green line is overfitting
在这种情况下,您的模型可以很好地处理您预先提供的数据,但是当您将相同的模型暴露给新数据时,它就会崩溃。它无法重复其高度细致的表演。
那么,如何避免 DTs 中的过拟合呢?您需要排除非常适合数据的分支。您需要一个能够归纳新数据并很好地处理新数据的 DT,即使这可能意味着失去训练数据的精度。避免像鹦鹉学舌一样学习和重复特定细节的 DT 模型总是更好,并尝试开发一种具有能力和灵活性的模型,以便在您提供给它的新数据上有体面的性能。
修剪是一种用于处理过度拟合的技术,它通过删除树中几乎没有预测或分类能力的部分来减小 DTs 的大小。
这一过程的目的是通过减少过拟合的影响和去除可能基于噪声或错误数据的 DT 部分来降低复杂性和获得更好的精度。在 DTs 上执行修剪有两种不同的策略:
- **预修剪:**当信息变得不可靠时,停止生长 DT 分支。
- **后期剪枝:**当您获取一个完全成长的 DT,然后仅当它导致更好的模型性能时才删除叶节点。这样,当无法进一步改进时,您就可以停止删除节点。
Example of an unpruned DT, as taken from DataCamp
总之,正确分类或预测训练数据的每个示例的大 DT 可能不如不完全适合所有训练数据的较小 DT 好。
主要 DTs 算法
现在您可能会问自己:DTs 如何知道选择哪些特性以及如何拆分数据?为了理解这一点,我们需要了解一些细节。
所有的 DTs 基本上执行相同的任务:它们检查数据集的所有属性,通过将数据分成子组来找到可能给出最佳结果的属性。他们通过将子组分成越来越小的单元来递归地执行这个任务,直到树完成(由特定标准停止)。
进行拆分的决策会严重影响树的准确性和性能,对于该决策,DTs 可以使用不同的算法,这些算法在树的可能结构(例如,每个节点的拆分数量)、如何执行拆分的标准以及何时停止拆分方面有所不同。
那么,我们如何定义拆分哪些属性,何时拆分以及如何拆分呢?要回答这个问题,我们必须回顾一下主要的 DTs 算法:
CHAID
卡方自动交互检测(CHAID)是最古老的 DT 算法方法之一,它产生适合分类和回归任务的多路DT(分裂可以有两个以上的分支)。在构建分类树(因变量本质上是分类的)时,CHAID 依靠卡方独立性测试来确定每一步的最佳分割。卡方检验检查两个变量之间是否存在关系,并应用于 DT 的每个阶段,以确保每个分支与响应变量的统计显著预测值显著相关。
换句话说,它选择与因变量相互作用最强的自变量。
此外,就因变量而言,如果每个预测值的类别彼此之间没有显著差异,则将它们合并。在回归树(因变量是连续的)的情况下,CHAID 依靠 F 检验(而不是卡方检验)来计算两个总体均值之间的差异。如果 f 检验显著,则创建一个新分区(子节点)(这意味着该分区在统计上不同于父节点)。另一方面,如果目标平均值之间的 f 检验结果不显著,则类别被合并到单个节点中。
CHAID 不会替换丢失的值,并将它们作为一个单独的类来处理,如果合适的话,该类可以与另一个类合并。它还产生了倾向于更宽而不是更深的 DTs(多路特性),这可能是不切实际的短,并且很难与真实的业务条件相关联。此外,它没有修剪功能。
虽然不是最强大的(在检测最小可能的差异方面)或最快的 DT 算法,但 CHAID 易于管理,灵活,非常有用。
你可以在这个链接中找到 CHAID 和 R 的实现
手推车
CART 是一种 DT 算法,根据因变量(或目标变量)是分类变量还是数值变量,分别生成二进制 分类或回归树。它以原始形式处理数据(不需要预处理),并且可以在同一个 DT 的不同部分多次使用相同的变量,这可以揭示变量集之间复杂的相互依赖关系。
在分类树的情况下,CART 算法使用一种称为基尼杂质的度量来创建分类任务的决策点。 Gini 杂质给出了分裂有多精细的概念(节点“纯度”的度量),通过分裂产生的两个组中类的混合程度。当所有的观察值都属于同一个标签时,就有了一个完美的分类,基尼不纯值为 0(最小值)。另一方面,当所有观察值在不同标签中平均分布时,我们面临最坏情况的分裂结果和 0.5(最大值)的基尼杂质值。
On the left-hand side, a high Gini Impurity value leads to a poor splitting performance. On the right-hand side, a low Gini Impurity value performs a nearly perfect splitting
在回归树的情况下,CART 算法寻找最小化最小平方偏差(LSD) 的分割,在所有可能的选项中选择最小化结果的分割。 LSD (有时被称为“方差减少”)度量最小化观察值和预测值之间的平方距离(或偏差)的总和。预测值和观察值之间的差异称为“残差”,这意味着 LSD 选择参数估计值,以使残差平方和最小。
LSD 非常适合度量数据,与其他算法相比,它能够正确捕获更多有关分割质量的信息。
CART 算法背后的思想是产生一系列的 DTs,每个 DTs 都是“最优树”的候选者。通过测试(使用 DT 以前从未见过的新数据)或执行交叉验证(将数据集分成“k”个折叠,并在每个折叠上执行测试)来评估每棵树的性能,从而确定最佳树。
购物车不使用内部绩效评估进行树选择。相反,DTs 的性能总是通过测试或交叉验证来衡量,只有在评估完成后才进行树的选择。
ID3
迭代二分法 3 (ID3)是一种 DT 算法,主要用于产生分类树。由于在原始数据中构建回归树还没有被证明是如此有效,ID3 主要用于分类任务(尽管一些技术如构建数值区间可以提高其在回归树上的性能)。
ID3 分割数据属性(二分法)以找到最主要的特征,以自顶向下的方法迭代地执行这个过程以选择 DT 节点。
对于分割过程,ID3 使用信息增益度量来选择对分类最有用的属性。信息增益是从信息论中提取的一个概念,指的是一组数据中随机性水平的降低:基本上它衡量的是一个特征给我们提供了多少关于一个类的“信息”。ID3 将总是试图最大化这个度量,这意味着具有最高信息增益的属性将首先分裂。
信息增益与熵的概念直接相关,熵是对数据中不确定性或随机性的度量。熵值范围从 0(当所有成员属于同一类或样本完全同质时)到 1(当存在完全随机性或不可预测性,或样本被平分时)。
你可以这样想:如果你想做一次无偏的抛硬币,有完全随机性或者熵值为 1(“正面”和“反面”一样,概率各为 0.5)。另一方面,如果你掷一枚硬币,例如一枚两面都有“反面”的硬币,事件中的随机性被消除,熵值为 0(得到“反面”的概率将跳到 1,正面”的概率将降到 0)。
In this graph you can see the relationship between Entropy and the probability of different coin tosses. At the highest level of Entropy, the probability of getting “tails” is equal to the one of getting “heads” (0.5 each), and we face complete uncertainty. Entropy is directly linked to the probability of an event. Example taken from The Null Pointer Exception
这很重要,因为信息增益是熵的减少,并且产生最大信息增益的属性被选择用于 DT 节点。
但是 ID3 也有一些缺点:它不能处理数值属性,也不能处理缺失值,这可能会带来严重的限制。
C4.5
C4.5 是 ID3 的继任者,代表了几个方面的改进。C4.5 可以处理连续数据和分类数据,适合生成回归和分类树。此外,它可以通过忽略包含不存在数据的实例来处理缺失值。
与 ID3(使用信息增益作为分裂标准)不同,C4.5 使用增益比进行分裂过程。增益比是对信息增益概念的修改,通过在选择属性时考虑分支的数量和大小,减少了具有大量分支的 DTs 的偏差。由于信息增益显示出对具有许多结果的属性的不公平偏好,增益比通过考虑每个分割的内在信息来纠正这种趋势(它基本上通过使用分割信息值来“标准化”信息增益)。这样,具有最大增益比的属性被选择作为分割属性。
此外,C4.5 包括一项名为 windowing 的技术,该技术最初是为了克服早期计算机的内存限制而开发的。开窗意味着算法随机选择训练数据的子集(称为“窗口”),并根据该选择构建 DT。这个 DT 然后被用于分类剩余的训练数据,并且如果它执行了正确的分类,DT 就完成了。否则,所有错误分类的数据点都被添加到窗口中,并且循环重复,直到训练集中的每个实例都被当前 DT 正确分类。由于随机化的使用,这种技术通常导致比标准过程产生的 DTs 更准确的 DTs,因为它捕获了所有“罕见”的实例以及足够多的“普通”病例。
C4.5 的另一个能力是它可以修剪 DTs。
C4.5 的剪枝方法基于估计每个内部节点的错误率,并且如果叶的估计错误较低,则用叶节点替换它。简而言之,如果算法估计如果删除一个节点的“子节点”并且该节点成为叶节点,DT 将更准确,那么 C4.5 将删除这些子节点。
该算法的最新版本被称为 C5.0,它是在专有许可下发布的,对 C4.5 进行了一些改进,如:
- 速度提升: C5.0 明显快于 C4.5(快了几个数量级)。
- 内存使用: C5.0 比 C4.5 更有内存效率。
- **可变误分类成本:**在 C4.5 中,所有的错误都被同等对待,但在实际应用中,一些分类错误比其他分类错误更严重。C5.0 允许为每个预测/实际类对定义单独的成本。
- 更小的决策树: C5.0 得到的结果与 C4.5 相似,但 DTs 要小得多。
- 其他数据类型: C5.0 可以处理日期、时间,并允许将值标注为“不适用”。
- Winnowing: C5.0 可以在构造分类器之前自动对属性进行 Winnowing,丢弃那些可能没有帮助或者看起来不相关的属性。
你可以在这里找到 C4.5 和 C5.0 的比较
树的阴暗面
当然,DTs 有很多优点。由于其简单性以及易于理解和实施的事实,它们被广泛用于大量行业中的不同解决方案。但是你也需要意识到它的缺点。
DTs 倾向于在他们的训练数据上过度拟合,如果之前显示给他们的数据与之后显示给他们的数据不匹配,他们就会表现不佳。
他们还受到高方差的影响,这意味着数据中的一个小变化会导致一组非常不同的分裂,使解释变得有些复杂。它们遭受固有的不稳定性,因为由于它们的等级性质,顶部分裂中的误差的影响向下传播到下面的所有分裂。
在分类树中,错误分类观察的后果在某些类中比其他类更严重。例如,当一个人实际上会心脏病发作时,预测他/她不会心脏病发作可能比反之更糟糕。这个问题在像 C5.0 这样的算法中得到缓解,但在其他算法中仍然是一个严重的问题。
如果一些类支配其他类,DTs 也可以创建偏向树。这是不平衡数据集中的一个问题(数据集中的不同类具有不同的观察值),在这种情况下,建议在构建 DT 之前平衡 de 数据集。
在回归树的情况下,DTs 只能在他们基于之前看到的数据创建的值的范围内进行预测,这意味着他们对他们可以产生的值有边界。
在每一级,DTs 寻找可能的最佳分割,以便优化相应的分割标准。
但是 DTs 分裂算法不能看到远远超出它们正在操作的当前级别(它们是**【贪婪】**),这意味着它们在每一步都寻找局部最优而不是全局最优。
DTs 算法根据一些分裂标准一次生长一个节点的树,并且不实现任何回溯技术。
群众的力量
但是好消息是:有不同的策略来克服这些缺点。集成方法将几个 DTs 结合起来,以提高单个 DTs 的性能,并且是克服已经描述的问题的重要资源。这个想法是使用相同的学习算法训练多个模型,以获得更好的结果。
大概执行集合 DTs 的两个最常见的技术是打包和助推。
当目标是减少 DT 的方差时,使用 Bagging (或 Bootstrap Aggregation)。方差与 DTs 非常不稳定的事实有关,因为数据的微小变化可能会导致生成完全不同的树。因此,Bagging 的想法是通过并行创建随机数据子集(来自训练数据)来解决这个问题,其中任何观察都有相同的概率出现在新的子集数据中。接下来,子集数据的每个集合用于训练 DTs,产生不同 DTs 的集合。最后,使用这些不同 DTs 的所有预测的平均值,这产生了比单个 DTs 更健壮的性能。随机森林是 Bagging 的扩展,它需要额外的一步:除了获取数据的随机子集,它还需要随机选择特征,而不是使用所有特征来增长 DTs。
Boosting 是另一种创建预测值集合以减少 DT 方差的技术,但采用了不同的方法。它使用一种顺序方法来拟合连续的 DTS,并且在每一步都试图减少来自先前树的错误。使用增强技术,每个分类器都根据数据进行训练,并考虑到先前分类器的成功。在每个训练步骤之后,权重基于之前的表现被重新分配。通过这种方式,错误分类的数据会增加其权重以强调最困难的情况,以便后续的 DTs 在训练阶段关注它们并提高其准确性。与 Bagging 不同,在 Boosting 中,观察值是加权的,因此它们中的一些将更频繁地参与新的数据子集。作为该过程的结果,整个集合的组合提高了 DTs 的性能。
在 Boosting 中,有几种替代方法可以确定在训练和分类步骤中使用的权重(例如,Gradient Boost、XGBoost、AdaBoost 等)。
你可以在这里找到这两种技术的异同点
Python 线性回归完全指南
从理论到实践,学习线性回归的基本原理,并编写代码在数据集上实现它。
介绍
本文试图成为您在理解和执行线性回归时需要的参考。虽然算法很简单,但只有少数人真正理解其中的基本原理。
首先,我们将深入挖掘线性回归理论,以了解其内部工作原理。然后,我们将在 Python 中实现该算法来建模一个业务问题。
我希望这篇文章能找到你的书签!现在,让我们开始吧!
关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
该理论
How you’ll feel studying linear regression
线性回归可能是统计学习最简单的方法。对于更高级的方法来说,这是一个很好的起点,事实上,许多新奇的统计学习技术可以被视为线性回归的扩展。因此,在进入更复杂的方法之前,理解这个简单的模型将建立一个良好的基础。
线性回归很好地回答了以下问题:
- 两个变量之间有关系吗?
- 关系有多牢固?
- 哪个变量的贡献最大?
- 我们能多精确地估计每个变量的影响?
- 我们能多精确地预测目标?
- 关系是线性的吗?(咄)
- 有交互作用吗?
估计系数
假设我们只有一个变量和一个目标。然后,线性回归表示为:
Equation for a linear model with 1 variable and 1 target
在上面的等式中,β是系数。这些系数是我们用模型进行预测所需要的。
那么我们如何找到这些参数呢?
为了找到参数,我们需要最小化最小平方或误差平方和。当然,线性模型并不完美,它不会准确预测所有数据,这意味着实际值和预测值之间存在差异。误差很容易通过下式计算:
Subtract the prediction from the true value
但是为什么误差是平方的呢?
我们平方误差,因为预测可以高于或低于真实值,分别导致负的或正的差异。如果我们不对误差进行平方,误差的总和可能会因为负差异而减少,而不是因为模型非常适合。
此外,平方误差不利于较大的差异,因此最小化平方误差“保证”更好的模型。
让我们来看一个图表,以便更好地理解。
Linear fit to a data set
在上图中,红点是真实数据,蓝线是线性模型。灰色线条表示预测值和真实值之间的误差。因此,蓝线是使灰线的平方长度之和最小的线。
经过一些对本文来说过于繁琐的数学计算后,您最终可以用下面的等式来估计系数:
其中 x 条和 y 条代表平均值。
估计系数的相关性
现在你有了系数,你如何知道它们是否与预测你的目标相关?
最好的方法是找到 p 值。**p 值用于量化统计显著性;它允许判断是否要拒绝零假设。
无效假设?
对于任何建模任务,假设在特征和目标之间有某种关联。因此,零假设是相反的:在特征和目标之间没有相关性。
因此,找到每个系数的 p 值将会知道该变量对于预测目标是否具有统计显著性。根据一般经验,如果 p 值小于0.05:变量和目标之间有很强的关系。
评估模型的准确性
通过寻找变量的 p 值,您发现您的变量具有统计显著性。太好了!
现在,你怎么知道你的线性模型是好的呢?
为了进行评估,我们通常使用 RSE(剩余标准误差)和 R 统计量。
RSE formula
R² formula
第一个误差指标很容易理解:残差越低,模型就越符合数据(在这种情况下,数据越接近线性关系)。
至于 R 度量,它测量目标中可以用特征 X 解释的可变性比例。所以假设线性关系,如果特征 X 能解释(预测)目标,那么比例高,R 值会接近 1。如果相反,R 值则更接近于 0。
多元线性回归理论
在现实生活中,永远不会有单一的特征来预测目标。那么,我们一次对一个特征进行线性回归吗?当然不是。我们简单地执行多元线性回归。
该方程非常类似于简单的线性回归;简单地将预测值的数量和它们相应的系数相加:
Multiple linear regression equation. p is the number of predictors
评估预测值的相关性
以前,在简单的线性回归中,我们通过寻找特征的 p 值来评估特征的相关性。
在多元线性回归的情况下,我们使用另一个指标:F 统计量。
F-statistic formula. n is the number of data points and p is the number of predictors
这里,F 统计量是针对整个模型计算的,而 p 值是针对每个预测值的。如果有强关系,那么 F 会远大于 1。否则,它将近似等于 1。
如何使比大比 1 足够大?
这个很难回答。通常,如果有大量的数据点,F 可能略大于 1,表明有很强的关系。对于小数据集,F 值必须远大于 1,以表明强相关关系。
为什么我们不能在这种情况下使用 p 值?
由于我们正在拟合许多预测值,因此我们需要考虑有许多特征的情况( p 很大)。对于非常大量的预测值,总有大约 5%的预测值偶然具有非常小的 p 值 甚至 ,尽管它们在统计上不显著。因此,我们使用 F 统计量来避免将不重要的预测因子视为重要的预测因子。
评估模型的准确性
就像简单的线性回归一样,R 可以用于多元线性回归。但是,要知道添加更多的预测值总是会增加 R 值,因为模型必然会更好地拟合训练数据。
然而,这并不意味着它将在测试数据上表现良好(对未知数据点进行预测)。
添加交互
一个线性模型中有多个预测因子意味着一些预测因子可能会对其他预测因子产生影响。
例如,你想预测一个人的工资,知道她的年龄和上学的年数。当然,一个人越老,他在学校度过的时间就越多。那么我们如何对这种互动效应建模呢?
考虑这个非常简单的例子,有两个预测值:
Interaction effect in multiple linear regression
如你所见,我们简单地将两个预测因子相乘,并关联一个新的系数。简化公式,我们现在看到系数受另一个特征的值的影响。
作为一般规则,如果我们包括交互模型,我们应该包括特征的个体效应,即使它的 p 值不显著。这就是所谓的等级原则。这背后的基本原理是,如果两个预测者相互作用,那么包括他们各自的贡献将对模型产生很小的影响。
好吧!现在我们知道了它是如何工作的,让我们让它工作吧!我们将通过 Python 中的简单和多元线性回归来工作,我将展示如何在这两种情况下评估参数和整体模型的质量。
你可以在这里抓取代码和数据。
我强烈建议您在自己的 Jupyter 笔记本中遵循并重新创建这些步骤,以充分利用本教程。
我们开始吧!
We all code like this, right?
介绍
数据集包含关于花费在广告上的钱及其产生的销售额的信息。钱花在了电视、广播和报纸广告上。
目标是使用线性回归来了解广告支出如何影响销售。
导入库
使用 Python 的优势在于,我们可以访问许多库,这些库允许我们快速读取数据、绘制数据并执行线性回归。
我喜欢在笔记本顶部导入所有必要的库,以保持一切井然有序。导入以下内容:
import pandas as pd
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_scoreimport statsmodels.api as sm
读取数据
假设您下载了数据集,将它放在项目文件夹内的一个data
目录中。然后,像这样读取数据:
data = pd.read_csv("data/Advertising.csv")
为了查看数据的样子,我们执行以下操作:
data.head()
你应该看看这个:
如您所见,列Unnamed: 0
是多余的。因此,我们删除它。
data.drop(['Unnamed: 0'], axis=1)
好了,我们的数据是干净的,可以进行线性回归了!
简单线性回归
系统模型化
对于简单的线性回归,我们只考虑电视广告对销售的影响。在开始建模之前,让我们看一下数据是什么样子的。
我们使用matplotlib
,一个流行的 Python 绘图库来制作散点图。
plt.figure(figsize=(16, 8))
plt.scatter(
data['TV'],
data['sales'],
c='black'
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()
运行这个代码单元,您应该会看到这个图形:
Scatter plot of money spent on TV ads and sales
正如你所看到的,在电视广告上的花费和销售额之间有着明显的关系。
让我们看看如何生成该数据的线性近似值。
X = data['TV'].values.reshape(-1,1)
y = data['sales'].values.reshape(-1,1)reg = LinearRegression()
reg.fit(X, y)print("The linear model is: Y = {:.5} + {:.5}X".format(reg.intercept_[0], reg.coef_[0][0]))
就这样?
是啊!对数据集拟合一条直线并查看方程的参数就是这么简单。在这种情况下,我们有
Simple linear regression equation
让我们想象一下这条线是如何拟合数据的。
predictions = reg.predict(X)plt.figure(figsize=(16, 8))
plt.scatter(
data['TV'],
data['sales'],
c='black'
)
plt.plot(
data['TV'],
predictions,
c='blue',
linewidth=2
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()
现在,你看:
Linear fit
从上图来看,似乎一个简单的线性回归可以解释电视广告支出和销售额的总体影响。
评估模型的相关性
现在,如果你还记得这篇文章中的内容,为了看看这个模型是否好,我们需要看看每个系数的 R 值和 p 值*。*
我们是这样做的:
*X = data['TV']
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())*
这给了你这个可爱的输出:
R² and p-value
查看这两个系数,我们有一个非常低的 p 值(尽管它可能不完全是 0)。这意味着这些系数和目标(销售额)之间有很强的相关性。
然后,看 R 值,我们有 0.612。因此,大约 60%的销售变化可以用花在电视广告上的金额来解释。这没问题,但肯定不是我们能准确预测销售的最好方法。当然,在报纸和广播广告上的花费肯定会对销售产生一定的影响。
让我们看看多元线性回归是否会表现得更好。
多元线性回归
系统模型化
就像简单的线性回归一样,我们将定义我们的特性和目标变量,并使用 scikit-learn 库来执行线性回归。
*Xs = data.drop(['sales', 'Unnamed: 0'], axis=1)
y = data['sales'].reshape(-1,1)reg = LinearRegression()
reg.fit(Xs, y)print("The linear model is: Y = {:.5} + {:.5}*TV + {:.5}*radio + {:.5}*newspaper".format(reg.intercept_[0], reg.coef_[0][0], reg.coef_[0][1], reg.coef_[0][2]))*
仅此而已!从这个代码单元,我们得到下面的等式:
Multiple linear regression equation
当然,我们无法想象所有三种媒体对销售的影响,因为它总共有四个维度。
请注意,报纸的系数是负的,但也相当小。与我们的模型相关吗?让我们通过计算每个系数的 F 统计量、R 值和 p 值来看看。
评估模型的相关性
正如您所料,这里的过程与我们在简单线性回归中所做的非常相似。
*X = np.column_stack((data['TV'], data['radio'], data['newspaper']))
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())*
您会得到以下结果:
R², p-value and F-statistic
可以看到,R 远高于简单线性回归,其值为 0.897 !
还有,F 统计量是 570.3 。这比 1 大得多,而且由于我们的数据集相当小(只有 200 个数据点),它表明广告支出和销售之间有很强的关系。
最后,因为我们只有三个预测值,所以我们可以考虑它们的 p 值来确定它们是否与模型相关。当然,您会注意到第三个系数(报纸的系数)有一个很大的 p 值。因此,报纸上的广告支出在统计上并不显著。移除那个预测因子会稍微降低 R 值,但我们可能会做出更好的预测。
你真棒🤘。祝贺你坚持到最后,你现在是线性回归的大师了!
如上所述,这可能不是性能最好的算法,但对理解线性回归很重要,因为它是更复杂的统计学习方法的基础。
我希望你有时间会回头参考这篇文章。
干杯!
Python 中重采样方法和正则化的完整指南
了解重采样方法和正则化如何改进模型,并在项目设置中应用这些方法。
Please, use resampling methods
重采样和正则化是两个重要的步骤,可以显著提高模型的性能和对模型的信心。
在本文中,交叉验证将被广泛讨论,因为它是最流行的重采样方法。然后,将介绍岭回归和 lasso 作为线性模型的正则化方法。之后,将在项目设置中应用重采样和正则化。
我希望这篇文章能作为你未来某个项目的参考,并能成为你的书签。
我们开始吧!
关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
重采样的重要性
重采样方法是现代统计学中不可缺少的工具。它们涉及重复地从训练集中抽取样本,并在每个样本上重新拟合感兴趣的模型,以便获得关于拟合模型的附加信息。这使我们能够获得更多的信息,而这些信息是仅拟合一次模型所无法获得的。
通常,数据科学项目的目标是使用训练数据创建模型,并让它对新数据进行预测。因此,重采样方法允许我们在不收集新数据的情况下,观察模型在未经训练的数据上的表现。
交叉验证
交叉验证( CV )用于估计与模型相关的测试误差,以评估其性能或选择适当的灵活性水平。评估一个模型的性能通常被定义为模型评估,而模型选择用于选择灵活性的级别。这个术语广泛用于数据科学领域。
现在,有不同的方法来执行交叉验证。让我们逐一探索。
验证集方法
这是最基本的方法。它只是将数据集随机分为两部分:一个训练集和一个验证集或排除集。该模型适合训练集,并且该适合的模型用于对验证集进行预测。
Validation set schematic
上面是验证集方法的示意图。你在一个数据集中有 n 个观察值,它被随机分成两部分。蓝色一侧代表训练集,橙色一侧是验证集。数字只是代表行数。
当然,这种简单的方法也有一些缺点。
首先,验证测试错误率是高度可变的,这取决于训练和验证集中的观察值。
第二,只有一小部分观察值用于拟合模型。然而,我们知道统计方法在数据较少的情况下往往表现较差。
MSE for the validation set approach
在上面的左侧,您可以看到验证集方法仅应用一次时的 MSE。在右边,这个过程重复了 10 次。如你所见,MSE 变化很大。
这显示了使用验证集方法时 MSE 的显著可变性。
当然,有一些方法可以解决这些缺点。
留一交叉验证
留一交叉验证( LOOCV )是比验证集方法更好的选择。不是将数据集分成两个子集,而是只使用一个观察值进行验证,其余的用于拟合模型。
LOOCV schematic
以上是 LOOCV 的示意图。如您所见,只有一个观察用于验证,其余的用于训练。然后,该过程重复多次。
多次运行后,误差估计为:
LOOCV estimated error
这仅仅是每次运行的误差的平均值。
这种方法要好得多,因为它的偏差要小得多,因为更多的观察数据被用来拟合模型。在训练/验证集分割中没有随机性。因此,我们降低了 MSE 的可变性,如下所示。
MSE of LOOCV
k 倍交叉验证
这种方法包括将一组观察值随机分成大小大致相同的 k 组或组。第一个折叠被视为验证集,模型适合其余的折叠。然后重复该过程 k 次,其中不同的组被视为验证集。
k-fold cross-validation schematic
因此,你意识到 LOOCV 是一个特殊的 k 重交叉验证案例,其中 k等于观察总数 n 。但是,通常将 k 设置为等于 5 或 10。
尽管 LOOCV 对于大型数据集来说是计算密集型的,但是 k-fold 更通用,可以用于任何模型。此外,它通常比 LOOCV 给出更准确的测试误差估计。因此,要评估和验证您的模型,k 倍交叉验证方法是最佳选择。
既然我们知道了交叉验证是如何工作的,以及它如何提高我们对模型性能的信心,那么让我们看看如何通过正则化来改进模型本身。
正规化
正则化方法有效地防止了过度拟合。当模型在训练集上表现良好,但在验证集上表现不佳时,就会发生过度拟合。
我们已经看到,线性模型,如线性回归和推而广之的逻辑回归,使用最小二乘法来估计参数。
现在,我们探索如何通过用其他拟合过程代替最小二乘拟合来改进线性模型。这些方法将产生更好的预测精度和模型可解释性。
但是为什么呢?为什么要用其他拟合方式?
最小二乘拟合在大多数情况下是可行的,但也有失败的情况。
例如,如果您的观察值数量 n 大于预测值数量 p ,那么最小二乘估计将具有较低的方差,并且表现良好。另一方面,当 p 大于 n (预测值多于观测值)时,方差为无穷大,该方法无法使用!
此外,多元线性回归往往会增加与响应实际不相关的变量。这给模型增加了不必要的复杂性。如果有一种方法可以自动执行特征选择,比如只包含最相关的变量,那就太好了。
为了实现这一点,我们引入了岭回归和套索。这是两种常见的正则化方法,也称为收缩方法。
收缩方法
将估计的系数向 0 收缩可以显著提高拟合度并减少系数的方差。在这里,我们探讨岭回归和套索。
里脊回归
传统的线性拟合涉及最小化 RSS(残差平方和)。在岭回归中,添加了一个新参数,现在参数将最小化:
其中λ为调谐参数。使用交叉验证找到该参数,因为它必须最小化测试误差。因此,使用范围λ来拟合模型,并且最小化测试误差的λ是最佳值。
这里,岭回归将包括模型中所有的 p 预测值。因此,这是一种提高模型拟合度的好方法,但它不会执行变量选择。
套索
与岭回归类似,套索将最小化:
注意,我们使用参数β的绝对值,而不是它的平方值。此外,还存在相同的调谐参数。
然而,如果λ足够大,一些系数将有效地为 0!因此,lasso 还可以执行变量选择,使模型更容易解释。
项目
太好了!我们知道正则化和重采样是如何工作的。现在,让我们在项目设置中应用这些技术。
打开 Jupyter 笔记本,获取数据集。如果你遇到困难,还可以使用解决方案笔记本。
我们开始吧!
导入库
像任何项目一样,我们导入常用的库来帮助我们执行基本的数据操作和绘图。
现在,我们可以开始探索性的数据分析了。
探索性数据分析
我们从导入数据集开始,查看前五行:
您应该看到:
请注意,未命名:0 列是无用的。让我们把它拿出来。
现在,我们的数据集看起来像这样:
如你所见,我们只有三种广告媒体,而销售额是我们的目标变量。
让我们通过绘制散点图来看看每个变量是如何影响销售的。首先,我们构建一个辅助函数来绘制散点图:
现在,我们可以为每个特征生成三个不同的图。
您会得到以下结果:
Sales with respect to money spend on TV ads
Sales with respect to money spent on radio ads
Sales with respect to money spent on newspaper ads
正如你所看到的,电视和广播广告似乎是销售的良好预测,而销售和报纸广告之间似乎没有相关性。
幸运的是,我们的数据集不需要进一步处理,所以我们准备好马上开始建模了!
系统模型化
多元线性回归—最小二乘拟合
在浏览之前,让我们先看看代码是什么样子的。
首先,我们导入 LinearRegression 和 cross_val_score 对象。第一个对象将允许我们拟合一个线性模型,而第二个对象将执行 k-fold 交叉验证。
然后,我们定义我们的特征和目标变量。
cross_val_score 将返回每个交叉验证步骤的 MSE 数组。在我们的例子中,我们有五个。所以我们取 MSE 的平均值,打印出来。您应该得到-3.0729 的负 MSE。
现在,我们来看看岭回归和套索哪个会更好。
里脊回归
对于岭回归,我们引入 GridSearchCV 。这将允许我们使用一系列不同的正则化参数自动执行 5 重交叉验证,以便找到α的最佳值。
代码如下所示:
然后,我们可以通过以下公式找到最佳参数和最佳 MSE:
您应该看到 alpha 的最佳值是 20,MSE 为负-3.07267。这是对基本多元线性回归的一点改进。
套索
对于 lasso,我们遵循与岭回归非常相似的过程:
在这种情况下, alpha 的最优值为 1,负的 MSE 为-3.0414,这是三个模型中最好的分数!
就是这样!现在,您已经了解了重采样和正则化如何极大地改进您的模型,并且知道了如何在项目设置中实现这两种方法。
我希望这篇文章对你有用,并且你可以参考它。
干杯!
开始数据科学和人工智能之旅的完整指南。
人工智能和数据科学已经是每个人都应该发展的技能。根据本指南,我们将快速浏览一个教程,向您展示如何开始这一技术之旅(学习和应用技能的平台、在您的计算机上安装、有用的软件)。在本文结束时,你将能够运行你的第一个机器学习程序!这个指南是为非专业人士设计的,所以不用担心!😃
你现在已经准备好开始你的数据科学&人工智能之旅。欢迎登机!
让自己为数据科学做好准备
软技能
教员自学
数据科学/人工智能/机器学习/深度学习,所有这些领域目前都在定义中。所以首先要学习的是永远积极学习的能力。
对某事没有把握?寻找监督算法的定义?你程序中的一个错误?Googleit(或者使用其他任何搜索引擎作为 Qwant 或者 Ecosia )!小心你的消息来源,因为人工智能是一个新的领域,你可能会看到许多不同的,有时是矛盾的信息。在这里,没有人有关于定义或知识的绝对真理。搜索、互动和构建你自己的想法!这也是我推荐向协作平台学习的原因。在人工智能等热门话题上,协作平台是一个很好的信息来源,因为你可以浏览讨论主题,识别人物,并能够质疑任何答案或询问更多细节。如果你有问题或疑问,你可以确定在你之前已经有人在某个网站上问过了。你可能已经能够帮助别人了,所以不要犹豫,贡献自己的力量吧:
当你在机器学习方面更高级一点的时候你的主要参考资料将会是来自图书馆的文档,例如来自 scikit-learn here 或 Tensorflow 和 Pytorch 的文档。
硬技能
数学和统计知识
机器学习、数据科学和人工智能需要很强的数学和统计知识。以下是您开始了解数据科学必须经历的知识领域(请不要犹豫,用一些其他领域来补充列表) :
资源:
面向数据科学的 Python
Python 是一种用于很多事情的语言(网站、游戏、应用程序、后端、数据库管理……)。要将 Python 用于数据科学,您需要:
- 理解语言的共同逻辑
- 学习如何使用库
数据科学中最常见的图书馆是什么?
Pandas 用于数据操作,seaborn/matplotlib 用于数据可视化,numpy 用于数学操作,sklearn 用于算法使用,keras、pytorch 和 tensorflow 用于更高级的使用(例如像神经网络)。
资源:
- 微软推出 Python
- 杰克·范德普拉斯的《Python 数据科学手册》
- 密歇根大学的 Python 应用数据科学
数据科学课程
一旦你掌握了所有这些数学和代码知识,是时候让进入数据科学领域了。你需要学习新的技能。数据科学家应该能够全面了解下面列出的所有技能。但是取决于你想专攻什么,只有少数应该掌握。
- **数据库管理:**从不同种类的源(SQL、非 SQL、结构化、非结构化、集群、文件……)访问不同种类的数据。
- **数据结构:**轻松操作和准备您的数据,包括特性工程。
- 数据可视化:通过可视化而不是阅读来理解你的数据。
- 算法:没有比尝试所有可用的算法更糟糕的了,选择一个看起来“更好”的算法,这是浪费时间。每个训练有素的数据科学家都应该知道机器学习的 commons 算法是如何工作的。根据这些知识,数据科学家将能够从数据分析中选择算法。
- 评估:结合数据可视化和度量知识,数据科学家必须知道一个模型是否工作良好。
- 可解释性:我们得解开【黑匣子】的神话。机器学习的可解释性(带有一些库,如 Shap 或 Lime )帮助我们理解数据科学解决方案如何工作 。
- 网络和基础设施安全知识:不要保存、运行或部署可能对组织或您的私人笔记本电脑造成危险的解决方案。
资源:
- 斯坦福大学的机器学习
- 哈佛大学的数据科学:机器学习
学以致用!
也许我最喜欢的学习方法是通过应用即时技能来直接学习。)。你会遇到许多人谈论机器学习、数据科学、分析或人工智能,却从未接触过一行代码,我认为这是不相关的。就像 Google 说的学习数据科学:把手弄脏!
两个流行的平台将帮助您(真正地)发展您的数据科学编码技能:
- Kaggle :最受欢迎的数据科学平台,拥有一个令人敬畏的社区,可以互相学习。本指南结束后,你将能够在 Kaggle 上运行一个机器学习项目!😃
- 这个平台真的很有用,不是从竞赛中学习,而是从针对不同水平的不同挑战的专业课程中学习,去看看吧!
机器学习基础
算法?模特?这种常见的区别必须在进一步研究之前完成。
机器学习是由算法组成的,像随机森林或者著名的 XGBoost。目前,世界各地的一些天才正在开发越来越复杂的算法。感谢开源库,你不需要编写代码,只需要知道如何使用它们!;)
一个模型是更一般的东西,一个模型由几个步骤(包括算法)组成,帮助你解决一个特定的问题。
机器学习项目(我在这里包括深度学习)可以有不同的类型:
- 分类(即离散值):这类问题的目标是预测一个事件、物体、人的“类别”… 例如,如果你想预测一部手机使用哪个品牌、性能、材料、国家等。
- 回归(即连续值):这类问题的目标是预测一个特定值。例如如果你想预测一部手机的价格。**
在机器学习的这两个常见问题中,有三种方法:
- ****监督:在监督学习中,你有两种不同的列。要素列是您将从中学习预测标注列的列(大多数情况下,您必须预测一个标注列)。例如,根据六月前几个月的过去价格预测下一个六月的电话价格(以及更多其他细节,例如竞争对手、电话当前版本的材料……)
- 无监督:无监督学习更棘手,你有很多特征,你得想办法对一些事件或值进行分类。例如,预测一部新手机在六月份的价格,但是因为这是一部新手机,所以你没有任何过去的数据。你将不得不使用你拥有的其他数据来找到一个价格,例如来自其他手机的数据,这些数据将与我们的新手机最匹配。
- 强化:在强化学习的大部分时间里,你没有任何数据,你只有一些你想最大化/最小化的指标。使用不同的方法,如遗传算法,你将能够执行自动任务。例如,寻找材料的完美组合,以最大限度地提高新手机的利润。
云还是本地?
一旦你为数据科学做好准备,让我们使用一台机器,它将成为你在这个人工智能旅程中的盟友。
开始数据科学每个人的第一个问题是:我的笔记本电脑中有足够的电力来建造和创造一个终结者吗?
嗯…好问题!第一步是了解你的计算机的资源。之后就看你想做什么样的任务了。如果你想做深度学习,通过从成千上万的图像中训练自己的神经网络,你需要有一台高水平的计算机(至少有一个 Nvidia GPU 1080 和 32Go 的 RAM)。但是等等……呆在这里!
目前大多数笔记本电脑都可以用来自数据库的数据运行基本的机器学习问题(。csv)大约有 100,000 行。如果你要处理更多的数据和更复杂的数据(如图像或声音),你需要升级你的笔记本电脑。从我的角度来看,一台机器学习笔记本电脑应该至少有 16Go 的内存和 8 个处理器内核,你可以少一些,但会花更多的时间…
如果您在有限的时间内需要更多的资源,您可以使用云解决方案,这对于初学者来说可能更难处理,因为它们需要一些高级配置。不要犹豫,访问流行的机器学习云解决方案提供商,如谷歌云平台、亚马逊网络服务或微软 Azur 。
因为这个指南是为初学者准备的,我们会把所有需要的东西直接安装到你的电脑上。
让你的计算机数据科学做好准备
末端的
也许初学者看到的第一个最奇怪的东西。你会找到几个词来定义这个黑色窗口:shell / bash / cmd / prompt,姑且称之为终端吧。
该终端允许您访问您计算机的每个文件夹和配置,信不信由您,当您掌握它时,它比鼠标导航器还快!在每台计算机的鼠标控制器民主化之前,一切都是使用几个终端“命令”来访问的。
U nix?Windows?MacOS?Linux?关于终点站都是一样的吗?
Unix 是 OSX 的核心系统,也是 Linux 的灵感来源,这意味着所有的命令都是一样的。 Macbook 和 Linux 用户,你已经全部设置好了,跳到下一节!
对于 Windows 用户来说在这里停留的时间稍微长一点:-) 。从 Windows 10 开始,Windows 允许用户在终端上安装 unix 命令,对许多开发者来说是一个巨大的成功!
你可以用几种方法在 windows 上安装 unix 终端,我们将在下面看到(Git 部分)我使用的最简单的,但是这里有一个教程可以让你用 windows 安装 Unix 命令行的过程:https://goo.gl/kYm1XC
终端怎么用?简单的导航演示
- 在您的机器上安装了 unix 命令之后,打开一个搜索栏。
- 在你的终端输入
pwd
。pwd
让你看到你在哪个文件夹里。 - **键入
ls
列出可见的文件夹和文件。并键入ls --all
列出包含隐藏文件的每个文件(它们为什么被隐藏?为了简化导航,默认情况下您不会看到所有文件和文件夹。大多数时候隐藏文件是一些你不需要接触的配置文件,但是现在有了你的终端,一切都是可访问的,棒极了不是吗?) - 选择一个文件夹并键入
cd THE_NAME_OF_THE_FOLDER_HERE
- 再次键入
pwd
,你应该会看到你刚刚跳转到这个文件夹中,恭喜你完成了你的第一个终端导航! - 看一下 Unix 的完整命令集(键入
man COMMAND
以手动输入命令) - 不要犹豫,用它来感受更舒适和享受!
现在你掌握了终端,让我们安装所有我们需要的东西,开始玩人工智能!
蟒蛇和蟒蛇
是的,都是关于蛇的,但不用担心你会没事的,让我们成为耍蛇人吧;).
Anaconda 是一个框架,它以一种简单的方式在你的系统中安装你的计算机所需的所有基本的东西(库、模块、包、语言)。
图书馆?模块?包裹?语言?
- 这里我们将使用 Python 作为“代码语言”。但是你有其他几种语言可以用来编码。语言的选择取决于你想做什么(javascript 用于 web 开发,SQL 用于数据库访问,Java 用于应用开发,Swift 用于 iOS 应用……)。Python 是最著名的语言之一,因为它以简单易懂的逻辑成为人类可读的语言。
- 正如您所料,已经用 Python 编写了几个编程功能。为了不再开发其他人可能已经开发的功能**,共享代码的一种常见方式是使用库(即模块、包……)和开源代码。获得所有这些开源代码的最著名的平台是 GitHub,后面会看到如何安装和使用,不用担心。Anaconda 已经安装了下面列出的开始数据科学所需的所有基本库。**
让我们安装蟒蛇。跳转到他们的网站此处下载安装程序并遵循安装流程(适用于所有平台— Windows / macOS / Linux):
我推荐使用 Python 3.7 版本,因为所有库都停止支持 Python 2.7。在这个最新版本中,所有的库并没有全部设置好,但是不要犹豫去谷歌你可能遇到的任何困难。
作为参考,一旦 Python 安装到您的计算机上,您将真正经常使用命令pip
。pip
是一个从终端使用的库系统管理。
安装 Anaconda 后,您将能够使用conda
而不是pip
命令行。
我强烈推荐你使用环境来管理你所有的项目**,看看这里的。在一个环境中,你可以选择你想要的 python 版本,以及你想要使用的库和版本。但是您可以稍后再回来,届时您将有更多的时间来练习数据科学和编码。**
Git 和开源
让我们开始深入一点吧!Git 是一个很棒的管理和共享代码的系统。正如你可能做的那样,除非有时数百人在同一个项目上工作,你不能通过 USB 手动合并你的所有代码,或者更糟的是通过电子邮件传输。Git 带来了代码管理或版本控制系统。
要在您的机器上安装 Git,请根据您的系统(MacOs、Linux、Windows)在这里下载安装程序。这里的和是在你的机器上安装 git 的教程。
还记得如何在 windows 上管理 Unix 命令吗?
Windows 用户请按照下面几行来获取 Unix 命令!
- 打开安装程序
- 信息>点击下一步
- 选择组件>单击下一步
- 选择 Git 使用的默认编辑器>默认使用 Nano 编辑器
- 调整你的路径环境:停!选择“从命令提示符使用 Git 和可选的 Unix 工具”****
- 选择 HTTPS 传输后端>使用 OpenSSL 库
- 配置行尾转换>检出 Windows 样式,提交 Unix 样式的行尾
- 配置终端模拟器以用于 Git Bash: STOP!选择“使用 windows 的默认控制台窗口”****
- 配置额外选项>启用文件系统缓存和启用 Git 凭证管理器
- 安装并欢迎在这个惊人的新世界数十亿行代码!
快速指南这里允许你安装 Git 并理解它如何使用你新的终端命令行技能**;) 😗*
Git 平台( wut? ) 存储库是 Git 世界中的一个项目 😃。其中一些平台: Bitbucket , GitLab , CodeBase , Assembla …
最著名的平台是 Github 。
第一步:继续 Github 和创建一个账户,供日常使用顺便说一下。
你现在能够访问数十亿行代码,其中一些来自顶级科技公司,如谷歌,这将简化你进入数据科学的第一步。不要犹豫,穿过平台,发现来自脸书的密集姿势项目。**
别忘了我们都使用开源项目。请不要犹豫与社区分享你的代码贡献给开源项目**,成千上万的项目在等着你!代码是分享知识的绝佳工具,先分享后思考赚钱对每个人来说都更有利可图,让我们遵循这种心态。**
Jupyter & IDE,笔记本和脚本
。巴拉圭
作为。docx 是 Word Office,。xlsx for Excel,。图像的 png。py 是 Python 脚本的扩展。
为了访问和管理一个 Python 脚本,你有几个软件具有不同的复杂程度和不同的特性**,其中大部分被称为集成开发环境 s 的ide。让我们来介绍其中的四种,但同样不要犹豫,尝试在互联网上搜索一些其他的,找到最适合你的一种:**
- Pycharm :最完整、最稳定但也最复杂,允许你查看、停止、运行、跟踪你的代码的进程,包括 Git 和 automtic 错误控制。
- Spyder :功能比 Pycharm 少,但更容易安装,对初学者来说功能齐全。
- Visual Studio Code :一个真正简单易用的 IDE,比专业人士使用的其他 IDE 功能更少,但也非常适合初学者。
- Sublime text:最简单的用法,但是 Sublime text 允许你编辑你的代码,你需要回到你的终端来运行你的脚本。
一旦 Python 安装在你的电脑上,要运行一个
*.py*
脚本,你只需要在你的终端上输入包含你的脚本的文件夹:*python my_awesome_script.py*
。ipynb
。ipynb 是笔记本的扩展。最著名的笔记本跑垒员是【Jupyter】。****
笔记本?剧本?
它们对数据科学项目都很有用。这是一张来自最著名的数据科学平台 Kaggle 的图片,它向你解释了其中的区别。当你开始一个新项目(命名为内核)时,你必须在脚本或笔记本之间做出选择。
在全球范围内,笔记本用于数据探索/分析,并逐步多次运行模型和行,而无需回到代码执行的开始。但是由于您必须启动一个本地服务器,所以它比脚本慢,可伸缩性差。
为了在终端中安装笔记本,我们将安装 jupyter lab:
- 带
conda
:conda install -c conda-forge jupyterlab
- 与
pip
:pip install jupyterlab
这里的是完整的网站文档,但凭借你新的 git 技能,你也可以访问 Github repo !😃
安装完成后,你可以用命令行运行 Jupyter Lab:jupyter lab
让我们应用所有这些新东西!
你的第一个机器学习项目
是时候实践所有这些新知识了。这最后一部分包含一个教程,通过所需的所有步骤运行您的第一个机器学习项目:
- 初始化一个项目
- 任务理解:我们将使用著名的泰坦尼克号数据集来完成对什么样的人可能幸存的分析。特别是,我们要求您应用机器学习的工具来预测哪些乘客在悲剧中幸存下来。(感谢 Kaggle 挑战这里)**
- 数据探索/分析
- 数据可视化
- 特色工程
- 建模
- 预测
初始化项目
我做了一个项目,可以帮助你开始这个旅程。我们要用这个 github 回购。
我强烈推荐你分叉项目,以便能够修改它,随心所欲地玩它。叉子是什么?跳转到这个支持 Github 的网站这里。
- 打开终端
- 导航到所需的位置并克隆存储库,您可以使用 repo 的直接 url(
https://github.com/anisayari/your_first_machine_learning_project.git)
),但是我建议您使用分叉的 URL,看起来应该是:[https://github.com/YOURUSERNAME/your_first_machine_learning_project.git](https://github.com/YOURUSERNAME/your_first_machine_learning_project.git)
C:\Users\AAyari> cd Desktop
C:\Users\AAyari> git clone [https://github.com/anisayari/your_first_machine_learning_project](https://github.com/anisayari/your_first_machine_learning_project).git
Cloning into 'your_first_machine_learning_project'...
remote: Enumerating objects: 22, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 22 (delta 4), reused 11 (delta 0), pack-reused 0
Unpacking objects: 100% (22/22), done.
- 导航到该文件并启动 jupyter lab 查看笔记本:
C:\Users\AAyari> cd your_first_machine_learning_project
C:\Users\AAyari\Desktop\your_first_machine_learning_project> cd my_first_machine_learning_project
C:\Users\AAyari\Desktop\your_first_machine_learning_project\my_first_machine_learning_project> jupyter lab
[I 11:11:57.121 LabApp] The Jupyter Notebook is running at:
- 太好了!我们的 Jupyter 实验室正在运行,您现在可以访问您的笔记本了。Jupyter 实验室应该已经在新的浏览器标签中打开,点击文件
my_first_machine_learning_program_notebook.ipynb
。
浏览器窗口应该如下图所示:
- 好好享受这个笔记本吧!这是很好的评论,不要犹豫,通过这些线,并试图重现和改善他们。
- 你应该已经注意到
my_first_machine_learning_program.py
是内核的脚本版本。试着运行一下,看看有什么不同!你会更好的理解笔记本和剧本的区别。要运行此脚本:
C:\Users\AAyari\Desktop\your_first_machine_learning_project\my_first_machine_learning_project> python my_first_machine_learning_program.py
- 想用在 Kaggle 上?这款笔记本在 kaggle 这里有售,不要犹豫,把它“分叉”并运行它,在 kaggle 上提交你的第一个机器学习程序!
结论
现在,您应该能够:
- 知道你需要发展哪些技能和知识,以及去哪里学习
- 理解数据科学中使用的基本词汇(如笔记本、监督、模型……)
- 获得在笔记本电脑上运行和管理 python 代码所需的所有基本软件
最后但并非最不重要的,你应该能够对你的同事说你运行了你的第一个机器学习程序**!再次祝贺并感谢您阅读本指南。**
数据科学和人工智能领域是令人兴奋的知识领域,保持好奇心,在互联网上探索更多。
欢迎来到你的数据科学/人工智能之旅。
支持向量机完全指南(SVM)
理解其内部工作原理,并在四种不同的场景中实现支持向量机
What would we do without sklearn?
介绍
我们已经看到了如何使用逻辑回归、LDA 和决策树处理分类问题。现在,又引入了另一个分类工具:支持向量机。
支持向量机是一种称为最大间隔分类器的分类器的推广。最大间隔分类器很简单,但它不能应用于大多数数据集,因为类必须由线性边界分隔。
这就是为什么支持向量分类器被引入作为最大间隔分类器的扩展,其可以应用于更广泛的情况。
最后,支持向量机只是支持向量分类器的进一步扩展,以适应非线性类边界。
它可用于二元或多元分类。
解释支持向量机的理论非常专业。希望这篇文章能让你更容易理解支持向量机的工作原理。
一旦理论涵盖,你将在四个不同的场景中实现算法!
没有别的事了,让我们开始吧。
关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
There are no SVM gifs… so I had to settle for a ‘machine’ gif
最大间隔分类器
这种方法依赖于使用超平面来分离类。
什么是超平面?
在 p 维空间中,超平面是维数为 p-1 的平坦仿射子空间。视觉上,在 2D 空间中,超平面将是一条线,而在 3D 空间中,它将是一个平面。
数学上,超平面简单地说就是:
General hyperplane equation
如果 X 满足上式,则该点位于平面上。否则,它必须在平面的一侧,如下图所示。
The line represents a hyperplane in a 2D space. Points that satisfy the equation above will lie on the line, while others are on one side of the plane.
一般来说,如果可以使用超平面完美地分离数据,那么就有无限数量的超平面,因为它们可以向上或向下移动,或者稍微旋转,而不会接触到观察结果。
这就是为什么我们使用最大间隔超平面或最佳分离超平面的原因,最佳分离超平面是离观察值最远的分离超平面。我们从给定超平面的每个训练观察计算垂直距离。这就是所谓的余量。因此,最优分离超平面是具有最大余量的超平面。
Example of a maximal margin hyperplane
正如你在上面看到的,有三个点与超平面等距。这些观察结果被称为支持向量,因为如果它们的位置移动,超平面也会移动。有趣的是,这意味着超平面仅依赖于支持向量,而不依赖于任何其他观察。
如果不存在分离平面呢?
Overlapping classes where no separating hyperplane exists
在这种情况下,没有最大间隔分类器。我们使用一个支持向量分类器,该分类器可以使用一个被称为**支持向量分类器的软余量来几乎分离类别。**然而,进一步讨论这种方法变得非常技术性,因为它不是最理想的方法,我们现在将跳过这个主题。
支持向量机(SVM)
支持向量机是支持向量分类器的扩展,通过使用内核来扩大特征空间。核方法只是一种有效的计算方法,用于适应类之间的非线性边界。
在不涉及技术细节的情况下,核是量化两个观察的相似性的函数。内核可以是任何程度的。使用度大于 1 的核导致更灵活的决策边界,如下所示。
Example of classification with SVM
为了更好地理解内核的选择如何影响 SVM 算法,让我们在四个不同的场景中实现它。
项目
这个项目分为四个小项目。
第一部分将展示如何使用线性核执行分类,以及正则化参数 C 如何影响得到的超平面。
然后,第二部分将展示如何使用高斯核生成非线性超平面。
第三部分模拟重叠类,我们将使用交叉验证来找到 SVM 的最佳参数。
最后,我们使用 SVM 执行了一个非常简单的垃圾邮件分类器。
以上练习摘自吴恩达在 Coursera 上的免费课程。我简单用 Python 解决,导师不推荐。尽管如此,我还是向所有初学者强烈推荐这门课程。
一如既往,笔记本和数据在这里可用。
迷你项目 1——线性核 SVM
在我们开始之前,让我们导入一些有用的库:
注意,我们在这里导入了 loadmat ,因为我们的数据是矩阵形式的。
然后,我们将数据集的路径存储在不同的变量中:
最后,我们将构建一个函数来帮助我们快速绘制每个数据集:
完美!
现在,在这一部分,我们将使用线性核实现一个支持向量机,我们将看到正则化参数如何影响超平面。
首先,让我们加载并可视化数据:
您应该会看到:
注意上图左侧的异常值。让我们看看正则化参数在存在异常值时将如何影响超平面。
上面的代码块简单地将 SVM 拟合到数据中,我们使用预测来绘制超平面。注意,我们使用正则化参数 1。结果应该如下所示:
Hyperplane with C=1
如你所见,超平面忽略了异常值。因此,较低正则化参数将被更好地概括。测试误差通常会高于交叉验证误差。
现在,让我们增加正则化参数:
你会得到:
Hyperplane with C=100
现在,异常值在超平面的右侧,但这也意味着我们过度拟合。最终,这个边界在未观察到的数据上表现不好。
迷你项目 2——高斯核 SVM
现在,我们知道为了适应非线性边界,我们需要改变核函数。在这个练习中,我们将使用一个高斯核。
首先,让我们绘制我们的数据:
您应该会看到:
在实现 SVM 之前,您应该知道高斯核表示为:
Gaussian kernel function
注意,有一个参数 sigma 决定了当它们相距较远时,相似性度量多快变为零。
因此,我们用以下代码实现它:
你应该得到下面的超平面:
Non-linear hyperplane with a Gaussian kernel
太神奇了!超平面不是一个完美的边界,但它在分类大多数数据方面做得很好。我建议你尝试不同的 sigma 值,看看它是如何影响超平面的。
迷你项目 3——交叉验证的 SVM
交叉验证对于从我们的模型中选择最佳性能的最佳调整参数至关重要。让我们看看如何将它应用到支持向量机中。
当然,让我们看看这个练习的数据是什么样的:
你会得到:
注意我们有重叠的类。当然,我们的超平面不会尽善尽美,但我们将使用交叉验证来确保它是我们能得到的最好结果:
从上面的代码单元中,您应该得到最佳正则化参数是 1,并且 sigma 应该是 0.1。使用这些值,我们可以生成超平面:
并获得:
Hyperplane with C=1 and sigma=0.1
迷你项目 4—SVM 垃圾邮件分类
最后,我们用 SVM 训练了一个垃圾邮件分类器。在这种情况下,我们将使用线性核。此外,我们有单独的数据集用于训练和测试,这将使我们的分析更容易一些。
你可以看到,我们得到的训练准确率为 99.825%,而测试准确率为 98.9%!
就是这样!您学习了支持向量机的内部工作原理,并在四个不同的迷你项目中实现了该算法,以了解核的选择如何影响该算法,以及如何使用交叉验证。
我希望这篇文章对您有所帮助,并且希望您在想要实现 SVM 的任何时候都能回来阅读这篇文章。
干杯!
时间序列分析和预测完全指南
理解移动平均,指数平滑,平稳性,自相关,SARIMA,并在两个项目中应用这些技术。
无论我们希望预测金融市场或电力消费的趋势,时间都是我们的模型中必须考虑的重要因素。例如,预测在一天中的什么时间将会出现用电高峰是令人感兴趣的,例如调整电力的价格或产量。
输入时间序列。时间序列就是按时间顺序排列的一系列数据点。在时间序列中,时间通常是独立变量,目标通常是对未来做出预测。
然而,在处理时间序列时,还有其他方面的因素在起作用。
难道是静止不动?
有没有季节性?
目标变量是否自相关?
在这篇文章中,我将介绍时间序列的不同特征,以及我们如何对它们建模以获得准确的(尽可能多的)预测。
在 Python 课程的应用时间序列分析中,超越基础并应用高级模型,如 SARIMAX、VARMAX、CNN、LSTM、ResNet、自回归 LSTM!
Predicting the future is hard.
自相关
非正式地说,自相关是观测值之间的相似性,是它们之间的时滞的函数。
Example of an autocorrelation plot
上面是一个自相关图的例子。仔细观察,您会发现第一个值和第 24 个值具有很高的自相关性。同样,第 12 次和第 36 次观察高度相关。这意味着我们会在每 24 个时间单位找到一个非常相似的值。
注意这个图看起来像正弦函数。这是对**季节性、**的暗示,你可以通过在上面的图中找到时间段来找到它的值,这将给出 24 小时。
季节性
季节性指周期性波动。例如,用电量白天高,晚上低,或者圣诞节期间在线销售增加,然后再次放缓。
Example of seasonality
从上面可以看出,有明显的日季节性。每一天,你都会在傍晚看到一个高峰,而最低点则是每天的开始和结束。
请记住,如果自相关图呈正弦曲线形状,季节性也可以从自相关图中得出。简单地看周期,它给出了季节的长度。
平稳性
平稳性是时间序列的重要特征。如果一个时间序列的统计特性不随时间变化,则称该时间序列是平稳的。换句话说,它有常数均值和方差,协方差与时间无关。
Example of a stationary process
再看同样的图,我们看到上面的过程是静止的。平均值和方差不随时间变化。
通常,股票价格不是一个稳定的过程,因为我们可能会看到一个增长的趋势,或者它的波动性可能会随着时间的推移而增加(意味着方差在变化)。
理想情况下,我们希望有一个平稳的时间序列来建模。当然,并不是所有的都是静止的,但是我们可以做不同的变换使它们静止。
如何测试一个过程是否是稳定的
你可能已经注意到了上述*的标题。*这是我们用来确定时间序列是否平稳的统计测试。
在不深入 Dickey-Fuller 检验的技术细节的情况下,它检验了单位根存在的零假设。
如果是,那么p>0,过程不是静止的。
否则, p = 0,零假设被拒绝,过程被认为是平稳的。
例如,下面的过程不是静止的。请注意,平均值在整个时间内并不恒定。
Example of a non-stationary process
建模时间序列
为了进行预测,有许多方法可以对时间序列进行建模。在这里,我将介绍:
- 移动平均数
- 指数平滑法
- ARIMA
移动平均数
移动平均模型可能是时间序列建模中最简单的方法。该模型简单地说明了下一个观察值是所有过去观察值的平均值。
虽然简单,但这个模型可能会出奇的好,它代表了一个好的起点。
否则,移动平均线可用于识别数据中有趣的趋势。我们可以定义一个窗口来应用移动平均模型平滑时间序列,并突出显示不同的趋势。
Example of a moving average on a 24h window
在上图中,我们将移动平均模型应用于 24 小时窗口。绿线平滑了时间序列,我们可以看到 24 小时内有两个峰值。
当然,窗口越长,趋势就越平稳。下面是一个小窗口的移动平均线的例子。
Example of a moving average on a 12h window
指数平滑法
指数平滑使用与移动平均类似的逻辑,但是这一次,不同的递减权重被分配给每个观察值。换句话说,随着我们离现在越来越远,观察的重要性就越来越小。
数学上,指数平滑表示为:
Exponential smoothing expression
这里, alpha 是一个平滑因子,取值在 0 和 1 之间。它决定了先前观察的重量减少的速度。
Example of exponential smoothing
从上面的图中,深蓝色线表示使用平滑因子 0.3 对时间序列进行指数平滑,而橙色线使用平滑因子 0.05。
可以看到,平滑因子越小,时间序列就越平滑。这是有意义的,因为当平滑因子接近 0 时,我们就接近移动平均模型。
双指数平滑
当时间序列中存在趋势时,使用双指数平滑。在这种情况下,我们使用这种技术,它只是指数平滑的两次递归使用。
数学上:
Double exponential smoothing expression
这里, beta 是趋势平滑因子,取 0 到 1 之间的值。
下面,你可以看到α和β的不同值如何影响时间序列的形状。
Example of double exponential smoothing
三指数平滑
该方法通过添加一个季节性平滑因子,扩展了双指数平滑。当然,如果您注意到时间序列中的季节性,这是很有用的。
数学上,三重指数平滑表示为:
Triple exponential smoothing expression
其中 gamma 是季节平滑因子,而 L 是季节长度。
季节性自回归积分移动平均模型
SARIMA 实际上是简单模型的组合,以形成一个复杂的模型,该模型可以模拟具有非平稳属性和季节性的时间序列。
首先,我们有自回归模型 AR§ 。这基本上是时间序列自身的回归。这里,我们假设当前值依赖于它以前的值,有一些滞后。它采用代表最大滞后的参数 p 。为了找到它,我们查看部分自相关图,并确定大多数滞后不显著之后的滞后。
在下面的示例中, p 将为 4。
Example of a partial autocorrelation plot
然后,我们添加移动平均线模型 MA(q) 。这需要一个参数 q ,该参数代表最大滞后,在该最大滞后之后,其他滞后在自相关图上不显著。
下面, q 会是 4。
Example of an autocorrelation plot
之后,我们加上的积分顺序 I(d) 。参数 d 代表使系列稳定所需的差值数量。
最后,我们添加最后一个组件:季节性 S(P,D,Q,s) ,其中 s 就是季节的长度。此外,该组件需要参数 P 和 Q ,它们与 p 和 q 相同,但用于季节性组件。最后, D 是季节积分的顺序,代表从序列中去除季节性所需的差异数。
综合所有这些,我们得到了 SARIMA(p,D,q)(P,D,Q,s) 模型。
主要要点是:在使用 SARIMA 建模之前,我们必须对时间序列进行转换,以消除季节性和任何非平稳行为。
那是一大堆让我们难以理解的理论!让我们在第一个项目中应用上面讨论的技术。
我们会试着预测一家特定公司的股价。现在,预测股票价格几乎是不可能的。然而,这仍然是一个有趣的练习,也是练习我们所学知识的好方法。
项目 1 —预测股票价格
我们将使用新德国基金(GF)的历史股价来尝试预测未来五个交易日的收盘价。
你可以在这里抓取数据集和笔记本。
和往常一样,我强烈推荐你跟着编码!启动你的笔记本,我们走吧!
You will definitely not get rich trying to predict the stock market
导入数据
首先,我们导入一些对我们的分析有帮助的库。此外,我们定义了平均百分比误差(MAPE) ,因为这将是我们的误差度量。
然后,我们导入数据集,对前十个条目进行排序,您应该得到:
First 10 entries of the dataset
正如你所看到的,我们有几个条目是关于一只不同于新德国基金的股票。此外,我们有一个关于当天信息的条目,但我们只想要当天结束时(EOD)的信息。
清理数据
首先,我们删除不需要的条目。
然后,我们删除不需要的列,因为我们只想关注股票的收盘价。
如果预览数据集,您应该会看到:
Clean dataset
厉害!我们准备好进行探索性数据分析了!
探索性数据分析
我们绘制了数据集整个时间段的收盘价。
您应该得到:
Closing price of the New Germany Fund (GF)
很明显,你看到这不是一个平稳的过程,很难判断是否存在某种季节性。
移动平均数
让我们使用移动平均线模型来平滑我们的时间序列。为此,我们将使用一个助手函数,该函数将在指定的时间窗口运行移动平均模型,并绘制出结果平滑曲线:
使用 5 天的时间窗,我们得到:
Smoothed curve by the previous trading week
如你所见,我们几乎看不到趋势,因为它太接近实际曲线了。让我们看看上个月和上个季度的平滑结果。
Smoothed by the previous month (30 days)
Smoothed by the previous quarter (90 days)
现在趋势更容易发现了。注意 30 天和 90 天的趋势是如何在最后显示出下降曲线的。这可能意味着股票可能会在接下来的几天下跌。
指数平滑法
现在,让我们使用指数平滑来看看它是否能拾取一个更好的趋势。
这里,我们使用 0.05 和 0.3 作为平滑因子的值。随意尝试其他值,看看结果如何。
Exponential smoothing
正如你所看到的,0.05 的 alpha 值平滑了曲线,同时拾取了大部分向上和向下的趋势。
现在,让我们使用双指数平滑。
双指数平滑
你会得到:
Double exponential smoothing
同样,尝试不同的 alpha 和 beta 组合来获得更好看的曲线。
系统模型化
如前所述,我们必须把我们的系列变成一个平稳的过程,以便对它建模。因此,让我们应用 Dickey-Fuller 检验来看看它是否是一个平稳过程:
您应该看到:
通过 Dickey-Fuller 检验,时间序列无疑是非平稳的。还有,看自相关图,看到很高,似乎没有明显的季节性。
因此,为了去掉高自相关性,并使过程平稳,我们取第一个差(代码块中的第 23 行)。我们简单地从滞后一天的时间序列中减去时间序列,我们得到:
厉害!我们的系列现在是固定的,我们可以开始建模!
萨里玛
现在,对于 SARIMA,我们首先定义一些参数和其他参数的值范围,以生成 P,Q,D,P,Q,D,s 的所有可能组合的列表。
现在,在上面的代码单元中,我们有 625 种不同的组合!我们将尝试每种组合,并用每种组合来训练 SARIMA,以找到最佳表现模式。这可能需要一段时间,具体取决于您计算机的处理能力。
完成后,我们会打印出最佳模型的摘要,您应该会看到:
厉害!我们最终预测未来五个交易日的收盘价,并评估模型的 MAPE。
在这种情况下,我们有 0.79%的 MAPE,这非常好!
将预测价格与实际数据进行比较
现在,为了将我们的预测与实际数据进行比较,我们从雅虎财经获取财务数据,并创建一个数据框架。
然后,我们画一个图,看看我们离实际收盘价有多远:
Comparison of predicted and actual closing prices
看来我们的预测有点偏差。事实上,预测价格基本持平,这意味着我们的模型可能表现不佳。
同样,这不是因为我们的程序,而是因为预测股票价格基本上是不可能的。
从第一个项目中,我们学习了在使用 SARIMA 建模之前使时间序列平稳的整个过程。这是一个漫长而乏味的过程,需要大量的手工调整。
现在,让我们介绍脸书的先知。这是一个 Python 和 r 版本的预测工具。该工具允许专家和非专家以最少的努力做出高质量的预测。
让我们看看如何在第二个项目中使用它!
项目 2 —用 Prophet 预测空气质量
标题说明了一切:我们将使用 Prophet 来帮助我们预测空气质量!
完整的笔记本和数据集可在这里找到。
我们来做一些预测吧!
Prophecy cat!
导入数据
和往常一样,我们从导入一些有用的库开始。然后,我们打印出前五行:
First five entries of the dataset
如您所见,数据集包含不同气体浓度的信息。他们每天每小时都被记录下来。你可以在这里找到所有特征的描述。
如果您进一步研究数据集,您会注意到有很多值-200 的实例。当然,负浓度是没有意义的,所以我们需要在建模前清理数据。
因此,我们需要清理数据。
数据清理和特征工程
这里,我们首先解析日期列,将其转换为“日期”。
然后,我们将所有的测量值转换成浮点数。
之后,我们通过取每个测量值的平均值来汇总每天的数据。
在这一点上,我们仍然有一些南我们需要摆脱。因此,我们删除超过 8 个 NaN 的列。这样,我们就可以删除包含 NaN 值的行,而不会丢失太多数据。
最后,我们按周汇总数据,因为这将给出一个更平滑的趋势来分析。
我们可以画出每种化学物质的趋势。在这里,我们展示了氮氧化物。
NOx concentration
氮氧化物是非常有害的,因为它们反应形成烟雾和酸雨,并且是细颗粒和地面臭氧形成的原因。这些对健康有不良影响,所以氮氧化物的浓度是空气质量的一个关键特征。
系统模型化
我们将只关注 NOx 浓度的建模。因此,我们删除所有其他不相关的列。
然后,我们进口先知。
Prophet 要求将日期列命名为 ds ,将特性列命名为 y ,因此我们进行了适当的修改。
此时,我们的数据看起来像这样:
然后,我们定义一个训练集。为此,我们将拿出最后 30 个条目进行预测和验证。
之后,我们简单地初始化 Prophet,将模型与数据进行拟合,并进行预测!
您应该看到以下内容:
这里, yhat 代表预测, yhat_lower 和 yhat_upper 分别代表预测的下限和上限。
Prophet 允许您轻松绘制预测图,我们得到:
NOx concentration forecast
可以看到,Prophet 只是简单的用了一条直线向下的线来预测未来 NOx 的浓度。
然后,我们检查时间序列是否有任何有趣的特征,例如季节性:
在这里,Prophet 只确定了一个没有季节性的下降趋势。
通过计算其平均绝对百分比误差(MAPE)和平均绝对误差(MAE)来评估模型的性能,我们看到 MAPE 为 13.86%,MAE 为 109.32,还不算太差!请记住,我们根本没有微调模型。
最后,我们绘制了预测的上限和下限:
Forecast of the average weekly NOx concentration
恭喜你坚持到最后!这是一篇很长但内容丰富的文章。您学习了如何对时间序列进行稳健分析和建模,并在两个不同的项目中应用了您的知识。
我希望这篇文章对你有用,我希望你能回头参考它。
要了解时间序列分析的最新技术,请查看本课程:
干杯!
参考:非常感谢这篇文章对时间序列分析的精彩介绍!
无监督学习完全指南
理解主成分分析(PCA)和聚类方法,并在两个小型项目中实现每个算法
介绍
无监督学习是一组统计工具,用于只有一组特征而没有目标的场景。因此,我们无法做出预测,因为对每个观察结果都没有相关的反应。相反,我们感兴趣的是找到一种有趣的方式来可视化数据,或者发现类似观察的子群。
无监督学习往往更具挑战性,因为分析没有明确的目标,而且往往是主观的。此外,很难评估获得的结果是否良好,因为没有公认的机制来执行交叉验证或验证独立数据集上的结果,因为我们不知道真实的答案。
本指南将重点介绍两种技术:主成分分析和聚类。我们将探索每一个是如何在数学上工作的,并且我们将在两个迷你项目中实现它们。
我们开始吧!
对于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
Unsupervised parties are dangerous!
主成分分析
PCA 是指计算主成分并用于更好地理解数据的过程。PCA 也可以用于可视化。
什么是主成分?
假设您想要可视化一组 p 特征上的 n 观测值,作为探索性数据分析的一部分。我们可以一次检查两个特征的 2D 散点图,但如果有很多预测因素,就会很快失控。
使用 PCA,我们可以找到包含尽可能多的变化的数据集的低维表示。因此,我们只得到最有趣的特征,因为它们是方差的主要来源。
主成分是怎么找到的?
第一个主成分是具有最大方差的特征的归一化线性组合:
First principal component equation
符号φ被称为载荷。负载必须最大化:
这就是全部了!
聚类方法
聚类是指在数据集中查找子组或聚类的一系列技术。这有助于我们将观察结果划分为不同的组,以便每个组包含彼此相似的观察结果。例如,在乳腺癌的情况下,组可以代表肿瘤等级。它在市场细分的营销中也非常有用,以便确定更容易接受某种产品的人群。
聚类方法有很多,但我们将重点介绍 k-means 聚类和层次聚类。在 K 均值聚类中,我们希望将数据划分成预先指定数量的 K 个聚类。另一方面,对于层次聚类,我们不知道我们需要多少个聚类。相反,我们想要一个树状图,它允许我们查看每个可能的聚类数所获得的所有聚类。
k 均值聚类
这种方法简单地将观察结果分成 K 个集群。它假设:
1.每个观察值属于 K 个聚类中的至少一个
2.集群不重叠
此外,每个集群内的变化被最小化。
How observations were clustered depending on the number of specified clusters
这是通过最小化一个聚类内每个观察值之间的平方欧几里德距离之和来实现的:
Optimization function for k-mean clustering
为了最小化,我们遵循以下算法:
1.从 1 到 K 之间随机分配一个数字给每个观察值。这些用作观测的初始聚类分配。
2.迭代直到集群分配停止变化:
2.a .对于每个 K 簇,计算簇质心。第个簇质心是第个簇中观测值的 p 特征均值的向量
2.b .将每个观察值分配给质心最近(最短欧几里得距离)的聚类
请注意,上面的算法将找到一个局部最小值。因此,所获得的结果将取决于初始随机聚类分配。因此,多次运行该算法非常重要。
分层聚类
k-means 聚类的一个潜在缺点是它需要人工输入来指定聚类的数量。另一方面,层次聚类不需要聚类的初始数量。
最常见的层次聚类类型是自底向上或聚集聚类。这指的是这样一个事实,即从叶子开始生成一个树状图,并将簇组合到树干。
Examples of dendrograms
算法其实很简单。它首先定义每对观察值之间的不相似性度量,比如欧几里德距离。然后,首先假设每个观察值属于它自己的集群。然后将两个最相似的聚类融合,这样就有了 n-1 个聚类。之后,融合另外两个相似的簇,产生 n-2 簇。该过程反复重复,直到所有的观察结果都是单个聚类的一部分。
虽然简单,但有些事情没有解决。如何定义聚类之间的相异度?这是通过联动的概念实现的。下表总结了四种最常见的链接类型:
The four most common types of linkage
完全连锁、平均连锁和质心连锁是最常见的连锁类型,因为单个连锁往往会产生不平衡的树状图。注意,生成的树状图很大程度上取决于所用的连锁类型。
Effect of linkage on the final dendrogram
此外,选择合适的相异度也很关键。欧几里德距离被广泛讨论,但也有基于相关性的距离*。如果两个特征高度相关,则认为它们是相似的,这意味着它们具有相似的轮廓。*
Observation 1 and 2 are highly correlated, since they have similar profiles
例如,假设一家在线零售商对基于购物者过去的购物历史对他们进行聚类感兴趣。目标是识别相似购物者的子群,这样他们就可以看到可能引起他们兴趣的广告。使用欧几里德距离,那么总体上很少购买商品的购物者将被聚集在一起,这可能不是理想的。另一方面,使用基于相关性的距离,具有类似偏好*(他们购买了商品 A 和 B,但没有购买商品 C 和 D)的购物者将被聚集在一起,即使他们购买了不同数量的商品。*
然而,在所有情况下,一旦层次聚类完成,我们仍然需要人工输入来确定要使用的最终聚类数。
现在您已经了解了 PCA 和聚类方法的工作原理,让我们在一个小型项目环境中实现它们。
项目
这个项目将被分为两个迷你项目。在第一个例子中,我们将使用 k-means 聚类对图像执行颜色量化。
然后,在第二个迷你项目中,我们将使用主成分分析来降低数据集的维度,允许我们用 2D 图来可视化它。
在这里你可以得到你需要的一切。
旋转你的 Jupyter 笔记本,我们走吧!
初始设置
在开始任何实现之前,我们将导入一些在以后会变得方便的库:
与之前的教程不同,我们不会导入数据集。相反,我们将使用由 scikit-learn 库提供的数据。
迷你项目 1 —使用 k 均值聚类的颜色量化
快速,颜色量化是一种技术,以减少在图像中使用的不同颜色的数量。这对于在保持图像完整性的同时压缩图像尤其有用。
首先,我们导入以下库:
注意,我们导入了一个名为 load_sample_image 的样本数据集。这仅仅包含两个图像。我们将使用其中一个来执行颜色量化。
因此,让我们展示一下我们将在本练习中使用的图像:
您应该会看到:
Original image
现在,对于颜色量化,必须遵循不同的步骤。
首先,我们需要将图像转换成 2D 矩阵进行处理:
然后,我们训练我们的模型来聚合颜色,以便在图像中有 64 种不同的颜色:
然后,我们构建一个辅助函数来帮助我们用指定颜色的数量重建图像:
最后,我们现在可以看到只有 64 种颜色的图像,以及它与原始图像的对比:
Original image with 96 615 colors
Reconstructed image with 64 colors
当然,我们可以看到一些差异,但总体而言,图像的完整性是守恒的!一定要探索不同数量的集群!例如,如果指定 10 种颜色,将会得到以下结果:
Reconstructed image with 10 colors
迷你项目 2 —使用主成分分析进行降维
在本练习中,我们将使用主成分分析来降低数据集的维度,以便我们可以轻松地将其可视化。
因此,让我们从 scikit-learn 导入虹膜数据集:
现在,我们将计算前两个主成分,并查看每个主成分可以解释的方差比例:
从上面的代码块中,您应该看到第一个主成分包含 92%的方差,而第二个主成分占 5%的方差。因此,这意味着仅两个特征就足以解释数据集中 97%的方差!
现在,我们可以利用它轻松绘制二维数据:
你会得到:
正如你所看到的,主成分分析有助于减少数据集的维数,允许我们绘制它,并可视化每个类别是如何分开的。
就是这样!您现在了解了最流行的无监督学习技术是如何工作的,以及如何实现它们。
再次请记住,无监督学习是困难的,因为没有错误度量来评估算法的表现如何。此外,在进行监督学习之前,这些技术通常用于探索性数据分析。
我希望这篇文章对你有用,并能找到你的书签!
继续努力!
这些练习是在 scikit-learn 网站上提供的示例。我只是试图用更多的细节来解释它们。
完整的动手机器学习速成班
从线性回归到无监督学习,本指南涵盖了你开始学习机器所需要知道的一切。每个主题都包括理论和实践练习!
目录
- 线性回归—理论
- 线性回归—练习
- 逻辑回归—理论
- 线性判别分析(LDA) —理论
- 二次判别分析(QDA)—理论
- 逻辑回归、LDA 和 QDA —实践
- 重采样—理论
- 正则化理论
- 重采样和正则化—练习
- 决策树—理论
- 决策树—实践
- 支持向量机(SVM)—理论
- 支持向量机(SVM) —实践
- 无监督学习——理论
- 无监督学习—实践
- 时间序列分析—理论
- 时间序列分析—练习
- 来源
关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
线性回归理论
线性回归可能是统计学习最简单的方法。对于更高级的方法来说,这是一个很好的起点,事实上,许多新奇的统计学习技术可以被视为线性回归的扩展。因此,在进入更复杂的方法之前,理解这个简单的模型将建立一个良好的基础。
线性回归很好地回答了以下问题:
- 两个变量之间有关系吗?
- 关系有多牢固?
- 哪个变量的贡献最大?
- 我们能多精确地估计每个变量的影响?
- 我们能多精确地预测目标?
- 关系是线性的吗?(咄)
- 有交互作用吗?
估计系数
假设我们只有一个变量和一个目标。然后,线性回归表示为:
Equation for a linear model with 1 variable and 1 target
在上式中,β是系数。这些系数是我们用模型进行预测所需要的。
那么我们如何找到这些参数呢?
为了找到参数,我们需要最小化最小平方或误差平方和。当然,线性模型并不完美,它不会准确预测所有数据,这意味着实际值和预测值之间存在差异。误差很容易通过下式计算:
Subtract the prediction from the true value
但是为什么误差是平方的呢?
我们平方误差,因为预测可以高于或低于真实值,分别导致负的或正的差异。如果我们不对误差进行平方,误差的总和可能会因为负差异而减少,而不是因为模型非常适合。
此外,平方误差不利于较大的差异,因此最小化平方误差“保证”更好的模型。
让我们来看一个图表,以便更好地理解。
Linear fit to a data set
在上图中,红点是真实数据,蓝线是线性模型。灰色线条表示预测值和真实值之间的误差。因此,蓝线是使灰线的平方长度之和最小的线。
经过一些对本文来说过于繁琐的数学计算后,您最终可以用下面的等式来估计系数:
其中 x 条和 y 条代表平均值。
估计系数的相关性
现在你有了系数,你如何知道它们是否与预测你的目标相关?
最好的方法是找到 p 值。**p 值用于量化统计显著性;它允许判断是否要拒绝零假设。
无效假设?
对于任何建模任务,假设在特征和目标之间存在某种相关性。因此,零假设是相反的:在特征和目标之间没有相关性。
因此,找到每个系数的 p 值将会知道该变量对于预测目标是否具有统计显著性。根据一般经验,如果 p 值小于0.05:变量和目标之间有很强的关系。
评估模型的准确性
通过找到变量的 p 值,您发现您的变量具有统计显著性。太好了!
现在,你怎么知道你的线性模型是好的呢?
为了进行评估,我们通常使用 RSE(剩余标准误差)和 R 统计量。
RSE formula
R² formula
第一个误差指标很容易理解:残差越低,模型就越符合数据(在这种情况下,数据越接近线性关系)。
至于 R 度量,它测量目标中可以用特征 X 解释的可变性比例。所以假设线性关系,如果特征 X 能解释(预测)目标,那么比例高,R 值会接近 1。如果相反,R 值则更接近于 0。
多元线性回归理论
在现实生活中,永远不会有单一的特征来预测目标。那么,我们一次对一个特征进行线性回归吗?当然不是。我们简单地执行多元线性回归。
该方程非常类似于简单的线性回归;简单地将预测值的数量和它们相应的系数相加:
Multiple linear regression equation. p is the number of predictors
评估预测值的相关性
以前,在简单的线性回归中,我们通过寻找特征的 p 值来评估特征的相关性。
在多元线性回归的情况下,我们使用另一个指标:F 统计量。
F-statistic formula. n is the number of data points and p is the number of predictors
在这里,F 统计量是为整个模型计算的,而 p 值是特定于每个预测值的。如果有强关系,那么 F 会远大于 1。否则,它将近似等于 1。
如何使大于 比 1 足够大?
这个很难回答。通常,如果有大量的数据点,F 可能略大于 1,表明有很强的关系。对于小数据集,F 值必须远大于 1,以表明强相关关系。
为什么我们不能在这种情况下使用 p 值?
由于我们正在拟合许多预测值,因此我们需要考虑有许多特征的情况( p 很大)。对于非常大量的预测值,总会有大约 5%的预测值偶然具有非常小的 p 值 甚至 ,尽管它们在统计上不显著。因此,我们使用 F 统计量来避免将不重要的预测因子视为重要的预测因子。
评估模型的准确性
就像简单的线性回归一样,R 可以用于多元线性回归。但是,要知道添加更多的预测值总是会增加 R 值,因为模型必然会更好地拟合训练数据。
然而,这并不意味着它将在测试数据上表现良好(对未知数据点进行预测)。
添加交互
一个线性模型中有多个预测因子意味着一些预测因子可能会对其他预测因子产生影响。
例如,你想预测一个人的工资,知道她的年龄和上学的年数。当然,一个人越老,他在学校度过的时间就越多。那么我们如何对这种互动效应建模呢?
考虑这个非常简单的例子,有两个预测值:
Interaction effect in multiple linear regression
如你所见,我们简单地将两个预测因子相乘,并关联一个新的系数。简化公式,我们现在看到系数受另一个特征的值的影响。
一般来说,如果我们包括交互模型,我们应该包括特征的个体效应,即使它的 p 值不显著。这就是所谓的等级原则。这背后的基本原理是,如果两个预测者相互作用,那么包括他们各自的贡献将对模型产生很小的影响。
线性回归—实践
好吧!现在我们知道了它是如何工作的,让我们让它工作吧!我们将通过 Python 中的简单和多元线性回归来工作,我将展示如何在这两种情况下评估参数和整体模型的质量。
你可以在这里获取代码和数据。
我强烈建议您在自己的 Jupyter 笔记本中遵循并重新创建这些步骤,以充分利用本教程。
数据集包含关于花费在广告上的钱及其产生的销售额的信息。钱花在了电视、广播和报纸广告上。
目标是使用线性回归来了解广告支出如何影响销售。
导入库
使用 Python 的优势在于,我们可以访问许多库,这些库允许我们快速读取数据、绘制数据并执行线性回归。
我喜欢在笔记本顶部导入所有必要的库,以保持一切井然有序。导入以下内容:
import pandas as pd
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_scoreimport statsmodels.api as sm
读取数据
假设您下载了数据集,将它放在项目文件夹内的一个data
目录中。然后,像这样读取数据:
data = pd.read_csv("data/Advertising.csv")
为了查看数据的样子,我们执行以下操作:
data.head()
你应该看看这个:
如您所见,列Unnamed: 0
是多余的。因此,我们删除它。
data.drop(['Unnamed: 0'], axis=1)
好了,我们的数据是干净的,可以进行线性回归了!
简单线性回归
对于简单线性回归,我们只考虑电视广告对销售的影响。在开始建模之前,让我们看一下数据是什么样子的。
我们使用matplotlib
,一个流行的 Python 绘图库来制作散点图。
plt.figure(figsize=(16, 8))
plt.scatter(
data['TV'],
data['sales'],
c='black'
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()
运行这个代码单元,您应该会看到这个图形:
Scatter plot of money spent on TV ads and sales
正如你所看到的,在电视广告上的花费和销售额之间有着明显的关系。
让我们看看如何生成该数据的线性近似值。
X = data['TV'].values.reshape(-1,1)
y = data['sales'].values.reshape(-1,1)reg = LinearRegression()
reg.fit(X, y)print("The linear model is: Y = {:.5} + {:.5}X".format(reg.intercept_[0], reg.coef_[0][0]))
就这样?
是啊!对数据集拟合一条直线并查看方程的参数就是这么简单。在这种情况下,我们有
Simple linear regression equation
让我们想象一下这条线是如何拟合数据的。
predictions = reg.predict(X)plt.figure(figsize=(16, 8))
plt.scatter(
data['TV'],
data['sales'],
c='black'
)
plt.plot(
data['TV'],
predictions,
c='blue',
linewidth=2
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()
现在,你看:
Linear fit
从上图来看,似乎一个简单的线性回归可以解释电视广告支出和销售额的总体影响。
评估模型的相关性
现在,如果你还记得这篇文章,为了看看这个模型是否好,我们需要看看每个系数的 R 值和 p 值。
我们是这样做的:
X = data['TV']
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())
这给了你这个可爱的输出:
R² and p-value
查看这两个系数,我们有一个非常低的 p 值(尽管它可能不完全是 0)。这意味着这些系数和目标(销售额)之间有很强的相关性。
然后,看 R 值,我们有 0.612。因此,大约 60%的销售变化可以用花在电视广告上的金额来解释。这没问题,但肯定不是我们能准确预测销售的最好方法。当然,在报纸和广播广告上的花费肯定会对销售产生一定的影响。
让我们看看多元线性回归是否会表现得更好。
多元线性回归
就像简单的线性回归一样,我们将定义我们的特性和目标变量,并使用 scikit-learn 库来执行线性回归。
Xs = data.drop(['sales', 'Unnamed: 0'], axis=1)
y = data['sales'].reshape(-1,1)reg = LinearRegression()
reg.fit(Xs, y)print("The linear model is: Y = {:.5} + {:.5}*TV + {:.5}*radio + {:.5}*newspaper".format(reg.intercept_[0], reg.coef_[0][0], reg.coef_[0][1], reg.coef_[0][2]))
仅此而已!从这个代码单元,我们得到下面的等式:
Multiple linear regression equation
当然,我们无法想象所有三种媒体对销售的影响,因为它总共有四个维度。
请注意,报纸的系数是负的,但也相当小。与我们的模型相关吗?让我们通过计算每个系数的 F 统计量、R 值和 p 值来看看。
评估模型的相关性
正如您所料,这里的过程与我们在简单线性回归中所做的非常相似。
X = np.column_stack((data['TV'], data['radio'], data['newspaper']))
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())
您会得到以下结果:
R², p-value and F-statistic
可以看到,R 远高于简单线性回归的 R,其值为 0.897 !
此外,F 统计值为 570.3 。这比 1 大得多,而且由于我们的数据集相当小(只有 200 个数据点),它表明广告支出和销售之间有很强的关系。
最后,因为我们只有三个预测值,所以我们可以考虑它们的 p 值来确定它们是否与模型相关。当然,你会注意到第三个系数(报纸的系数)有一个很大的 p 值。因此,报纸上的广告支出在统计上并不显著。移除那个预测因子会稍微降低 R 值,但我们可能会做出更好的预测。
逻辑回归理论
回归与分类问题
之前,我们看到线性回归假设响应变量是定量的。然而,在许多情况下,反应实际上是定性的,就像眼睛的颜色。这种类型的反应被称为绝对的。
分类是预测定性反应的过程。用于分类的方法通常预测定性变量的每个类别的概率,作为进行分类的基础。在某种程度上,它们的行为类似于回归方法。
通过分类,我们可以回答如下问题:
- 一个人有一系列症状,这些症状可以归因于三种医学状况中的一种。哪一个?
- 一笔交易是不是欺诈?
分类回答通常用词来表达。当然,我们不能用文字作为传统统计方法的输入数据。当我们实现算法的时候,我们会看到如何处理这个问题。
现在,让我们看看逻辑回归是如何工作的。
逻辑回归
当涉及到分类时,我们要确定一个观察值是否属于某一类的概率。因此,我们希望用 0 到 1 之间的值来表示概率。
接近 1 的概率意味着观测结果很可能属于那一类。
为了生成介于 0 和 1 之间的值,我们使用以下等式来表示概率:
Sigmoid function
上面的等式被定义为 sigmoid 函数。
画出这个方程,你会发现这个方程总是产生一个介于 0 和 1 之间的 S 形曲线。
Logistic regression curve
对上面的等式进行一些操作后,您会发现:
在两侧取圆木;
上面的等式被称为 logit 。可以看到,在 X 中是线性的。这里,如果系数是正的,那么 X 的增加将导致更高的概率。
估计系数
与线性回归一样,我们需要一种方法来估计系数。为此,我们最大化的似然函数:
Likelihood function
这里的直觉是,我们希望系数使得预测的概率(在上面的等式中用撇号表示)尽可能接近观察到的状态。
与线性回归类似,我们使用 p 值来确定是否拒绝零假设。
Z 统计数据也被广泛使用。大的绝对 Z 统计量意味着零假设被拒绝。
请记住,零假设声明:特征和目标之间没有相关性。
多元逻辑回归
当然,逻辑回归可以很容易地扩展到容纳一个以上的预测因子:
Multiple logistic regression
请注意,使用多元逻辑回归可能会给出更好的结果,因为它可以考虑预测因素之间的相关性,这种现象被称为混杂。此外,很少仅有一个预测器就足以建立准确的预测模型。
线性判别分析(LDA) —理论
现在,我们明白了逻辑回归是如何工作的,但是像任何模型一样,它也存在一些缺陷:
- 当类被很好地分开时,从逻辑回归估计的参数往往是不稳定的
- 当数据集很小时,逻辑回归也是不稳定的
- 最好不要预测两个以上的类
这就是线性判别分析(LDA)派上用场的地方。它比逻辑回归更稳定,广泛用于预测两个以上的类别。
LDA 的特殊性在于,它分别对每个响应类别中预测值的分布进行建模,然后使用贝叶斯定理来估计概率。
好吧,这有点难以理解。我们来分解一下。
贝叶斯分类定理
(抱歉,Medium 不支持数学方程。我尽了最大努力,尽可能的明确)。
假设我们想要将一个观察结果分类到 K 类中的一个,其中 K 大于或等于 2。然后,让 pi-k 成为一个观察值关联到第个类的总概率。然后,让 f_k(X) 表示 X 的密度函数,用于来自第 k 个类的观察。这意味着如果来自第 k 个类的观测值具有 X = x 的概率,那么 f_k(X) 是大的。然后,贝叶斯定理陈述:
Bayes’ theorem for classification
上面的等式可以简单地缩写为:
Abbreviated Bayes’ theorem for classification
希望这有一定的意义!
这里的挑战是估计密度函数。理论上,贝叶斯的分类错误率最低。因此,我们的分类器需要估计密度函数,以逼近贝叶斯分类器。
一个预测器的 LDA
假设我们只有一个预测值,并且密度函数是正态的。然后,您可以将密度函数表示为:
Normal distribution function
现在,我们要指定一个观察值 X = x ,对于该观察值 P_k(X) 最大。如果你在 P_k(X) 中插入密度函数,取对数,你会发现你希望最大化:
Discriminant equation
上面的等式称为**判别式。**如你所见,这是一个线性方程。因此得名:线性判别分析!
现在,假设只有两个具有相等分布的类,您会发现:
Boundary equation
这是边界方程。下图显示了图示。
Boundary line to separate 2 classes using LDA
当然,这代表了一种理想的解决方案。事实上,我们无法精确计算边界线。
因此,LDA 利用以下近似:
- 对于所有训练观察的平均值
Average of all training observations
- 对于每类样本方差的加权平均值
Weighted average of sample variances for each class
其中 n 是观察次数。
重要的是要知道,LDA 为每个类别假设了一个正态分布,一个特定类别均值,以及一个共同方差。
多个预测值的 LDA
现在扩展到多个预测值,我们必须假设 X 来自多元高斯分布,具有特定类别的均值向量和公共协方差矩阵。
相关和不相关高斯分布的示例如下所示。
Left: Uncorrelated normal distribution. Right: correlated normal distribution
现在,用向量符号表示判别方程,我们得到:
Discriminant equation with matrix notation
如你所见,等式保持不变。只是这一次,我们使用向量符号来容纳许多预测值。
如何评估模型的性能
对于分类,有时使用准确性来评估模型的性能是不相关的。
考虑分析一个高度不平衡的数据集。例如,您试图确定一项交易是否是欺诈性的,但您的数据集只有 0.5%包含欺诈性交易。然后,您可以预测没有任何交易是欺诈性的,并有 99.5%的准确率得分!当然,这是一种非常幼稚的方法,无助于检测欺诈交易。
那么我们用什么呢?
通常,我们用灵敏度和特异性。
灵敏度是真正的阳性率:被正确识别的实际阳性的比例。
特异性是真阴性率:实际阴性被正确识别的比例。
让我们给出一些背景来更好地理解。使用欺诈检测问题,敏感度是被识别为欺诈的欺诈交易的比例。特异性是被识别为非欺诈的非欺诈交易的比例。
因此,在理想情况下,我们需要高灵敏度和高特异性,尽管这可能会因环境而异。例如,银行可能希望优先考虑较高的敏感性而不是特异性,以确保识别欺诈性交易。
ROC 曲线(接收器工作特性)可以很好地显示上述两种误差指标。分类器的总体性能由 ROC 曲线下的面积给出( AUC )。理想情况下,它应该紧挨着图形的左上角,并且面积接近 1。
Example of a ROC curve. The straight line is a base model
二次判别分析(QDA)——理论
这里,我们保持与 LDA 相同的假设,但是现在,来自第个类的每个观察值都有自己的协方差矩阵。
对于 QDA,判别式表示为:
Discriminant equation for QDA
毫无疑问,你会注意到这个方程现在是二次方程了。
但是,为什么选择 QDA 而不是 LDA?
对于大型数据集,QDA 是更好的选择,因为它倾向于具有更低的偏差和更高的方差。
另一方面,LDA 更适合于较小的数据集,它有较高的偏倚和较低的方差。
逻辑回归、线性判别分析和 QDA——实践
太好了!既然我们已经深刻理解了逻辑回归、LDA 和 QDA 的工作原理,让我们应用每种算法来解决一个分类问题。
动机
蘑菇味道好极了!但是,仅在北美就有超过 10 000 种蘑菇,我们怎么知道哪些是可以食用的呢?
这是这个项目的目标。我们将构建一个分类器来确定某种蘑菇是可食用的还是有毒的。
我建议你拿起数据集跟着做。如果你被卡住了,请随时查阅完整笔记本。
我们开始吧!
探索性数据分析
我们将使用的数据集包含 8124 个蘑菇实例,有 22 个特征。其中,我们发现了蘑菇的帽形、帽色、鳃色、面纱类型等。当然,它也告诉我们蘑菇是可食用的还是有毒的。
让我们导入一些库,它们将帮助我们导入数据并操作它。在您的笔记本中,运行以下代码:
数据科学项目通常的第一步是执行探索性数据分析 (EDA)。这一步通常包括了解更多关于您正在处理的数据的信息。您可能想知道数据集的形状(有多少行和列)、空值的数量,并可视化部分数据以更好地理解特征和目标之间的相关性。
导入数据并查看前五列,代码如下:
将数据集放在项目目录下的数据文件夹中总是好的。此外,我们将文件路径存储在一个变量中,这样,如果路径发生变化,我们只需更改变量赋值。
运行此代码单元后,您应该会看到前五行。您会注意到每个特性都是分类的,并且用一个字母来定义某个值。当然,分类器不能接受字母作为输入,所以我们最终必须改变它。
现在,让我们看看我们的数据集是否不平衡。一个不平衡的数据集是指一个类比另一个类出现得多。理想情况下,在分类的上下文中,我们希望每个类的实例数量相等。否则,我们将需要实现先进的采样方法,如少数过采样。
在我们的例子中,我们想看看数据集中有毒和可食用蘑菇的数量是否相等。我们可以像这样画出每一类的频率:
你会得到下面的图表:
厉害!这看起来像是一个相当平衡的数据集,有毒和可食用蘑菇的数量几乎相等。
现在,我想看看每个特征如何影响目标。为了做到这一点,对于每个特性,我绘制了一个由蘑菇类分隔的所有可能值的条形图。为所有 22 个特性手动执行没有意义,因此我们构建了这个帮助器函数:
色调会给有毒和可食用类一个颜色代码。数据参数将包含除蘑菇类之外的所有特征。运行下面的单元代码:
您应该会得到一个包含 22 个地块的列表。下面是一个输出示例:
花些时间浏览所有的情节。
现在,让我们看看是否有丢失的值。运行这段代码:
您应该看到每一列都有缺失值的数量。幸运的是,我们有一个没有缺失值的数据集。这很不常见,但我们不会抱怨。
为建模做准备
现在我们已经熟悉了数据,是时候为建模做准备了。如前所述,特性用字母来表示不同的可能值,但是我们需要将它们转换成数字。
为此,我们将使用标签编码和一键编码。
让我们首先在目标列上使用标签编码。运行以下代码:
您会注意到现在该列包含 1 和 0。
Result of label encoding the ‘class’ column
现在,有毒的用 1 表示,可食用的用 0 表示。现在,我们可以把我们的分类器想成“有毒与否”。毒蘑菇得 1(真),食用菌得 0(假)。
因此,标签编码会将分类特征转化为数字特征。但是,当有两个以上的可能值时,不建议使用标签编码。
为什么?
因为它会将每个值赋给 0、1 或 2。这是一个问题,因为“2”可能被认为是更重要的*,并且可能由此得出错误的相关性。*
为了避免这个问题,我们在其他特性上使用一键编码。为了理解它的作用,让我们考虑一下第一个入口点的帽形。你可以看到它的值为“x ”,代表凸帽形状。然而,在数据集中总共记录了六种不同的帽形状。如果我们对特征进行一次性编码,我们应该得到:
One-hot encoding the “cap-shape” feature
如您所见,帽子形状现在是一个矢量。1 表示数据集中条目的实际帽形状值,其余部分用 0 填充。同样,你可以认为 1 代表真*,0 代表*假。**
一键编码的缺点是它向数据集引入了更多的列。在帽形的情况下,我们从一列到六列。对于非常大的数据集,这可能是一个问题,但是在我们的例子中,额外的列应该是可以管理的。
让我们继续对其余的功能进行一次性编码:
现在您应该可以看到:
One-hot encoded data set
你注意到我们从 23 列增加到 118 列。这是五倍的增长,但这个数字还不足以导致计算机内存问题。
既然我们的数据集只包含数字数据,我们就可以开始建模和预测了!
训练/测试分割
在深入建模和进行预测之前,我们需要将数据集分成训练集和测试集。这样,我们可以在训练集上训练算法,并在测试集上进行预测。这种方式的误差度量将更加相关,因为该算法将对以前没有见过的数据进行预测。
我们可以像这样轻松地分割数据集:
在这里, y 仅仅是目标(有毒或可食用)。那么, X 就是简单的数据集的所有特征。最后,我们使用 train_test_split 函数。 test_size 参数对应于将用于测试的数据集部分。通常,我们使用 20%。然后, random_state 参数用于再现性。它可以设置为任何数字,但它将确保每次代码运行时,数据集将被相同地分割。如果没有提供 random_state ,那么训练集和测试集将会不同,因为函数会随机分割它。
好了,我们正式准备好开始建模和预测了!
逻辑回归
我们将首先使用逻辑回归。在接下来的步骤中,我们将使用 ROC 曲线下的面积和混淆矩阵作为误差度量。
让我们先导入我们需要的所有内容:
然后,我们创建一个 LogisticRegression 对象的实例,并使模型适合训练集:
然后,我们预测蘑菇有毒的概率。记住,我们认为蘑菇有毒或无毒。
此外,必须提醒您,逻辑回归会返回一个概率。现在,让我们将阈值设置为 0.5,这样,如果概率大于 0.5,蘑菇将被分类为有毒。当然,如果概率小于阈值,蘑菇被分类为可食用。
这正是下面代码单元格中发生的情况:
注意,我们是在测试集上计算概率的。
*现在,让我们看看**混淆矩阵。*这将显示真实阳性率、真实阴性率、假阳性率和假阴性率。
Example of a confusion matrix
我们像这样输出我们的混淆矩阵:
您应该得到:
太神奇了!我们的分类器是完美的!从上面的混淆矩阵中,你可以看到我们的假阳性和假阴性率是 0,这意味着所有的蘑菇都被正确地分类为有毒或可食用!
让我们打印 ROC 曲线下的面积。如你所知,对于一个完美的分类器,它应该等于 1。
的确,上面的代码块输出 1!我们可以制作自己的函数来可视化 ROC 曲线:
您应该会看到:
ROC curve
恭喜你!你用一个基本的逻辑回归模型建立了一个完美的分类器。
然而,为了获得更多的经验,让我们使用 ld a 和 QDA 建立一个分类器,看看我们是否得到类似的结果。
LDA 分类器
遵循逻辑回归概述的相同步骤:
如果您运行上面的代码,您应该看到我们再次获得了一个完美的分类器,其结果与使用逻辑回归的分类器相同。
QDA 分类器
现在,我们重复这个过程,但是使用 QDA:
同样,结果是一样的!
重采样—理论
重采样和正则化是两个重要的步骤,可以显著提高模型的性能和对模型的信心。
在本文中,交叉验证将被广泛讨论,因为它是最流行的重采样方法。然后,将介绍岭回归和 lasso 作为线性模型的正则化方法。之后,将在项目设置中应用重采样和正则化。
我希望这篇文章能作为你未来某个项目的参考,并能成为你的书签。
我们开始吧!
重采样的重要性
重采样方法是现代统计学中不可缺少的工具。它们涉及重复地从训练集中抽取样本,并在每个样本上重新拟合感兴趣的模型,以便获得关于拟合模型的附加信息。这使我们能够获得更多的信息,而这些信息是仅拟合一次模型所无法获得的。
通常,数据科学项目的目标是使用训练数据创建模型,并让它对新数据进行预测。因此,重采样方法允许我们在不收集新数据的情况下,观察模型在未经训练的数据上的表现。
交叉验证
交叉验证( CV )用于估计与模型相关的测试误差,以评估其性能或选择适当的灵活性水平。评估一个模型的性能通常被定义为模型评估,而模型选择用于选择灵活性的级别。这个术语广泛用于数据科学领域。
现在,有不同的方法来执行交叉验证。让我们逐一探索。
验证集方法
这是最基本的方法。它只是简单地将数据集随机分成两部分:一个训练集和一个验证集或保留集。该模型适合训练集,并且该适合的模型用于对验证集进行预测。
Validation set schematic
上面是验证集方法的示意图。在一个数据集中有 n 个观察值,它被随机分成两部分。蓝色一侧代表训练集,橙色一侧是验证集。数字只是代表行数。
当然,这种简单的方法也有一些缺点。
首先,验证测试错误率是高度可变的,这取决于训练和验证集中的观察值。
第二,只有一小部分观察值用于拟合模型。然而,我们知道统计方法在数据较少的情况下往往表现较差。
MSE for the validation set approach
在上面的左侧,您可以看到验证集方法仅应用一次时的 MSE。在右边,这个过程重复了 10 次。如你所见,MSE 变化很大。
这显示了使用验证集方法时 MSE 的显著可变性。
当然,有一些方法可以解决这些缺点。
留一交叉验证
留一交叉验证( LOOCV )是比验证集方法更好的选择。不是将数据集分成两个子集,而是只使用一个观察值进行验证,其余的用于拟合模型。
LOOCV schematic
以上是 LOOCV 的示意图。如您所见,只有一个观察用于验证,其余的用于训练。然后,该过程重复多次。
多次运行后,误差估计为:
LOOCV estimated error
这仅仅是每次运行的误差的平均值。
这种方法要好得多,因为它的偏差要小得多,因为更多的观察数据被用来拟合模型。在训练/验证集分割中没有随机性。因此,我们降低了 MSE 的可变性,如下所示。
MSE of LOOCV
k 倍交叉验证
这种方法包括将一组观察值随机分成大约相等大小的 k 组或折叠。第一个折叠被视为验证集,模型适合其余的折叠。然后重复该过程 k 次,其中不同的组被视为验证集。
k-fold cross-validation schematic
因此,你意识到 LOOCV 是一个特殊的 k 重交叉验证案例,其中 k 等于观察总数 n(T21)。但是,通常将 k 设置为等于 5 或 10。
尽管 LOOCV 对于大型数据集来说是计算密集型的,但是 k-fold 更通用,可以用于任何模型。此外,它通常比 LOOCV 给出更准确的测试误差估计。因此,要评估和验证您的模型,k 倍交叉验证方法是最佳选择。
既然我们知道了交叉验证是如何工作的,以及它如何提高我们对模型性能的信心,那么让我们看看如何通过正则化来改进模型本身。
正则化理论
正则化方法有效地防止了过度拟合。当模型在训练集上表现良好,但在验证集上表现不佳时,就会发生过度拟合。
我们已经看到,线性模型,如线性回归和推而广之的逻辑回归,使用最小二乘法来估计参数。
现在,我们探索如何通过用其他拟合过程代替最小二乘拟合来改进线性模型。这些方法将产生更好的预测精度和模型可解释性。
但是为什么呢?为什么要用其他拟合方式?
最小二乘拟合在大多数情况下是可行的,但也有失败的情况。
例如,如果您的观察值数量 n 大于预测值数量 p ,那么最小二乘估计将具有较低的方差,并且表现良好。另一方面,当 p 大于 n (预测值多于观测值)时,方差为无穷大,该方法无法使用!
此外,多元线性回归往往会增加与响应实际不相关的变量。这给模型增加了不必要的复杂性。如果有一种方法可以自动执行特征选择,比如只包含最相关的变量,那就太好了。
为了实现这一点,我们引入了岭回归和套索。这是两种常见的正则化方法,也称为收缩方法。
收缩方法
将估计的系数向 0 收缩可以显著提高拟合度并减少系数的方差。在这里,我们探讨岭回归和套索。
里脊回归
传统的线性拟合涉及最小化 RSS(残差平方和)。在岭回归中,添加了一个新参数,现在参数将最小化:
其中λ为调谐参数。使用交叉验证找到该参数,因为它必须最小化测试误差。因此,λ的范围用于拟合模型,并且使测试误差最小化的λ是最佳值。
这里,岭回归将包括模型中所有的 p 预测值。因此,这是一种提高模型拟合度的好方法,但它不会执行变量选择。
套索
与岭回归类似,套索将最小化:
注意,我们使用参数β的绝对值,而不是它的平方值。此外,还存在相同的调谐参数。
然而,如果λ足够大,一些系数将有效地为 0!因此,lasso 还可以执行变量选择,使模型更容易解释。
重采样和正则化-实践
我们知道正则化和重采样是如何工作的。现在,让我们在项目设置中应用这些技术。
打开 Jupyter 笔记本,获取数据集。如果你遇到困难,也可以使用解决方案笔记本。
导入库
像任何项目一样,我们导入常用的库来帮助我们执行基本的数据操作和绘图。
现在,我们可以开始探索性的数据分析了。
探索性数据分析
我们从导入数据集开始,查看前五行:
您应该看到:
注意未命名:0* 列是无用的。让我们把它拿出来。*
现在,我们的数据集看起来像这样:
如你所见,我们只有三种广告媒体,而销售额是我们的目标变量。
让我们通过绘制散点图来看看每个变量是如何影响销售的。首先,我们构建一个辅助函数来绘制散点图:
现在,我们可以为每个特征生成三个不同的图。
您会得到以下结果:
Sales with respect to money spend on TV ads
Sales with respect to money spent on radio ads
Sales with respect to money spent on newspaper ads
正如你所看到的,电视和广播广告似乎是销售的良好预测工具,而销售和报纸广告之间似乎没有相关性。
幸运的是,我们的数据集不需要进一步处理,所以我们准备好马上开始建模了!
多元线性回归—最小二乘拟合
在浏览之前,让我们先看看代码是什么样子的。
首先,我们导入 LinearRegression 和 cross_val_score 对象。第一个对象将允许我们拟合一个线性模型,而第二个对象将执行 k-fold 交叉验证。
然后,我们定义我们的特征和目标变量。
cross_val_score 将为每个交叉验证步骤返回一个 MSE 数组。在我们的例子中,我们有五个。所以我们取 MSE 的平均值,打印出来。您应该得到-3.0729 的负 MSE。
现在,我们来看看岭回归和套索哪个会更好。
里脊回归
对于岭回归,我们引入 GridSearchCV 。这将允许我们使用一系列不同的正则化参数自动执行 5 重交叉验证,以便找到α的最佳值。
代码如下所示:
然后,我们可以通过以下公式找到最佳参数和最佳 MSE:
您应该看到 alpha 的最佳值是 20,MSE 为负-3.07267。这是对基本多元线性回归的一点改进。
套索
对于 lasso,我们遵循与岭回归非常相似的过程:
在这种情况下, alpha 的最优值为 1,负的 MSE 为-3.0414,这是三个模型的最好成绩!
决策树——理论
基于树的方法可用于回归或分类。它们包括将预测空间分割成许多简单的区域。分割规则集可以总结为一棵树,因此被命名为决策树方法。
单个决策树往往不如线性回归、逻辑回归、 LDA 等性能好。但是,通过引入 bagging、随机森林和 boosting,它可以显著提高预测的准确性,但会损失一些解释能力。
回归树
在进入理论之前,我们需要一些基本的术语。
树是倒着画的。最后的区域被称为叶。树内发生分裂的点是区间节点*。最后,连接节点的线段是分支。*
Decision tree schematic
要创建回归树,请执行以下操作:
- 将预测空间划分为 J 个不同且不重叠的区域
- 对于落在一个区域中的每个观察值,预测该区域中响应值的平均值
每个区域被分割以最小化 RSS。为此,需要一种自顶向下的贪婪方法,也称为递归二进制分裂*。*
为什么自上而下?
因为在第一次分裂之前,所有观测值都在单个区域中。
为什么是贪婪的方法?
因为最佳分割发生在特定步骤,而不是向前看并进行分割,这将导致对未来步骤的更好预测。
数学上,我们将这对半平面定义为:
并且我们寻求 j 和 s 最小化:
但是,这可能会导致过度拟合。修剪树将产生一个更小的子树,我们可以用交叉验证来验证它。
Schematic of an unpruned tree
分类树
分类树与回归树非常相似。但是,我们不能使用响应的平均值,所以我们现在预测一个区域中最常出现的类。当然,RSS 不能作为评判标准。相反,每次分割都是为了最小化分类错误率。
分类错误率只是不属于最常见类别的区域中训练观察值的分数。
Classification error rate
不幸的是,这对于植树来说不够灵敏。在实践中,还使用了另外两种方法。
还有基尼指数:
Gini index
这是对所有类别的总方差的度量。如你所见,如果比例接近 0 或 1,基尼指数会很小,所以它是一个很好的衡量节点纯度的指标。
类似的基本原理适用于另一种称为交叉熵的方法:
Cross-entropy
既然我们已经看到了基本决策树是如何工作的,那么让我们来看看如何提高它的性能!
制袋材料
我们知道 bootstrap 可以计算任何感兴趣的量的标准差。对于决策树来说,方差非常大。因此,通过 bootstrap 聚合或 bagging ,我们可以减少方差并提高决策树的性能。
装袋包括从数据集中重复提取样本。这产生了 B 不同的引导训练集。然后,我们对所有自举训练集进行训练,以获得每个集的预测,并对这些预测进行平均。
数学上,平均预测是:
将此应用于决策树,这意味着我们可以构建大量具有高方差和低偏差的树。然后,我们可以对他们的预测进行平均,以减少方差,从而提高决策树的性能。
随机森林
随机森林通过一个小调整提供了对袋装树的改进,这个小调整解除了树木之间的关联。
像装袋一样,建立多个决策树。然而,在每次分割时,从所有的 p 预测值中选择一个随机样本 m 预测值。分割只允许使用一个 m 预测器,通常:
换句话说,在每次分割时,不允许算法考虑大多数可用的预测值!
为什么?
假设数据集中有一个非常强的预测因子,以及其他中等强度的预测因子。然后在套袋树的采集中,他们都会在顶裂中使用这个强预测器。因此,所有装袋的树将非常相似,平均它们的预测不会减少方差,因为预测将高度相关。
随机森林通过强制每次分割只考虑有效地去相关树的预测子集合来克服这个问题。
当然,如果 m 等于 p ,那么就跟装袋一样。通常情况下, p 的平方根给出的结果最好,如下图所示。
Classification error as a function of the number of trees. Each line represents the number of predictors available at each split.
助推
Boosting 的工作方式与 bagging 类似,但树是按顺序生长的:每棵树都使用来自先前生长的树的信息。
这意味着算法慢慢地学习。每棵树都适合模型的残差,而不是目标变量。因此,每棵树都很小,在表现不好的地方会慢慢改善预测。**
升压有三个调整参数:
1.树的数量( B ):与套袋和随机森林不同,如果 B 太大,boosting 可能会溢出。使用交叉验证来选择正确的树的数量。
2.收缩参数( alpha ):控制 boosting 学习速率的小正数。它通常设置为 0.01 或 0.001。
3.每棵树的分裂数( d ):它控制增强整体的复杂度。通常,单个拆分( d = 1)效果很好。它也被称为。****
Classification error as a function of the number of trees. Each line represents a different interaction depth.
正如你在上面看到的,交互深度为 1 似乎给出了最好的结果。
决策树—实践
现在,让我们应用我们所学的知识来预测乳腺癌。许多关于乳腺癌的数据集包含关于肿瘤的信息。然而,我很幸运地找到了一个数据集,其中包含了乳腺癌患者和非乳腺癌患者的常规血液检查信息。潜在地,如果我们能够准确地预测一个病人是否患有癌症,那么这个病人可以接受非常早期的治疗,甚至在肿瘤被发现之前!
当然,数据集和完整的笔记本都可以在这里获得,我强烈建议你也一起编码。
探索性数据分析
在开始 Jupyter 的工作之前,我们可以在这里获得关于数据集的信息。
首先,您会注意到数据集非常小,只有 116 个实例。这带来了几个挑战,因为决策树可能会过度拟合数据,或者由于缺乏其他观察,我们的预测模型可能不是最好的。然而,这是一个很好的概念验证,可能证明通过简单的血液测试预测乳腺癌的真正潜力。
数据集仅包含以下十个属性:
1.年龄:患者的年龄(岁)
2.身体质量指数:体重指数(千克/米)
3.葡萄糖:血液中的葡萄糖浓度(毫克/分升)
4.胰岛素:血液中的胰岛素浓度(微单位/毫升)
5.HOMA:胰岛素抵抗的稳态模型评估(葡萄糖乘以胰岛素
6.瘦素:能量消耗激素瘦素的浓度(ng/mL)
7.脂联素:脂联素的浓度——一种调节葡萄糖水平的蛋白质(微克/毫升)
8.抵抗素:抵抗素的浓度——脂肪组织分泌的一种蛋白质(ng/mL)
9.MCP . 1:MCP-1 的浓度——一种由于组织损伤或炎症而将单核细胞募集到炎症部位的蛋白质(pg/dL)
10.分类:健康对照(1)或患者(2)
现在我们知道了我们将使用什么,我们可以从导入我们常用的库开始:
然后,定义数据集的路径,让我们预览一下:
太好了!现在,因为这是一个分类问题,所以让我们看看这些类别是否平衡:
结果应该是:
如你所见,病人和健康对照的数量几乎相同。
现在,看看健康人和病人的每个特征的分布和密度会很有趣。为此,一个小提琴情节是理想的。它显示了单一地块中要素的密度和分布。让我们有九个小提琴情节:每个特征一个:
花点时间回顾一下所有的图,试着找出健康对照和患者之间的一些差异。
最后,让我们检查一下是否有丢失的值:
您应该看到没有一列缺少值!我们现在准备开始建模!
系统模型化
首先,我们需要将类编码为 0 和 1:
现在,0 代表健康对照,1 代表病人。
然后,我们将数据集分为训练集和测试集:
在编写模型之前,我们需要定义适当的误差度量。在这种情况下,由于这是一个分类问题,我们可以使用混淆矩阵并使用分类误差。让我们编写一个帮助函数来绘制混淆矩阵:
厉害!现在,让我们实现一个决策树。
决策图表
使用 scikit-learn ,决策树很容易实现:
您应该得到以下混淆矩阵:
****
如您所见,它错误地分类了三个实例。因此,我们来看看套袋、助推或随机森林是否能提高树的性能。
制袋材料
为了实现带有 bagging 的决策树,我们编写以下代码:
你会得到下面的混淆矩阵:
太神奇了!该模型对测试集中的所有实例进行了正确分类!为了得到更多的练习,让我们也实现一个随机森林分类器并使用 boosting。
随机森林分类器
这里,对于随机森林分类器,我们指定我们想要的树的数量。让我们用 100:
****
你会得到这个混乱矩阵:
在这里,虽然只有一个实例被错误分类,但是模型实际上说一个病人是健康的,而实际上这个人患有癌症!这是非常不理想的情况。
助推
最后,对于升压:
我们得到了以下结果:
同样,只有一个实例被错误分类。
支持向量机(SVM)——理论
我们已经看到了如何使用逻辑回归、LDA 和决策树处理分类问题。现在,又引入了另一个分类工具:支持向量机。
支持向量机是一种称为最大间隔分类器的分类器的推广。最大间隔分类器很简单,但它不能应用于大多数数据集,因为类必须由线性边界分隔。
这就是为什么支持向量分类器被引入作为最大间隔分类器的扩展,其可以应用于更广泛的情况。
最后,支持向量机只是支持向量分类器的进一步扩展,以适应非线性类边界。
它可用于二元或多元分类。
解释支持向量机的理论非常专业。希望这篇文章能让你更容易理解支持向量机是如何工作的。
最大间隔分类器
这种方法依赖于使用超平面来分离类。
什么是超平面?
在 p 维空间中,超平面是维数为 p-1 的平坦仿射子空间。视觉上,在 2D 空间中,超平面将是一条线,而在 3D 空间中,它将是一个平面。
数学上,超平面简单地说就是:
General hyperplane equation
如果 X 满足上式,则该点位于平面上。否则,它必须在平面的一侧,如下图所示。
The line represents a hyperplane in a 2D space. Points that satisfy the equation above will lie on the line, while others are on one side of the plane.
一般来说,如果可以使用超平面完美地分离数据,那么就有无限数量的超平面,因为它们可以向上或向下移动,或者稍微旋转,而不会接触到观察结果。
这就是为什么我们使用最大间隔超平面或最佳分离超平面的原因,最佳分离超平面是离观察值最远的分离超平面。我们从给定超平面的每个训练观察计算垂直距离。这就是所谓的余量**。因此,最优分离超平面是具有最大余量的超平面。**
Example of a maximal margin hyperplane
正如你在上面看到的,有三个点与超平面等距。这些观察结果被称为支持向量**,因为如果它们的位置移动,超平面也会移动。有趣的是,这意味着超平面仅依赖于支持向量,而不依赖于任何其他观察。**
如果不存在分离平面呢?
Overlapping classes where no separating hyperplane exists
在这种情况下,没有最大间隔分类器。我们使用一个支持向量分类器,该分类器使用一个被称为支持向量分类器的软余量来几乎分离类别。然而,进一步讨论这种方法变得非常技术性,因为它不是最理想的方法,我们现在将跳过这个主题。
支持向量机(SVM)
支持向量机是支持向量分类器的扩展,通过使用内核来扩大特征空间。核方法只是一种有效的计算方法,用于适应类之间的非线性边界。
在不涉及技术细节的情况下,核是量化两个观察的相似性的函数。内核可以是任何程度的。使用度大于 1 的核导致更灵活的决策边界,如下所示。
Example of classification with SVM
为了更好地理解内核的选择如何影响 SVM 算法,让我们在四个不同的场景中实现它。
支持向量机(SVM)-实践
这个项目分为四个小项目。
第一部分将展示如何使用线性核执行分类,以及正则化参数 C 如何影响得到的超平面**。**
然后,第二部分将展示如何使用高斯核生成一个非线性超平面。
第三部分模拟重叠类,我们将使用交叉验证来找到 SVM 的最佳参数。
最后,我们使用 SVM 执行了一个非常简单的垃圾邮件分类器。
以上练习摘自吴恩达在 Coursera 上的免费课程。我简单用 Python 解决,导师不推荐。尽管如此,我还是向所有初学者强烈推荐这门课程。
一如既往,笔记本和资料在这里可用。
迷你项目 1——线性核 SVM
在我们开始之前,让我们导入一些有用的库:
注意,我们在这里导入了 loadmat ,因为我们的数据是矩阵形式的。
然后,我们将数据集的路径存储在不同的变量中:
最后,我们将构建一个函数来帮助我们快速绘制每个数据集:
完美!
现在,在这一部分,我们将使用线性核实现一个支持向量机,我们将看到正则化参数如何影响超平面。
首先,让我们加载并可视化数据:
您应该会看到:
注意上图左侧的异常值。让我们看看正则化参数在存在异常值时将如何影响超平面。
上面的代码块简单地将 SVM 拟合到数据中,我们使用预测来绘制超平面。注意,我们使用正则化参数 1。结果应该如下所示:
Hyperplane with C=1
如你所见,超平面忽略了异常值。因此,较低正则化参数将被更好地概括**。测试误差通常会高于交叉验证误差。**
现在,让我们增加正则化参数:
你会得到:
Hyperplane with C=100
现在,异常值在超平面的右侧,但这也意味着我们过度拟合了。最终,这个边界在未观察到的数据上表现不好。
迷你项目 2——高斯核 SVM
现在,我们知道为了适应非线性边界,我们需要改变核函数。在这个练习中,我们将使用一个高斯内核。
首先,让我们绘制我们的数据:
您应该会看到:
在实现 SVM 之前,您应该知道高斯核表示为:
Gaussian kernel function
注意,有一个参数 sigma 决定了当它们相距较远时,相似性度量多快变为零。
因此,我们用以下代码实现它:
你应该得到下面的超平面:
Non-linear hyperplane with a Gaussian kernel
太神奇了!超平面不是一个完美的边界,但它在分类大多数数据方面做得很好。我建议你尝试不同的 sigma 值,看看它是如何影响超平面的。
迷你项目 3——交叉验证的 SVM
交叉验证对于从我们的模型中选择最佳性能的最佳调整参数至关重要。让我们看看如何将它应用到支持向量机中。
当然,让我们看看这个练习的数据是什么样的:
你会得到:
注意我们有重叠的类。当然,我们的超平面不会尽善尽美,但我们将使用交叉验证来确保它是我们能得到的最好结果:
从上面的代码单元中,您应该得到最佳正则化参数是 1,并且 sigma 应该是 0.1。使用这些值,我们可以生成超平面:
并获得:
Hyperplane with C=1 and sigma=0.1
迷你项目 4—SVM 垃圾邮件分类
最后,我们用 SVM 训练了一个垃圾邮件分类器。在这种情况下,我们将使用线性核。此外,我们有单独的数据集用于训练和测试,这将使我们的分析更容易一些。
你可以看到,我们得到的训练准确率为 99.825%,而测试准确率为 98.9%!
无监督学习——理论
无监督学习是一组统计工具,用于只有一组特征而没有目标的场景。因此,我们无法做出预测,因为对每个观察结果都没有相关的反应。相反,我们感兴趣的是找到一种有趣的方式来可视化数据,或者发现类似观察的子群。
无监督学习往往更具挑战性,因为分析没有明确的目标,而且往往是主观的。此外,很难评估获得的结果是否良好,因为没有公认的机制来执行交叉验证或验证独立数据集上的结果,因为我们不知道真实的答案。
本指南将重点介绍两种技术:主成分分析和聚类**。**
主成分分析
PCA 是指计算主成分并用于更好地理解数据的过程。PCA 也可以用于可视化。
什么是主成分?
假设您想要可视化一组 p 特征上的 n 观测值,作为探索性数据分析的一部分。我们可以一次检查两个特征的 2D 散点图,但如果有很多预测因素,就会很快失控。
使用 PCA,我们可以找到包含尽可能多的变化的数据集的低维表示。因此,我们只获得最感兴趣的特征,因为它们是方差的主要来源。
主成分是怎么找到的?
第一个主成分是具有最大方差的特征的归一化线性组合:
First principal component equation
符号φ被称为载荷**。负载必须最大化:**
这就是全部了!
聚类方法
聚类是指在数据集中查找子组或聚类的一系列技术。这有助于我们将观察结果划分为不同的组,以便每个组包含彼此相似的观察结果。例如,在乳腺癌的情况下,组可以代表肿瘤等级。它在市场细分的营销中也非常有用,以便确定更容易接受某种产品的人群。
聚类方法有很多,但我们将重点介绍 k-means 聚类和层次聚类**。在 K 均值聚类中,我们希望将数据划分成预先指定数量的 K 个聚类。另一方面,对于层次聚类,我们不知道我们需要多少个聚类。相反,我们想要一个树状图,它允许我们查看每个可能的聚类数所获得的所有聚类。**
k 均值聚类
这种方法简单地将观察结果分成 K 个集群。它假设:
1.每个观察值属于 K 个聚类中的至少一个
2.集群不重叠
此外,每个集群内的变化被最小化。
How observations were clustered depending on the number of specified clusters
这是通过最小化一个聚类内每个观察值之间的平方欧几里德距离之和来实现的:
Optimization function for k-mean clustering
为了最小化,我们遵循以下算法:
1.从 1 到 K 之间随机分配一个数字给每个观察值。这些用作观测的初始聚类分配。
2.迭代直到集群分配停止变化:
2.a .对于每个 K 簇,计算簇质心**。第个簇质心是第个簇中观测值的 p 特征均值的向量**
2.b .将每个观察值分配给质心最近(最短欧几里得距离)的聚类
请注意,上面的算法将找到一个局部最小值。因此,所获得的结果将取决于初始随机聚类分配。因此,多次运行该算法非常重要。
分层聚类
k-means 聚类的一个潜在缺点是它需要人工输入来指定聚类的数量。另一方面,层次聚类不需要聚类的初始数量。
最常见的层次聚类类型是自底向上或聚集聚类。这指的是这样一个事实,即从叶子开始生成一个树状图**,并将簇组合到树干。**
Examples of dendrograms
算法其实很简单。它从定义每对观察值之间的不相似性度量开始,比如欧几里德距离。然后,首先假设每个观察值属于它自己的集群。然后将两个最相似的聚类融合,这样就有了 n-1 个聚类。之后,融合另外两个相似的簇,产生 n-2 簇。该过程反复重复,直到所有的观察结果都是单个聚类的一部分。
虽然简单,但有些事情没有解决。如何定义聚类之间的相异度?这是通过联动的概念实现的。下表总结了四种最常见的链接类型:
The four most common types of linkage
完全连锁、平均连锁和质心连锁是最常见的连锁类型,因为单个连锁往往会产生不平衡的树状图。注意,生成的树状图很大程度上取决于所用的连锁类型。
****
Effect of linkage on the final dendrogram
此外,选择合适的相异度也很关键。欧几里德距离被广泛讨论,但也有基于相关性的距离。如果两个特征高度相关,则认为它们是相似的,这意味着它们具有相似的轮廓。**
Observation 1 and 2 are highly correlated, since they have similar profiles
例如,假设一家在线零售商对基于购物者过去的购物历史对他们进行聚类感兴趣。目标是识别相似购物者的子群,这样他们就可以看到可能引起他们兴趣的广告。使用欧几里德距离,那么总体上很少购买商品的购物者将被聚集在一起,这可能不是理想的。另一方面,使用基于相关性的距离,具有类似偏好(他们购买了商品 A 和 B,但没有购买商品 C 和 D)的购物者将被聚集在一起,即使他们购买了不同数量的商品。**
然而,在所有情况下,一旦层次聚类完成,我们仍然需要人工输入来确定要使用的最终聚类数。
现在您已经了解了 PCA 和聚类方法的工作原理,让我们在一个小型项目环境中实现它们。
无监督学习—实践
这部分将分为两个迷你项目。在第一个例子中,我们将使用 k-means 聚类对图像执行颜色量化**。**
然后,在第二个迷你项目中,我们将使用主成分分析来降低数据集的维度,允许我们用 2D 图来可视化它。
在这里你可以得到你需要的一切。
旋转你的 Jupyter 笔记本,我们走吧!
初始设置
在开始任何实现之前,我们将导入一些在以后会变得方便的库:
与之前的教程不同,我们不会导入数据集。相反,我们将使用由 scikit-learn 库提供的数据。
迷你项目 1 —使用 k 均值聚类的颜色量化
快速,颜色量化是一种技术,以减少在图像中使用的不同颜色的数量。这对于在保持图像完整性的同时压缩图像尤其有用。
首先,我们导入以下库:
注意,我们导入了一个名为 load_sample_image 的样本数据集。这仅仅包含两个图像。我们将使用其中一个来执行颜色量化。
因此,让我们展示一下我们将在本练习中使用的图像:
您应该会看到:
Original image
现在,对于颜色量化,必须遵循不同的步骤。
首先,我们需要将图像转换成 2D 矩阵进行处理:
然后,我们训练我们的模型来聚合颜色,以便在图像中有 64 种不同的颜色:
然后,我们构建一个辅助函数来帮助我们用指定颜色的数量重建图像:
最后,我们现在可以看到只有 64 种颜色的图像,以及它与原始图像的对比:
Original image with 96 615 colors
Reconstructed image with 64 colors
当然,我们可以看到一些差异,但总体而言,图像的完整性是守恒的!一定要探索不同数量的集群!例如,如果指定 10 种颜色,将会得到以下结果:
Reconstructed image with 10 colors
迷你项目 2 —使用主成分分析进行降维
在本练习中,我们将使用主成分分析来降低数据集的维度,以便我们可以轻松地将其可视化。
因此,让我们从 scikit-learn 导入虹膜数据集:
现在,我们将计算前两个主成分,并查看每个主成分可以解释的方差比例:
从上面的代码块中,您应该看到第一个主成分包含 92%的方差,而第二个主成分占 5%的方差。因此,这意味着仅两个特征就足以解释数据集中 97%的方差!
现在,我们可以利用它轻松绘制二维数据:
你会得到:
正如你所看到的,主成分分析有助于减少数据集的维数,允许我们绘制它,并可视化每个类别是如何分开的。
时间序列分析—理论
无论我们希望预测金融市场或电力消费的趋势,时间都是我们的模型中必须考虑的重要因素。例如,预测在一天中的什么时间将会出现用电高峰是令人感兴趣的,例如调整电力的价格或产量。
进入时间序列**。时间序列就是按时间顺序排列的一系列数据点。在时间序列中,时间通常是独立变量,目标通常是对未来做出预测。**
然而,在处理时间序列时,还有其他方面的因素在起作用。
是静止的吗?
有没有季节性**?**
目标变量是否与自相关?
自相关
非正式地说,自相关是观测值之间的相似性,是它们之间的时滞的函数。
Example of an autocorrelation plot
上面是一个自相关图的例子。仔细观察,您会发现第一个值和第 24 个值具有很高的自相关性。同样,第 12 次和第 36 次观察高度相关。这意味着我们会在每 24 个时间单位找到一个非常相似的值。
注意这个图看起来像正弦函数。这是对季节性、的暗示,你可以通过在上面的图中找到时间段来找到它的值,这将给出 24 小时。
季节性
****季节性指周期性波动。例如,用电量白天高,晚上低,或者圣诞节期间在线销售增加,然后再次放缓。
Example of seasonality
从上面可以看出,有明显的日季节性。每一天,你都会在傍晚看到一个高峰,而最低点则是每天的开始和结束。
请记住,如果自相关图呈正弦曲线形状,季节性也可以从自相关图中得出。简单地看周期,它给出了季节的长度。
平稳性
平稳性是时间序列的重要特征。如果一个时间序列的统计特性不随时间变化,则称该时间序列是平稳的。换句话说,它有常数均值和方差,协方差与时间无关。
Example of a stationary process
再看同样的图,我们看到上面的过程是静止的。平均值和方差不随时间变化。
通常,股票价格不是一个稳定的过程,因为我们可能会看到一个增长的趋势,或者它的波动性可能会随着时间的推移而增加(意味着方差在变化)。
理想情况下,我们希望有一个平稳的时间序列来建模。当然,并不是所有的都是静止的,但是我们可以做不同的变换使它们静止。
如何测试一个过程是否是稳定的
你可能已经注意到了上面这个图的标题。这是我们用来确定时间序列是否平稳的统计测试。
在不深入 Dickey-Fuller 检验的技术细节的情况下,它检验了单位根存在的零假设。
如果是,那么p>0,过程不是静止的。
否则, p = 0,零假设被拒绝,过程被认为是平稳的。
例如,下面的过程不是静止的。请注意,平均值在整个时间内并不恒定。
Example of a non-stationary process
建模时间序列
为了进行预测,有许多方法可以对时间序列进行建模。在这里,我将介绍:
- 移动平均数
- 指数平滑法
- ARIMA
移动平均数
移动平均模型可能是时间序列建模中最简单的方法。该模型简单地说明了下一个观察值是所有过去观察值的平均值。
虽然简单,但这个模型可能会出奇的好,它代表了一个好的起点。
否则,移动平均线可用于识别数据中有趣的趋势。我们可以定义一个窗口来应用移动平均模型平滑时间序列,并突出显示不同的趋势。
Example of a moving average on a 24h window
在上图中,我们将移动平均模型应用于 24 小时窗口。绿线平滑了时间序列,我们可以看到 24 小时内有两个峰值。
当然,窗口越长,趋势就越平稳。下面是一个小窗口的移动平均线的例子。
Example of a moving average on a 12h window
指数平滑法
指数平滑使用与移动平均类似的逻辑,但是这一次,不同的递减权重被分配给每个观察值。换句话说,随着我们离现在越来越远,观察的重要性就越来越小。
数学上,指数平滑表示为:
Exponential smoothing expression
这里,α是取值在 0 和 1 之间的平滑因子**。它决定了先前观察到的重量减少的速度。**
Example of exponential smoothing
从上面的图中,深蓝色线表示使用平滑因子 0.3 对时间序列进行指数平滑,而橙色线使用平滑因子 0.05。
可以看到,平滑因子越小,时间序列就越平滑。这是有意义的,因为当平滑因子接近 0 时,我们就接近移动平均模型。
双指数平滑
当时间序列中存在趋势时,使用双指数平滑。在这种情况下,我们使用这种技术,它只是指数平滑的两次递归使用。
数学上:
Double exponential smoothing expression
这里, beta 是趋势平滑因子**,取 0 到 1 之间的值。**
下面,您可以看到 alpha 和 beta 的不同值如何影响时间序列的形状。
Example of double exponential smoothing
三指数平滑
该方法通过添加季节性平滑因子扩展了双指数平滑。当然,如果您注意到时间序列中的季节性,这是很有用的。
数学上,三重指数平滑表示为:
Triple exponential smoothing expression
其中伽玛是季节平滑因子,而 L 是季节的长度。
季节性自回归积分移动平均模型
SARIMA 实际上是简单模型的组合,以形成一个复杂的模型,该模型可以模拟具有非平稳属性和季节性的时间序列。
首先,我们有自回归模型 AR§** 。这基本上是时间序列自身的回归。这里,我们假设当前值依赖于它以前的值,有一些滞后。它采用一个代表最大滞后的参数 p 。为了找到它,我们查看部分自相关图,并确定大多数滞后不显著之后的滞后。**
在下面的例子中, p 应该是 4。
Example of a partial autocorrelation plot
然后,我们添加移动平均线模型 MA(q)** 。这需要一个参数 q ,该参数代表最大滞后,在该最大滞后之后,其他滞后在自相关图上不显著。**
下面, q 会是 4。
Example of an autocorrelation plot
之后,我们加上的积分顺序** I(d) 。参数 d 代表使序列稳定所需的差值数量。**
最后,我们添加最后一个组件:季节性 S(P,D,Q,s) ,其中 s 就是季节的长度。此外,该组件需要参数 P 和 Q ,它们与 p 和 q 相同,但针对季节性组件。最后, D 是季节积分的顺序,代表从序列中去除季节性所需的差异数。
综合所有这些,我们得到了萨里玛(P,D,q)(P,D,Q,s)** 模型。**
主要要点是:在使用 SARIMA 建模之前,我们必须对时间序列进行转换,以消除季节性和任何非平稳行为。
时间序列分析—实践
我们会试着预测一家特定公司的股价。现在,预测股票价格几乎是不可能的。然而,这仍然是一个有趣的练习,也是练习我们所学知识的好方法。
我们将使用新德国基金(GF)的历史股价来尝试预测未来五个交易日的收盘价。
你可以在这里抓取数据集和笔记本。
和往常一样,我强烈推荐你跟着编码!启动你的笔记本,我们走吧!
导入数据
首先,我们导入一些对我们的分析有帮助的库。此外,我们定义了平均百分比误差(MAPE)** ,因为这将是我们的误差度量。**
首先,我们导入一些对我们的分析有帮助的库。此外,我们定义了平均百分比误差(MAPE)** ,因为这将是我们的误差度量。**
然后,我们导入数据集,对前十个条目进行排序,您应该会得到
First 10 entries of the dataset
正如你所看到的,我们有几个条目是关于一只不同于新德国基金的股票。此外,我们有一个关于当天信息的条目,但我们只想要当天结束时(EOD)的信息。
清理数据
首先,我们删除不需要的条目。
然后,我们删除不需要的列,因为我们只想关注股票的收盘价。
如果预览数据集,您应该会看到:
Clean dataset
厉害!我们准备好进行探索性数据分析了!
探索性数据分析
我们绘制了数据集整个时间段的收盘价。
您应该得到:
Closing price of the New Germany Fund (GF)
显然,你看到这不是一个平稳的过程,很难判断是否存在某种季节性**。**
移动平均数
让我们使用移动平均模型来平滑我们的时间序列。为此,我们将使用一个助手函数,该函数将在指定的时间窗口运行移动平均模型,并绘制出平滑的结果曲线:
使用 5 天的时间窗,我们得到:
Smoothed curve by the previous trading week
如你所见,我们几乎看不到趋势,因为它太接近实际曲线了。让我们看看上个月和上个季度的平滑结果。
Smoothed by the previous month (30 days)
Smoothed by the previous quarter (90 days)
现在趋势更容易发现了。注意 30 天和 90 天的趋势是如何在最后显示出下降曲线的。这可能意味着股票可能会在接下来的几天下跌。
指数平滑法
现在,让我们使用指数平滑来看看它是否能获得更好的趋势。
这里,我们使用 0.05 和 0.3 作为平滑因子的值。随意尝试其他值,看看结果如何。
Exponential smoothing
正如你所看到的,0.05 的 alpha 值平滑了曲线,同时拾取了大部分向上和向下的趋势。
现在,让我们使用双指数平滑。****
双指数平滑
你会得到:
Double exponential smoothing
同样,尝试不同的 alpha 和 beta 组合来获得更好看的曲线。
系统模型化
如前所述,我们必须把我们的系列变成一个平稳的过程,以便对它建模。因此,让我们应用 Dickey-Fuller 检验来看看它是否是一个平稳过程:
您应该看到:
通过 Dickey-Fuller 检验,时间序列无疑是非平稳的。还有,看自相关图,看到很高,似乎没有明显的季节性。
因此,为了去掉高自相关性,并使过程平稳,我们取第一个差(代码块中的第 23 行)。我们简单地从滞后一天的时间序列中减去时间序列,我们得到:
厉害!我们的系列现在是固定的,我们可以开始建模!
萨里玛
现在,对于 SARIMA,我们首先定义一些参数和其他参数的值范围,以生成 P,Q,D,P,Q,D,s 的所有可能组合的列表。
现在,在上面的代码单元中,我们有 625 种不同的组合!我们将尝试每种组合,并用每种组合来训练 SARIMA,以找到最佳表现模式。这可能需要一段时间,具体取决于您计算机的处理能力。
完成后,我们会打印出最佳模型的摘要,您应该会看到:
厉害!我们最终预测未来五个交易日的收盘价,并评估模型的 MAPE。
在这种情况下,我们有 0.79%的 MAPE,这非常好!
将预测价格与实际数据进行比较
现在,为了将我们的预测与实际数据进行比较,我们从雅虎财经获取财务数据,并创建一个数据框架。
然后,我们画一个图,看看我们离实际收盘价有多远:
Comparison of predicted and actual closing prices
看来我们的预测有点偏差。事实上,预测价格基本持平,这意味着我们的模型可能表现不佳。
同样,这不是因为我们的程序,而是因为预测股票价格基本上是不可能的
来源
- 统计学习介绍 —加雷斯·詹姆士等。
- 机器学习 —吴恩达
- 开放机器学习课程:时间序列 —德米特里·谢尔盖耶夫