《如何入门Python与机器学习.docx》由会员分享,可在线阅读,更多相关《如何入门Python与机器学习.docx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、如何入门Python与机器学习Python本身带有许多机器学习的第三方库但本书在绝大多数情况下只会用到Numpy这个根底的科学计算库来进展算法代码的实现。这样做的目的是祈望读者可以从实现的经过中更好地理解机器学习算法的细节和解析Numpy的各种应用。不过作为补充本书会在适当的时候应用scikit-learn这个成熟的第三方库中的模型。 “机器学习在最近虽可能不至于到人尽皆知的程度却也是非常炽热的词汇。机器学习是英文单词“MachineLearning简称ML的直译从字面上便讲明了这门技术是让机器进展“学习的技术。然而我们知道机器终究是死的所谓的“学习归根结底亦只是人类“赋予机器的一系列运算。这
2、个“赋予的经过可以有很多种实现而Python正是其中相对容易上手、同时性能又相当不错的一门语言。本文打算先谈谈机器学习相关的一些比拟广泛的知识再介绍并讲明为何要使用Python来作为机器学习的工具。最后我们会提供一个简短易懂的、具有实际意义的例子来给大众提供一个直观的感受。详细而言本章主要涉及的知识点有机器学习的定义及重要性Python在机器学习领域的优异性怎样在电脑上配置Python机器学习的环境机器学习一般性的步骤。机器学习绪论正如前言所讲由于近期的各种最新成果使得“机器学习成为了非常热门的词汇。机器学习在各种领域的优异表现围棋界的Master是其中最具代表性的存在使得各行各业的人们都或者
3、多或者少地对机器学习产生了兴趣与敬畏。然而与此同时对机器学习有所误解的群体也日益壮大他们或者将机器学习想得过于神秘或者将它想得过于万能。本节拟对机器学习进展一般性的介绍同时会讲明机器学习中一些常见的术语以方便之后章节的表达。什么是机器学习清晨的一句“今天天气真好、朋友之间的应酬“你刚刚是去吃饭了吧、考试过后的感慨“复习了那么久终有收获这些日常生活中随处可见的话语其背后却已蕴含了“学习的思想它们都是利用以往的经历、对未知的新情况作出的有效的决策。而把这个决策的经过交给计算机来做可以讲就是“机器学习的一个最浅白的定义。我们或者答应以先讲讲机器学习与以往的计算机工作款式有什么不同。传统的计算机假如想
4、要得到某个结果需要人类赋予它一串实打实的指令然后计算机就根据这串指令一步步地执行下去。这个经过中的因果关系非常明确只要人类的理解不出偏向运行结果是可以准确预测的。但是在机器学习中这一传统款式被打破了计算机确实仍然需要人类赋予它一串指令但这串指令往往不能直接得到结果相反它是一串赋予了机器“学习才能的指令。在此根底上计算机需要进一步地承受“数据并根据之前人类赋予它的“学习才能从中“学习出最终的结果。这个结果往往是无法仅仅通过直接编程得出的。因此这里就导出了略微深一点的机器学习的定义它是一种让计算机利用数据而非指令来进展各种工作的方法。在这背后最关键的就是“统计的思想它所推崇的“相关而非因果的概念是
5、机器学习的理论根基。在此根底上机器学习可以讲是计算机使用输入给它的数据利用人类赋予它的算法得到某种模型的经过其最终的目的那么是使用该模型预测将来未知数据的信息。既然提到了统计那么一定的数学理论就不可或者缺。相关的、比拟简短的定义会在第4章给出PAC框架这里我们就先只表达机器学习在统计理论下的、比拟深入的本质它追求的是合理的假设空间HypothesisSpace的选取以及模型的泛化Generalization才能。该句中出现了一些专用术语详细的定义会在介绍术语时提及这里我们提供一个直观的理解所谓的假设空间就是我们的模型在数学上的“适用场合。所谓的泛化才能就是我们的模型在未知数据上的表现。注意上述
6、本质上严格来讲应该是PACLearning的本质在其余的理论框架下机器学习是可以具有不同的内核的。从上面的讨论可以看出机器学习以及人类考虑的经过有或者多或者少的类似。事实上我们在第6、第7章讲的神经网络NeuralNetworkNN以及卷积神经网络ConvolutionalNeuralNetworkCNN背后确实有着相应的神经科学的理论背景。然而与此同时需要知道的是机器学习并非是一个“会学习的机器人以及“具有学习才能的人造人之类的这一点从上面众多讨论可以以明晰惭愧的是笔者在第一次听到“机器学习四个字时脑海中浮现的正是一个“聪明的机器人的图像甚至还梦想过它以及人类一起生活的场景。相反的它是被人类
7、利用的、用于开掘数据背后信息的工具。当然如今也不乏“危险的人工智能的讲法霍金大概是其中的“标杆这位伟大的英国理论物理学家甚至警告讲“人工智能的开展可能意味着人类的灭亡。孰好孰坏果然还是见仁见智但可以肯定的是本书所介绍的内容绝不至于导致世界的消灭大众大可轻松愉快地进展接下来的浏览机器学习常用术语机器学习领域有着许多非常根本的术语这些术语在外人听来可能相当高深莫测。它们事实上可以能拥有非常复杂的数学背景但需要知道它们往往也拥有着相对粗浅平凡的直观理解上一小节的假设空间以及泛化才能就是两个例子。本小节会对这些常用的根本术语进展讲明与解释它们背后的数学理论会有所阐述但不会涉及过于本质的东西。正如前文反
8、复强调的数据在机器学习中发挥着不可或者缺的作用而用于描绘数据的术语有好几个需要被牢牢记住的如下。“数据集DataSet就是数据的集合的意思。其中每一条单独的数据被称为“样本Sample。假设没有进展特殊讲明本书都会假设数据集中样本之间在各种意义下互相独立。事实上除了某些特殊的模型如隐马尔可夫模型以及条件随机场该假设在大多数场景下都是相当合理的。对于每个样本它通常具有一些“属性Attribute或讲“特征Feature特征所详细取的值就被称为“特征值FeatureValue。特征以及样本所张成的空间被称为“特征空间FeatureSpace以及“样本空间SampleSpace可以把它们简单地理解为
9、特征以及样本“可能存在的空间。相对应的我们有“标签空间LabelSpace它描绘了模型的输出“可能存在的空间当模型是分类器时我们通常会称之为“类别空间。其中、数据集又可以分为以下三类训练集TrainingSet顾名思义它是总的数据集中用来训练我们模型的局部。虽讲将所有数据集都拿来当作训练集也无不可不过为了进步及合理评估模型的泛化才能我们通常只会取数据集中的一局部来当训练集。测试集TestSet顾名思义它是用来测试、评估模型泛化才能的局部。测试集不会用在模型的训练局部换句话讲测试集相对于模型而言是“未知的所以拿它来评估模型的泛化才能是相当合理的。穿插验证集Cross-ValidationSetC
10、VSet这是比拟特殊的一局部数据它是用来调整模型详细参数的。注意需要指出的是获取数据集这个经过是不平凡的尤其是当今“大数据如日中天的情景下诸如“得数据者得天下的讲法也不算诳语。在此笔者推荐一个非常著名的含有大量真实数据集的网站datasets.html本书常常会用到其中一些适宜的数据集来评估我们自己实现的模型。可以通过详细的例子来理解上述概念。比方我们假设小明是一个在北京读了一年度书的学生某天他想通过宿舍窗外的风景能见度、温度、湿度、路人戴口罩的情况等来判断当天的雾霾情况并据此决定是否戴口罩。此时他过去一年度的经历就是他拥有的数据集过去一年度中每一天的情况就是一个样本。“能见度、“温度、“湿度
11、、“路人戴口罩的情况就是四个特征而能见度“低、温度“低、湿度“高、路人戴口罩的“多就是相对应的特征值。如今小明想了想决定在脑中建立一个模型来帮自己做决策该模型将利用过去一年度的数据集来对如今的情况做出“是否戴口罩的决策。此时小明可以用过去一年度中8个月的数据量来做训练集、2个月的量来做测试集、2个月的量来做穿插验证集那么小明就需要不断地考虑训练模型以下问题用训练集训练出的模型是如何的该模型在穿插验证集上的表现怎么样假如足够好了那么考虑完毕得到最终模型。假如不够好那么根据模型在穿插验证集上的表现重新考虑调整模型参数。最后小明可能会在测试集上评估自己刚刚考虑后得到的模型的性能然后根据这个性能以及模
12、型做出的“是否戴口罩的决策来综合考虑自己到底戴不戴口罩。接下来讲明上一小节中提到过的重要概念假设空间与泛化才能。泛化才能的含义在上文也有讲明为强调起见这里再表达一遍泛化才能针对的其实是学习方法它用于衡量该学习方法学习到的模型在整个样本空间上的表现。这一点当然是特别重要的因为我们拿来训练模型的数据终究只是样本空间的一个很小的采样假如只是过分专注于它们就会出现所谓的“过拟合OverFitting的情况。当然假如过分罔顾训练数据又会出现“欠拟合UnderFitting。可以用一张图来直观地感受过拟合以及欠拟合如图1所示左为欠拟合右为过拟合。图1欠拟合与过拟合所以需要“张弛有度找到最好的那个平衡点。统
13、计学习中的构造风险最小化StructuralRiskMinimizationSRM就是研究这个的它以及传统的经历风险最小化EmpiricalRiskMinimizationERM相比注重于对风险上界的最小化而不是单纯地使经历风险最小化。它有一个原那么在使风险上界最小的函数子集中挑选出使经历风险最小的函数。而这个函数子集正是我们之前提到过的假设空间。注意所谓经历风险可以理解为训练数据集上的风险。相对应的ERM那么可以理解为只注重训练数据集的学习方法它的理论根底是经历风险在某种足够合理的数学意义上一致收敛于期望风险亦即所谓的“真正的风险。关于SRM以及ERM的详细讨论会涉及诸如VC维以及正那么化的
14、概念这里不进展详细展开但需要有这么一个直观的认识为了使我们学习方法训练出的模型泛化才能足够好需要对模型做出一定的“限制而这个“限制就表如今假设空间的选取上。一个非常普遍的做法是对模型的复杂度做出一定的惩罚进而使模型趋于精简。这与所谓的“奥卡姆剃刀原理不谋而合“如无必要勿增实体“切勿浪费较多的东西去做用较少的东西、同样可以做好事情。相比起通过选取适宜的假设空间来躲避过拟合进展穿插验证CrossValidation那么可以让我们知道过拟合的程度进而帮助我们选择适宜的模型。常见的穿插验证有以下三种。S-foldCrossValidation中文可翻译成S折穿插验证它是应用最多的一种方法其方法大致如下
15、。将数据分成S份DD_1,D_2,D_S一共做S次试验。在第i次试验中使用D-D_i作为训练集D_i作为测试集对模型进展训练以及评测。最终选择平均测试误差最小的模型。留一穿插验证Leave-one-outCrossValidation这是S折穿插验证的特殊情况此时SN。简易穿插验证这种实现起来最简单也是本书在进展穿插验证时所采用的方法。它简单地将数据进展随机分组最后到达训练集约占原数据70%的程度这个比例可以视情况改变选择模型时使用测试误差作为标准。机器学习的重要性道理讲了不少但到底为什么要学机器学习机器学习的重要性又在哪里呢事实上回首历史可以发现人类的开展通常伴随着简单体力劳动向复杂脑力劳动
16、的过渡。过去的工作根本上都有着明确的定义告诉你这一步怎么做、下一步再怎么做。而如今这一类的工作已经越来越少取而代之的是更为广泛模糊的、概念性的东西比方讲“将本季度的产品推向最适宜的市场在最大化期望利润的同时尽量做到风险最小化这种需求。想要完成好这样的任务需要获取相应的数据虽讲网络的存在让我们可以得到数之不尽的数据然而从这些数据中获得信息与知识却不是一项简单的工作。我们当然可以人工地、仔细地逐项甄选但这样显然就又回到了最初的原点。机器学习这门技术可以讲正因此应运而生。单单抽象地讲一大堆空话可能会让人头昏脑涨我们就举一举机器学习详细的应用范围从中大概可以比拟直观地看出机器学习的强大与重要。开展到如
17、今机器学习的“爪牙可谓已经伸展到了各个角落、包括但不限于机器视觉也就是最近机器学习里很炽热的深度学习的一种应用语音识别也就是微软Cortana背后的核心技术数据挖掘也就是耳熟能详的大数据相关的领域统计学习也就是本书讲解的主要范围之一有许许多多著名的算法比方支持向量机SVM都源于统计学习但是统计学习还是以及机器学习有区别的简单地讲统计学习偏数学而机器学习偏理论。机器学习还可以进展形式识别、自然语言处理等等之前提到过的围棋界的Master以及最新人工智能在德州扑克上的表现亦无不呈现着机器学习强大的潜力。一言以蔽之机器学习是当今的热点虽讲不能保证它的热度能100%地一直延续下去至少笔者认为、它能在相
18、当长的一段时间内保持强大的生命力。人生苦短我用Python上一节大概地介绍了机器学习的各种概念这一节我们主要说说脚本语言Python相关的一些东西。题目是在Python界流传甚广的“谚语它讲述了Python强大的功能与易于上手的特性。为何选择Python援引开源运动的领袖人物EricRaymond的讲法“Python语言非常干净设计优雅具有出色的模块化特性。其最出色的地方在于鼓励明晰易读的代码十分合适以渐进开发的方式构造工程。Python的可读性使得即使是刚学不久的人也能看懂大局部的代码Python庞大的社区以及大量的开发文档更是使得初学者可以快速地实现许许多多令人惊叹的功能。对于Python
19、的程序人们甚至有时会戏称其为“可执行的伪代码executablepseudo-code以突显它的明晰性以及可读性。Python的强大是毋庸置疑的上文提到的EricRaymond甚至称其“过于强大了。与之相对应的就是Python的速度比拟慢。然而比起Python开发环境提供的海量高级数据构造如列表、元组、字典、集合等以及数之不尽的第三方库再加上高速的CPU以及近代开展起来的GPU编程速度的问题就显得没那么锋利了。况且Python还能通过各种途径使用C/C代码来编写核心代码其强大的“胶水功能使其速度在程序员才能允许的情况下以及纯粹的C/C相比已经相去不远。一个典型的例子也是我们会在本书常常运用到的
20、Python中Numpy这个第三方库。编写它的语言正是底层语言C以及Fortran其支持向量、矩阵操作的特性以及优异的速度使得Python在科学计算这一领域大放异彩。注意Python及本书用到的两个非常优异的第三方库Numpy以及TensorFlow的扼要教程我们会作为附录章节放在本书的最后建议有需要的读者先浏览相应局部。Python在机器学习领域的优势固然在上一小节表达了Python的种种好处但不可否认的是确实存在诸如MATLAB以及Mathematica这样的高级程序语言。它们对机器学习的支持也不错MATLAB甚至还自带许多机器学习的应用。但是作为一个问心无愧的程序员我们还是需要提倡支持正
21、版而MATLAB的正版软件需要花费数千美元。与之相对由于Python是开源工程几乎所有必要的组件都是完全免费的。之前也提到过Python的速度问题但是更快更底层的语言比方C以及C假设使用它们来学习机器学习会不可防止地引发这么一个问题即使是实现一个非常简单的功能也需要进展大量的编写以及调试的经过在这期间程序员很有可能忘掉学习机器学习的初衷而迷失在代码的海洋中。笔者曾经尝试过将Python上的神经网络框架移植到C上这之间的折腾至今难忘。此外笔者认为、使用Python来学习机器学习是以及“不要过早优化这句编程界的金句有着异曲同工之妙的。Python几乎唯一的缺陷速度在初期进展快速检验算法、思想正误及
22、开发工作时其实根本上不是重要问题。其中的道理是显而易见的假如解决问题的思想存在问题那么即使拼命去进步程序的运行效率也只能使问题越来越大而已。这种时候先使用Python进展快速实现有必要时再用底层代码重写核心代码从各方面来讲都是一个更好的选择。关于AnacondaPython的强大有相当大一局部表达在它那浩如烟海的第三方库。在使用Python实现一个复杂功能时假如没有特殊的需求我们通常会先搜索Google有没有现成的第三方库然后会搜索是否有相关联的第三方库最后才会考虑自己重头实现。第三方库是如此之多从中挑选出心仪而适宜的并非易事。幸运的是就连这一点也有第三方软件进展了支持那就是在Python科学
23、计算领域非常知名的Anaconda。这是一个完全免费的软件经常会进展各种更新最重要的是它把几乎所有常用且优异的科学计算库都集成在了一起。换句话讲只要你安装了Anaconda就意味着拥有了一个完善精致的机器学习环境根本上无须自己把要用到的库一个一个通过命令行来安装。第一个机器学习样例作为本章的总结我们来运用Python解决一个实际问题以便对机器学习有一个详细的感受。由于该样例只是为了提供直观感受我们就拿比拟有名的一个小问题来进展阐述。俗话讲“麻雀虽小五脏俱全我们完全可以通过这个样例来对机器学习的一般性步骤进展一个大致的认知。该问题来自Coursera上的斯坦福大学机器学习课程其表达如下现有47个
24、房子的面积以及价格需要建立一个模型对新的房价进展预测。略微翻译问题可以得知输入数据只有一维亦即房子的面积。目的数据也只有一维亦即房子的价格。需要做的就是根据已知的房子的面积以及价格的关系进展机器学习。下面我们就来一步步地进展操作。获取与处理数据原始数据集的前10个样本如表1.1所示这里房子面积以及房子价格的单位可以随意定夺因为它们不会对结果造成影响。表1.1房价数据集完好的数据集可以参见_Data/prices.txt。固然该数据集比拟简单但可以看到其中的数字都相当大。保存它原始形式确实有可能是有必要的但一般而言我们应该对它做简单的处理以期望降低问题的复杂度。在这个例子里采取常用的将输入数据标
25、准化的做法其数学公式为代码1-1第一个机器学习样例a_FirstExampleRegression.py01#导入需要用到的库02importnumpyasnp03importmatplotlib.pyplotasplt05#定义存储输入数据x以及目的数据y的数组06x,y,07#遍历数据集变量sample对应的正是一个个样本08forsampleinopen(./_Data/prices.txt,r):09#由于数据是用逗号隔开的所以调用Python中的split方法并将逗号作为参数传入10_x,_ysample.split(,)11#将字符串数据转化为浮点数12x.append(float
26、(_x)13y.append(float(_y)14#读取完数据后将它们转化为Numpy数组以方便进一步的处理15x,ynp.array(x),np.array(y)16#标准化17x(x-x.mean()/x.std()18#将原始数据以散点图的形式画出19plt.figure()20plt.scatter(x,y,cg,s6)21plt.show()上面这段代码的运行结果如图2所示。图2预处理后的数据散点图这里横轴是标准化后的房子面积纵轴是房子价格。以上我们已经比拟好地完成了机器学习任务的第一步数据预处理。选择与训练模型在弄好数据之后下一步就要开场选择相应的学习方法以及模型了。幸运的是通过
27、可视化原始数据可以非常直观地感受到很有可能通过线性回归LinearRegression中的多项式拟合来得到一个不错的结果。其模型的数学表达式如下。注意用多项式拟合散点只是线性回归的很小的一局部但是它的直观意义比拟明显。考虑到问题比拟简单我们才选用了多项式拟合。线性回归的详细讨论超出了本书的范围这里不再赘述。其中f(x|p;n)就是我们的模型p、n都是模型的参数其中p是多项式f的各个系数n是多项式的次数。L(p;n)那么是模型的损失函数这里我们采用了常见的平方损失函数也就是所谓的欧氏间隔或者讲向量的二范数。x、y那么分别是输入向量以及目的向量在我们这个样例中x、y这两个向量都是47维的向量分别由
28、47个不同的房子面积、房子价格所构成。在确定好模型后就可以开场编写代码来进展训练了。对于大多数机器学习算法所谓的训练正是最小化某个损失函数的经过这个多项式拟合的模型也不例外我们的目的就是让上面定义的L(p;n)最小。在数理统计领域里有专门的理论研究这种回归问题其中比拟有名的正规方程更是直接给出了一个简单的解的通式。不过由于有Numpy的存在这个训练经过甚至变得还要更加简单一些。22#在(-2,4)这个区间上取100个点作为画图的根底23x0np.linspace(-2,4,100)24#利用Numpy的函数定义训练并返回多项式回归模型的函数25#deg参数代表着模型参数中的n亦即模型中多项式的
29、次数26#返回的模型可以根据输入的x默认是x0返回相对应的预测的y27defget_model(deg):28returnlambdainput_xx0:np.polyval(np.polyfit(x,y,deg),input_x)这里需要解释Numpy里面带的两个函数polyfit以及polyval的用法。polyfit(x,y,deg)该函数会返回使得上述注该公式中的x以及y就是输入的x以及y最小的参数p亦即多项式的各项系数。换句话讲该函数就是模型的训练函数。polyval(p,x)根据多项式的各项系数p以及多项式中x的值返回多项式的值y。评估与可视化结果模型做好后我们就要尝试判断各种参数
30、下模型的好坏了。为简洁起见我们采用n1,4,10这三组参数进展评估。由于我们训练的目的是最小化损失函数所以用损失函数来衡量模型的好坏似乎是一个合理的做法。29#根据参数n、输入的x、y返回相对应的损失30defget_cost(deg,input_x,input_y):31return0.5*(get_model(deg)(input_x)-input_y)*2).sum()32#定义测试参数集并根据它进展各种实验33test_set(1,4,10)34fordintest_set:35#输出相应的损失36print(get_cost(d,x,y)所得的结果是当n1,4,10时损失的头两位数字
31、分别为96、94以及75。这么看来似乎是n10优于n4而n1最差但从图3可以看出似乎直接选择n1作为模型的参数才是最好的选择。这里矛盾的来源正是前文所提到过的过拟合情况。图3线性回归的可视化那么怎么最直观地解析是否出现过拟合了呢当然还是画图了。37#画出相应的图像38plt.scatter(x,y,cg,s20)39fordintest_set:40plt.plot(x0,get_model(d)(),labeldegree.format(d)41#将横轴、纵轴的范围分别限制在(-2,4)、(105,8105)42plt.xlim(-2,4)43plt.ylim(1e5,8e5)44#调用le
32、gend方法使曲线对应的label正确显示45plt.legend()46plt.show()上面这段代码的运行结果如图3所示。其中三条线分别代表n1、n4、n10的情况图1.10的右上角亦有讲明。可以看出从n4开场模型就已经开场出现过拟合现象了到n10时模型已经变得非常不合理。至此可以讲这个问题就已经根本上解决了。在这个样例里面除了穿插验证我们涵盖了机器学习中的大局部主要步骤之所以没有进展穿插验证是因为数据太少了。代码局部加起来总共4050行应该算是一个比拟适宜的长度。祈望大众可以通过这个样例对机器学习有个大概的解析也祈望它能引起大众对机器学习的兴趣。与传统的计算机程序不同机器学习是面向数据的算法可以从数据中获得信息。它符合新时代脑力劳动代替体力劳动的趋势是富有生命力的领域。Python是一门优异的语言代码明晰可读、功能广泛强大。其最大弱点速度问题可以以通过很多不太困难的方法弥补。Anaconda是Python的一个很好的集成环境它能让我们免于人工地安装大量科学计算所需要的第三方库。虽讲机器学习算法很多但通常而言进展机器学习的经过会包含以下三步获取与处理数据选择与训练模型评估与可视化结果。?Python与机器学习实战?订购链接CSDNAI热衷共享欢送扫码关注