建立机器学习系统
An Overview of Building a Machine Learning System
前言叨B叨
前两章对机器学习的背景以及应用场景做了比较详细的阐述, 还介绍了一个关于机器学习算法的基本概念. 从第三章起会围绕机器学习的流程,算法等详细铺开, 同学们请系好安全带.
观众朋友们,晚上好,
今天是个好号,农历不造初几,欢迎收看新闻联播节目,
首先向您介绍这次新闻的主要内容:
1.机器学习中,NumPy, scikit-learn, 和 pandas是怎么一回事
2.向量(Vectors):如何有效地处理大型数据集
3.训练有监督机器学习模型的基本工作流程
4.梯度增强(Gradient boosting): 它一个通用的机器学习算法
下面是详细报道:
1. NumPy, scikit-learn, 和潘大师(pandas)
Python是机器学习中使用最广泛的编程语言之一。除了简单易用之外,Python之所以非常流行因为它有许多hen很棒的机器学习库。我们将用到三个最流行的库: 首先,我们将使用numpy。NumPy是一个库,利用它你可以处理大型数据集以及内存操作。它是免费的、开源的,而且在硅谷之类的IT行业应用相当广泛。它是许多其他机器学习库的基础。接下来,我们将使用scikit-learn。scikit-learn是一个非常受欢迎的机器学习库。
你可以把它看作是机器学习中的瑞士军刀。它提供了许多最流行的机器学习算法并且很容易使用。最后,我们还将使用pandas。pandas允许您将数据表示为一个可以用代码控制的虚拟电子表格。它有许多类似微软Excel的功能,比如快速编辑和计算等等。它能够轻松的处理CSV数据文件。pandas的名字来自“panel data”一词(和我们的大熊猫不搭噶哈),因为它把你的数据表示成一系列的面板,就像电子表格中的页面一样。
令人欣慰的是, 所有这些库都完美地协同工作。NumPy提供数据加载和数据处理的基本工作,pandas则使得数据更容易清理及易于计算. 基于处理过的数据, 然后由scikit-learn提供实际的机器学习算法来执行。
2. 向量(Vectors):如何有效地处理大型数据集
在机器学习中,我们经常使用大数据数组。由于机器学习的线性代数根(linear algebra roots),这些数组有时被称为单个数据列的向量和较大数组的向量。让我们看看如何在代码中使用向量。让我们打开vecotors pt1.py。
这里有一个简单的数组,或者向量,表示训练数据集中每套房的面积。当我们训练机器学习算法时,我们经常需要在训练数据集中的每一行应用相同的数学运算。例如,假设我们要将每个面积乘以0.3的权重。
完成这个事情最高效的方法是什么?在传统的编程中,标准的解决方案是每次一行遍历数组,一个for循环搞定。让我们运行代码并检查输出。在控制台中,我们可以看到它在得到最终结果之前对数组进行了13次独立的更新。这样做是没毛病的,但每次在数组中一个元素上对每个元素进行乘法实际上效率很低。如今的CPU有能力并行批量操作。
这种能力称为单指令、多数据或SIMD。而不是一次一个地遍历每个数组元素,CPU可以将数组块加载到内存中,并在一步中完成该块上的所有乘法操作。这在处理大型数组时速度会产生巨大的差异。让我们来看看代码vecotors pt2.py。
我们不使用循环来处理数组,而是使用一个数组库,它知道如何并行处理数据。NumPy可以在内存中非常高效地创建数组, 然后会自动并行化。
因此,我们不使用for循环,我们的代码看起来如下所示。
首先我们创建的数组作为NumPy数组而不是作为一个正常的Python数组。然后我们会将整个数组乘以0.3。当我们告诉NumPy要把一个数组乘以一个单个的数字时,NumPy会将此操作分别应用于数组中的每一个元素。让我们来运行代码看看效果。
哪种方法更高效?相信群众的眼睛是雪亮的。
但更重要的是,NumPy自动利用CPU的SIMD功能,增加并联阵列块。我们得到与使用for循环相同的结果,但我们不需要经历这么多步骤。你在阵列上需要做的大部分操作都可以并行完成。这包括简单的操作比如加法,减法,乘法,和除法,甚至更复杂的操作,如正弦和余弦。这就是所谓的矢量化我们的代码。我们用可并行执行的向量操作代替迭代循环。这是非常重要的一点。
如果你发现自己为数组写了一个for循环,那么你可能out了。相反,你应该使用numpy来操作整个数组。
3. 训练有监督机器学习模型的基本工作流程
让我们浏览基本的工作流来训练有监督的机器学习模型。不管使用哪种有监督的机器学习算法,基本过程都是一样的。我们将在课程的后面更详细地介绍这个工作流的每一步,但是在深入了解细节之前,了解基本的工作流是非常有帮助的。
使用机器学习的第一步是获取数据。对于我们预测房屋价格的项目,我们将收集一年内所有在一个地区销售的房屋的数据。对于每一个出售的房子,我们会尽可能多地收集,比如卧室的数量,房子的大小等等。下一步是清理和预处理数据。
我们开始使用的数据几乎总是需要先处理一下,然后才能用于机器学习。我们将详细介绍这一点,但基本思想是:将任何基于文本的数据转换成数字,并选择哪些数据最有用以包含在模型中。接下来,我们将获取所有的数据,并对数据的顺序进行乱序排列。
我们希望确保数据是随机的,这样机器学习算法就不会因为数据恰好符合某个特定的顺序,而在不存在的模式上拾取数据。下一步,我们将得到经过处理的数据,并将其分成两组,通常是第一组数据的70%行,第二组中的30%行。
前70%的数据是我们用来训练模型的。这称为我们的训练数据集。机器学习模型将仅基于此数据创建。最后30%的数据是我们的测试数据。这些数据将不用于训练模型,而是用于检查模型的准确性。同样非常重要的是,我们也不用训练数据来检查模型的准确性。现在我们有了干净的、经过调整的、拆分的数据,我们已经准备好训练机器学习模型了。但是每一个机器学习算法都需要设置一些参数。这些参数将控制诸如模型如何学习模式和数据的速度以及模式的复杂程度。
这些被称为超参数(hyperparameters)设置。然后,通过训练数据和期望输出来训练机器学习模型。
当模型被训练时,我们需要检查它对测试数据集的准确性。这证明了该模型在新数据上是否有效,或者只适用于训练数据。如果它能够预测测试数据集的精确值,就意味着该模型已经可以使用了。如果它不能预测测试数据集的精确值,我们需要再试一次。
我们可以改变我们给模型的训练数据,或改变模型的参数直到我们得到我们想要的结果。
最后,一旦模型被训练和评估,我们就可以使用它。我们可以对新数据进行反馈,这将给我们提供新的预测。
4. 梯度增强(Gradient boosting): 一个通用的机器学习算法
在本节中,我们将学习梯度增强算法,这是一种强大的机器学习算法,在许多不同种类的现实问题中都能起到很好的作用。它可以处理复杂的模式和线性模型无法处理的数据。梯度增强是一种集成学习算法。集成学习算法使用了许多简单的机器学习模型,这些模型可以比任何单独的模型本身更精确地解决问题。梯度提升的基本数据结构是一个决策树。决策树是一个模型,其中有分支决策点,并通过跟踪树的路径确定最终值。
一个简单的决策树如下所示。
这个决策树有一个决策点。如果房子超过1000平方英尺,它预测房子应该增加额外的50000美元。如果是小的,那么减少50000美元。为了创建更多的细微预测,我们可以向决策树添加第二层,并有更多的决策点。
现在这个模型有点精细了。真正的小房子还有50000美元的减少,而真正大的房子则增加了150000美元。
这是一个很好的开端,但要对各种户型的价值进行建模,需要进一步增加模型的复杂性。有两种方法可以使这个模型更加复杂。第一种方法是在决策树中添加层和分支,直到它对数据集中的每一个单元进行建模。
我们可能会得到一个决策树,它有数百层,有成千上万条分支路径。事实证明,创建非常复杂的决策树通常在实践中不起作用。大的决策树往往不能很好地利用新的数据。第二种方法是创建许多单独的简单决策树,并将每个决策树的输出组合起来得到最终结果。
这是集合方法。每一棵树都会通过看问题的一个小方面来做出最后的回答。这有点像问你所有的朋友同样的问题,并把他们所有的答案结合起来,拿出最好的最终答案。梯度增强有一个技巧,它不创建独立建模数据的多个决策树,而是创建相互建立的决策树。每个新树的目标是修复前面树的最大错误。
让我们来看看这是如何在实际数据中工作的。这是一张房屋价格图,根据每平方英尺的面积有多大。
每一个蓝点代表一个真正的房子。你可以看到,大小和价值之间存在着明显的关系。粗略地说,较大的房子更贵。我们的目标是使用梯度增强来建立这种关系模型。在算法的第一步,它将创建一个只有几个分支的简单决策树。这条橙色线显示了根据其大小和平方英尺分配给一所房子的决策树的值。第一个决策树非常简单。1500平方英尺以下的房子价值不到10000美元,2200平方英尺以上的房子价值10000美元,而2700平方英尺以上的房子则价值10000美元。
第一个决策树捕获了一点模式,但在上下极端都不是很准确。它的小房子和低估值的大房子。现在,梯度增强算法将添加第二个决策树。但是当它创建第二棵树时,它会特别地减少第一棵树错误的地方。下面是第二个决策树添加时的线条。
您可以看到第二个决策树增加了三个决策点。通过给小房子额外的价格处罚和大房子额外的刺激,这两个决策树组合做一个稍微好一点的整体工作的数据拟合。
让我们结合这个过程并添加20个决策树,每一个都改进以前树的错误。现在我们有了一条很好地跟踪数据的行。这是一个很好的模型,我们可以用来预测房价的平方米,但现在让我们继续75次迭代。
现在,该行开始弯曲和扭曲,以跟踪数据集中的特定离群值。这是过度拟合(overfitting)。我们让我们的机器学习模型变得太复杂了,它开始模拟真正不存在的剧烈的价格波动。在以后的课程我们会谈论过如何避免。
结语
如有错误请高手指正.
你的 关注-收藏-转发 是我继续分享的动力!
网友评论