《机器学习 .pptx》由会员分享,可在线阅读,更多相关《机器学习 .pptx(376页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第1章 环境配置与学前知识 本章将带领大家一起配置机器学习的开发环境。环境的配置包含了Python的安装,IDE的选择以及相关依赖包的安装。 其次我们会对机器学习的相关术语进行一些介绍,比如什么是机器学习,深度学习和人工智能,它们的关系是什么。1.1 环境的安装 本书的写作过程中使用的python版本是3.x。大家可以登陆python的官方网站(https:/www.python.org/)进行下载。 而代码的运行我则全部放在了Spyder里面。Spyder的安装可以参考https:/pythonhosted.org/spyder/网站。图1.1 spyder界面 另外在本书中还用到了第三方的
2、工具包,比如numpy和pandas等,这些都可以通过pip命令进行安装。 假如我们需要安装pandas包,我们只需在命令行窗口中输入pip install pandas即可。 但我并建议大家按照上述的方法一步一步进行配置,因为有更好的方法,那就是Anaconda。Anaconda是一个python的库的集合,它包含了几乎所有我们进行科学计算所需要的库,并提供了spyder这样的工具。事实上本书就是在Anaconda的基础上来完成的。 Anaconda的网址是https:/ 机器学习相关概念 在我们正式进入学习之前,首先对机器学习的相关概念做一个梳理,这些概念将贯穿之后所有的学习过程之中。 根
3、据是否有明确的学习目标(因变量Y)我们将机器学习分为有监督学习(supervised learning)和无监督学习。有监督学习常被称为分类,而无监督学习常被称为聚类。1.2.1 机器学习中的数据在机器学习中,处理的数据格式和excel表格或者结构化数据表格相同,只是对细节的叫法有所差异。假设我们有以下的表格,首先如果在excel中,我们会简单的使用行和列来对应相应的数据。而在结构化数据库中我们将行称为一条记录,将列称为一个字段,如表1.1所示。 在此表中,我们看到一共有三行四列数据。在机器学习中,我们将行,称为一个样本(sample)或者实例(instance)。我们将列称为特征(featu
4、re)或者属性()。如何理解特征或者属性呢?特征和属性其实就是每个样本的特点,比如在表1.1中,每个样本都会性别,体重,升高三个特征。如果再给出一组数据,只有身高和体重,那么我们就可以根据身高和体重,来判断这个同学是男生还是女生。 在本书中我们统一将行称为样本,将列称为特征。 然而在我们实际的工作中,数据并补总像表1.1中那么的工整,这需要我们对原始的数据进行一系列的清洗和转换。这个清洗和转换的过程我们称之为数据的预处理。 数据的预处理包含了以下几个步骤。 (1)数据清洗 在我们所得到的数据,有时会很脏,比如有缺失值,有异常值,如表1.2所示。 我们看到学号100001学号的同学,体重是空值。
5、学号100003同学的身高异常的高。当我们遇到这样的样本的时候,最简单的方法就是将这些样本点去掉,但是这样会浪费了该样本点其他已有的信息,特别是在只有少量的样本的情况下。 除了删除异常样本点之外,我们还可以进行插值的操作,就是将空值和异常值插补为一个比较合适的指。比如我们可以用该特征的均值进行插值。 (2)特征提取 假设我们有表1.3的数据。我们想通过每个人的喜好,体重,身高来预测性别。这里我们不会将“篮球”,“乒乓球”,“足球”直接输入给模型,而是要将他们转换成数字。 在文本处理过程中,我们也会将文本处理成这样的结构化数据表。将每个词作为一个特征。在图像处理中,我们会将一个像素作为一个特征来
6、处理。具体方法可以参考本书的相关章节。1.2.2 训练集和测试集 那我们拿到数据之后我们并不是将所有的数据都用来进行模型训练,因为这样训练出来的模型,我们并不知道他的优劣。如果等到投入生产中,才知道为时已晚。所以我们要将数据分为训练集和测试集。 训练集顾名思义就是训练模型用的数据,一般我们在整体数据中随机采样获得训练集。而测试集则是整体数据中出去训练集的部分。 测试集和训练集的大小并没有固定的说法,9:1,8:2,这样的分法都是可以的。甚至我们可以只用一个样本作为测试集。 具体的操作方法可以参考本书的相关章节。1.2.3 欠拟合与过度拟合 欠拟合是指所训练的模型在训练集中表现的就很差,既准确度
7、很低。 过度拟合则是指在模型在训练集上表现的非常优秀,可以有效的区分每一个样本。但是在测试集上则表现的十分糟糕。 所以我们在训练模型的时候,不能一味的追求训练集上的好的模型指标,要在测试集上不断的调试。1.2.4 人工智能、机器学习、深度学习 人工智能(artificial intelligence,AI)、机器学习(machine learn)和深度学习(deep learn)是最近火热的词语。但是很多同学并不清楚他们之间的关系,我们可以简单的认为人工智能包含了机器学习,而机器学习又包含了深度学习。 人工智能更偏向于应用方面,比如语音识别,图像识别,聊天机器人等。而机器学习则更偏向于理论,比
8、如图像识别技术用到的是CNN(卷积神经网络)的机器学习算法,在本书中也会用到机器学子中的最近邻算法来做简单的字体识别。深度学习则是机器学习的一个分支。所谓的深度学习就是有多个隐藏层的神经网络算法。 深度学习咋一听是十分高深的学问,在学习本书之后,你就会知道它其实就是简单算法的堆叠,由此可见起一个好的名字是十分有必要的。第2章 Python基础知识 本章将介绍Python的基础知识,其中包含了变量,操作符,字符串,列表,集合,字典,循环语句,判断语句,方法和对象。 因为本书编写的目的并不是介绍python语言本身,而是把python当作一个工具,所以相关的内容只是简单的列举和说明。如果读者对这些
9、内容十分感兴趣,市面上有很多介绍如何使用python的书籍,可以参阅。2.1 hello world! 在控制台输入hello world!然后打印。这种输出又称为标准输出,当然我们还可以将结果保存至硬盘。 In 1: print(hello world!) hello world!2.2 变量 其中变量是为了存储数值,这就像是代数一样,比如我们有方程,我们将带入方程就可求得。同样的我们还可以令。 在下面的代码中,我们分别将1赋值给了a,b。我们就可以直接打印它们,并且用他们做基本的运算。 字符串不仅能存储数值,还能存储字符串,这个在下面的章节会详细讲解。2.3 操作符 操作符我们可以理解为数
10、学中的运算符号,它包含了我们常用的加减乘除的基本方法,另外还有取余数,取整数的方法。此外还有进行逻辑运算的方法,比如逻辑或,逻辑与和逻辑非。当然在进行逻辑运算前,我们首先要判断一个命题的真假,所以Python也提供了一些判断真假的操作符。2.3.1 基本运算符基本运算符包含了我们常用到的加减乘除等几个常用的方法。1. + 加法加法直接使用加号“+”连接两个数字。2.- 减法减法使用减号“-”连接两个数字。3.* 乘法乘法使用星号“*”连接两个数字。4./ 除法除法使用“/”号连接两个数字。5./ 除法,取整数部分“/”双斜杠表示除法取整的运算,它会直接舍弃余数部分。6.% 除法,取余数部分“%
11、”则和“/”运算相对,它是取余数,舍弃整数部分。7.* 指数运算(乘方与开方)“*”双星号表示指数运算,我们很容易联想到双“*”号是单“*”乘法的加强版,这样就好记忆了。2.3.2 比较运算符比较运算符的特点是返回的都是布尔类型的数据(真或假),它主要分为三类:判断是否、判断大小、判断包含。这里是和我们在高中所学习基础知识是相统一的。1.is是判断是否相同。如果相同则返回True,如果不相同则返回False。2.is not不是判断是否不同。如果不同则返回True,如果相同则返回True。3. 小于判断是否小于。如果小于则返回True,如果大于或等于则返回False。4. 大于判断是否大于。如
12、果大于则返回True,如果小于等于则返回False。6.= 大于等于判断是否大于等于,如果大于等于则返回True,如果小于则返回False。7.!= 不等于判断是否不等于。如果不等于则返回True,如果等于的返回False。8.= 等于判断是否等于。如果等于则返回True,如果不等于则返回False。一般在判断两个数值是否相同的时候我们使用“=”来判断,“is”主要判断是否是相同的,可以判断是字符串是否相同,对象地址是否相同。9.in在里面判断是否包含。如果包含则返回True,如果不包含则返回False。10.not in不在里面判断是否包含。如果不包含则返回True,如果包含则返回False
13、。2.3.3 逻辑运算符 逻辑运算符可以理解为是对布尔值的运算。我们在中学时就已经学习过的与、或、非是相通的。 1.not逻辑非 非真返回False,非假返回Ture。 2.or逻辑或 有一个为真则返回真,两个同时为假则返回假。 3.and逻辑与 两个同时为真返回真,一真一假则返回假,两个同时为假返回假。2.4 字符串 字符串是所有编程语言中处理最多的一个对象。如果操作符主要对应了现实中数学问题,那么我们就可以把字符串的操作当成现实中的语文问题来对待。不过和现实世界中的语文不一样的地方是在现实世界中我们可以很容易的换行,而不需要任何标注。但是在编程的世界中我们则需要特殊的字符来标注“这里需要换
14、行“。这样的标注字符在编程的世界里,我们称之为转义字符。转义字符除了能标明换行外,还有很多其他的作用。2.4.1 基础 字符串可以用双引号,单引号和三引号表示。其中双引号和单引号效果一样,三引号可以多行。 单引号,双引号和三引号可以复用。2.4.2 转义字符 使用反斜杠对特殊字符进行转义。 所谓的转义字符就是指那些我们不可以直接写出的符号。比如换行,在真实书写的时候,我们可以直接换行。但是在电脑中,电脑读取的始终是一连串的编码,所以需要用特殊的字符来告诉电脑那些地方需要换行。 由于所有的字符都已经有了它自己的含义所以,我们又没有必要新造出字符来特别的表示这些特殊的符号。所以我们使用“”来表示特
15、殊的符号。比如“n”就表示了换行。 如果不想转义可以在字符串前面使用r,表示原始字符串。原始字符串的含义就是不识别转义字符。 n表示换行,还有一些其他的特殊转义字符,如表2.1所示。2.4.3 索引和切片 可以通过索引获得字符串单个字符的值,也可通过切片获得子字符串的值。 1.索引 字符串索引从0开始,至长度-1为止,长度可以通过内置函数len()来获得,可以通过负数索引。 2.切片 在使用切片的时候需要注意的是,切片的右边是取不到的。2.4.4 字符串方法 字符串大概是是所有编程语言处理的最多的对象。因为编程语言之间的交互很多都需要通过字符串。 1.大小写转换 2.补全 3.索引 4.替换
16、5.分割字符串 6.其他2.5 列表列表可以存放多个元素,其实字符串就是一个特殊的列表既存放字符的列表。所以列表也可以像字符串一样索引。最常用的列表的生成方法有两种,一种是使用list()方法,另外一种是直接使用中括号。笔者在编程过程中,最喜欢使用第二种方法。知道了如何创建列表,接下来就要学会如何使用列表。列表的处理在编程过程中是十分重要的。(1)尾部添加元素(2)添加另一个列表(3)删除第一个符合要求的值(4)删除最后一个元素并返回(5)清空列表(6)索引(7)计数(8)排序(9)反转(10)复制 元组可以看成列表的特殊形式,它和列表的差别主要是他不能改变,比如不能使用append,inse
17、rt等方法。其他则和列表一样。元组的创建有两种方法,如下: a=tuple() a=()2.6 集合 集合的元素不会重复并且没有顺序,所以不能索引。集合主要的作用是去重,以及进行求交集,并集,差集。 创建集合的方法只有一种,就是使用set()方法。 在python中集合的使用,虽然不如列表和元组那么常见,但是在处理集合关系时确是十分的方便。2.7 字典 字典是键:值对的集合。键是唯一的,且不能索引。创建字典的方法有两种,一种是使用dict()方法,另外一种是使用大括号。笔者也特别喜欢第二种方法来创建字典。 字典在编程中的使用频次和列表是一样的高。特别是在与其他的语言交互过程中,比如在网络通讯中
18、我们经常使用到json格式的数据,json的数据结合和字典就是一样的。 1.查看所有键 2.查看所有值 3.查看所有键值,列表嵌套元组的形式返回 4.查看字典某个元素 5.删除字典所有元素 6.删除指定元素 7.弹出指定键 8.弹出任意键值 9.拷贝字典 10.更新值2.8 循环语句 循环语句的作用是让某个代码块循环执行,包括以下几种:for语句、while语句、break语句、continue。2.8.1 for语句 For语言可以理解为遍历,下面的这两行代码的意思是遍历1,2,3中的每一个元素,然后打印它。2.8.2 while语句 While语句可以理解为“当条件成立,则一直执行”。下面
19、的代码演示了while的作用,当x大于3的时候就一直执行。2.8.3 break语句 break的作用是跳出循环,以后的循环也将不再执行。接下来的代码在第一次循环执行到print(x)时,跳出循环,print(x*x)不再执行,以后的循环也不再执行。2.8.4 continue continue的作用是跳出本次循环,以后的循环将继续执行。接下来的代码在第一次虚幻执行到print(x)时,跳出本次循环,print(x*x)不再执行,继续执行下一次循环。2.9 判断语句 判断语句是控制程序的执行流程的,比如我们想让某一行在某个条件下执行,就可以用if语句: 21为真,所以执行了print(21)。
20、 12为假,所以没有执行了print(12),也可以使用多重判断语句elif:2.10 函数 函数的出现是为了将常用的代码块打包,从而减少了代码的编写。 有些时候,某些代码块要反复使用这个时候我们可以把它封装成函数。 通过函数我们可以把他们整合到一起。这时我们只需要调用一次该函数就行。 另外还可以往函数里面赋值。 函数还可以有返回值。 要注意的是,函数里面的变量只属于函数,不和函数外面的同名变量冲突。 我们主要介绍python常用的内置函数2.11 面向对象编程 面向对象是现在比较常见的编程思想,大家可以把对象简单理解为变量和函数的组合。在对象里,变量又称为属性,函数又称为方法。第3章 Num
21、py Numpy是一个Python生态环境中重要的科学计算工具,接来下所学到的pandas,matplotlib以及scikit都能见到他的身影。通过Numpy我们可以生成模拟数据,比如随机生生一个数,随机生成一个服从正太分布的随机数。另外Numpy中还提供了一些数学的计算方法,相较于Python自带的Math模块,它更高效。此外还提供了统计学和线性代数常用的函数。3.1 创建数组 在进行数学运算之前我们首先要创建数组,数组就是数的集合,他们按照一定的规则排序,我们比较常见的就是二维数组,二维数组包含了行和列。 numpy中创建数组的方式主要有两种: 1)创建元素为0或1的数组。 2)将已有的
22、数据转换为数组,比如将列表转换为数组。3.1.1 创建元素为0或1的数组 Numpy提供了一些方法让我们创建元素全为1和0,或者任意指定的数的数组。其中empty方法生成的元素是随机数。3.1.2 将列表转换为数组 有些时候,我们得到的数据并不是Numpy中的数组的形式,此时我们可以通过Numpy中的array方法将其他形式的数据转换为Numpy中的数组的形式,比如我们可以将python中内置的list列表结构转换为数组。3.1.3 生成一串数字 在有些情况下,我们需要生成一些连续的数字,numpy也提供了相应的方法。注意这里我们称“生成一串数字”,而不是“生成一维数组”,因为生成的结果并没有
23、维度的信息。3.1.4 生成特殊数组 我们还可以生成一些特殊的数组,比如根据对角线元素生成数组,或者提取数组的对角线元素等。3.2 数组索引 数组的索引主要是用来获得数组中的数据。在numpy中数组的索引可以分为两大类:一是一维数组的索引,二是二维数组的索引。其中一维数组的索引和列表的索引几乎是相同的,二维数组的索引则会有很大的不同。 一维数组的索引和python中list结构索引十分相似,还是需要注意在切片索引的时候末尾的小标是取不到的。 二维数组的索引格式是在中括号中,逗号前是选择行,逗号后是选择列。而在选择行和列的时候可以传入列表,或者使用冒号来进行切片索引。3.3 排序与查询在进行数组
24、操作的时候我们可能需要对数组进行排序和查询。排序中我们需要注意的是按行排序,还是按列排序,或者是整体排序。这里需要特别注意的是sort方法中axis参数指的是排序的方向,0指按行进行操作,1指按列进行操作。在查询数组的过程中,我们最常用到的是where方法,该方法返回的是符合条件的值的坐标。另外我们还可以通过argmax等方法获得数组中最大值和最小值的坐标,注意axis参数的设定。3.4 随机数生成器在做某些实验,或者验证某些算法的时候,我们需要模拟一些数据,而numpy中就提供了这样的方法。常用随机数生成可以生成单个数或者任意维度的数组。而且我们还可以使用choice方法随机抽取数值,或者使
25、用permutation方法对数组进行重新排序。分布随机数生成主要是根据一些特殊的分布,比如正态分布,几何分布等生成随机分布数组。3.5 数学函数Numpy提供了我们常用的数学计算函数,通过这些函数我们可以进行三角函数的运算,指数对数的运算,以及其他基本的数学运算。3.5.1 三角函数 这里列举了常用的正弦,余弦和正切函数,以及角度和弧度的转换函数。Numpy中的这些函数都可以传入列表类型的参数,会自动对列表中的各个元素进行计算,而不需要写循环。3.5.2 指数与对数 这一小节主要列举了Numpy中提供的指数与对数运算函数。需要注意的是在计算指数的时候只提供了以自然常数和2为底的方法,而在对数
26、中只提供了自然常数,2和10为底的方法。3.5.3 约数 这一小节介绍Numpy求约数的方法。约数可以分为四舍五入,向0取整,向上取整和向下取整。3.5.4 数组自身加乘 这一小节介绍数组的自身的加乘。自身的加乘是指对数组的内部的元素进行求和和求乘积。比如计算所有行的和,或者计算所有列的和。方向仍然是由axis参数来设定的。3.5.5 算术运算 这一小节介绍numpy中提供的算术运算符方法。需要注意的是这些方法都是可以对数组进行操作的,操作时会对数组内的每个元素进行计算。3.6 统计函数 Numpy中提供了常用的数学统计函数。通过这些统计函数我们可以很容的求得最大值,最小值,分位数,均值方差等
27、。另外我们还可以计算两个向量的相关性。 基本统计函数主要是求最大值,最小值,分位数。基本统计函数返回的是对该数组整体的描述。 Numpy中提供了求均值与方差的函数。均值和方差反映了数组的波动程度,这两个指标是非常重要的。 Numpy中提供了计算密度的相关函数。数据的密度可以帮助我们很好的理解数组的大致的分布。简单的理解就是看哪些数值出现的次数比较多,大多数的数值集中分布在哪个区间。 Numpy中提供了计算序列相关性的相关函数。相关性可以帮助我们理解两个数组是否具有一定的一致性。3.7 线性代数 本小节中介绍线性代数中常用的计算函数。线性代数在机器学习中由重要的应用。比如在PCA降维中,我们可以
28、使用特征值和特征向量找到降维的空间。另外线性代数也增强了计算的性能,可以提高我们的计算速度。第4章 Pandas Pandas工具包是在Numpy工具包上的进一步封装,它提供了更丰富的数据处理方法。相较于Numpy,Pandas更适合做数据的预处理。而Numpy则更适合做数据的运算。所以拿到数据后一般都使用Pandas做处理,而实现算法模型则使用Numpy。4.1 序列对象Series Series对象类似于numpy中的一维数组。接下来的章节里主要介绍了在数理统计中的应用,其实series更强大的功能是对字符串以及时间序列的处理,而这些因为和本书的写作目标不符,故没有详细讲解,有兴趣的读者可
29、以参考官方文档学习。4.1.1 创建Series对象 Pandas中最基础的对象是Series,可以通过list以及可迭代对象range创建,也可以通过numpy中的array对象创建。4.1.2 Series索引 Series的索引方法有以下三种。 第一种,与list和numpy中的一维数组的方法不相同,形式相同。但需要注意的是此时的值不是numpy中对应概念的下标,而是pandas中的索引值,所以不能出现负数。 第二种方法,与list和numpy中的一维数组的方法不相同,形式也不同,要使用.loc,同样也不能出现负数。 第三种方法,与list和numpy中的一维数组的方法相同,形式不同,要
30、使用.iloc,可以出现负数。4.1.3 查看Series相关属性查看series的相关属性,可以查看或更改该序列元素的类型以及索引。In 1: import pandas as pdIn 2: a=pd.Series(0,1,2,3,4,5).index属性可以查看series对象的索引,同样也可以直接赋值更改。我们使用.loc和.iloc对索引修改前后做同样的处理,体会一下loc和iloc的区别,代码如下:In 3: a.indexOut3: RangeIndex(start=0, stop=6, step=1)In 4: a.loc1Out4: 1In 5: a.iloc1Out5: 1
31、4.1.4 二元运算 series的二元运算和numpy中一元数组的运算相似。4.1.5 统计方法 series中提供了常用的统计方法。除了Numpy中已有的方法外,还增加了一些比较边界的方法,比如describe方法可以一次性返回多个统计值。4.1.6 缺失值处理 在我们遇到的一些数据中会有缺失值的情况,我们会将这些缺失值删除或者插入其他值替代。series对象提供了相应的方法。4.1.7 排序 series提供了若干排序的方法。argsort方法是给出了排序的索引,rank方法直接给出了顺序,而sort_values和sort_index则分别是按值和索引排序。4.1.8 计数与重复 在进
32、行数据处理过程中,我们常常需要对数据中的数字进行计数,查看哪些数字出现的频次比较高。获得对于重复数据进行删减。4.1.9 其他 series还包含了其他一些方法。比如查看部分数据的head和tail,取样方法sample,条件筛选where和mask,以及判断是否在另一个序列中的isin方法。4.2 DataFrame Pangdas中的数据框对象DataFrame可以看作是Series对象的集合,他们共用同一个索引。所以DataFrame具有Series的相应方法,这里不再赘述,可参考4.1小节的内容。本小节主要根据具体的操作对DataFrame对象进行讲解。4.2.1 创建数据框 一般有两
33、种方式创建数据框,一是通过字典,而是通过列表。二者皆可获得相同的结果。4.2.2 行操作 Pandas的数据框可以看成是Numpy中的二维数组。行操作可以利弊Numpy的二维数组的方法,特别要注意的是loc和iloc的区别。4.2.3 列操作 特别要注意的是在列的交换列的方法要使用.values来获取数值,否则会失败。4.3 GroupBy 分组统计是一个比较常见的操作,我们需要对不同类别的数据分别进行观察。比如在一个班级中,我们想要获得男生的最大年龄和女生最大的年龄,这个时候我们就需要先按性别进行分组,然后分别统计最大的年龄。4.3.1 基本函数 基本函数可以用来查看分组的具体信息。4.3.
34、2 统计函数 分组的最主要的作用就是对各个组别进行分组描述。这里返回的是对各个组别的统计的结果。第5章 Matplotlib Matplotlib库是科学计算中比较出名的可视化展示库,它与Numpy,Pandas被称为Python科学计算的三剑客。 由于Matplotlib库的过于复杂,本章节我们将从应用角度对其进行讲解。5.1 作图类命令 作图类命令是matplotlib库的核心,它直接决定了数据是如何展示的。5.1.1 线图 折线图是最基础的图形,在matplotlib中使用plot来绘制。 结果如图5.1所示。 在plot方法中,我们可以通过传入颜色参数c,线条宽度参数lw,线条样式参数
35、ls来控制最终的呈现样式。这三个参数是我们经常使用到的。5.1.2 柱状图和条形图 条形图经常用来展示离散的数据。 结果如图5.3所示。 在bar方法中,我们还可以传入width参数控制整体宽度,linewidth控制边缘宽度,color控制填充颜色,edgecolor控制边缘颜色。结果如图5.4所示。图5.3 柱状图图5.4 更改样式后的柱状图 条形图和柱状图属于同一类型,不过是一个是垂直方向的,一个是水平方向的,在Matplotlib中使用barh来绘制条形图。 结果如图5.5所示。图5.5 条形图5.1.3 散点图 散点图常用来观察实例。Matplotlib中使用scatter来绘制散点
36、图。结果如图5.6所示。 在scatter方法中可以传入参数s来控制点的大小,参数marker来控制点的样式,参数linewidths控制边界宽度,edgecolors控制边界的颜色。结果如图5.7所示。图5.6 散点图图5.7 更改参数的散点图5.1.4 饼图 饼图主要用来展示整体和部分之间的关系。在matplotlib中主要使用pie()方法来绘制饼图。结果如图5.8所示。 我们还可以通过参数explode设置中心偏离,参数labels设置饼图的标签,autopct设置百分比显示。结果如图5.9所示。图5.8 饼图图5.9 更改参数后的饼图5.1.5 面积图 面积图是直线图的一种拓展,在M
37、atplotlib中可以使用fill_between和fill_betweenx来做面积图。 首先我们使用fill_between来绘制垂直方向上的面积图。结果如图5.10所示。 接着我们使用fill_betweenx绘制水平方向上的面积图。结果如图5.11所示。图5.10 垂直方向面积图图5.11 水平方向面积图5.2 坐标轴控制 这一小节介绍关于x轴与y轴的控制方法,比如控制他们的长度,显示方式等。5.2.1 axis 我们可以通过axis方法来控制坐标轴是否显示。首先我们先画一张对比图。 结果如图5.12所示。 使用axis方法关闭坐标轴显示。 结果如图5.13所示。图5.12 对比图图
38、5.13 关闭坐标轴显示5.2.2 xlim与ylim 在matplotlib中可以通过设置xlim与ylim来设置坐标轴的长度。 结果如图5.14所示。图5.14 限制x轴和y轴的长度5.2.3 xticks与yticks 设置x轴与y轴刻度的显示。 结果如图5.15所示。图5.15 设置刻度显示5.2.4 xlabel与ylabel 设置x轴与y轴的名称。 结果如图5.16所示。图5.16 x轴与y轴的名称设置5.3 其他设置 在之前的作图过程中,其实我们省略了创建绘图框的步骤,我们可以通过figure方法对绘图框进行调整。 结果如图15.17所示。 通过title方法来设置图片的名称。
39、结果如图5.18所示。图15.17 设置绘图框的大小图5.18 给图片添加标题第6章 scikit-learn scikit-learn库是一个通用型开源机器学习库,它几乎涵盖了所有的机器学习算法,并且搭建了高效的数据挖掘的框架。我们可以通过http:/scikit-learn.org/stable/来访问他,如图6.1所示。图6.1 scikit-learn官网我们可以看到官网的宣传中主要提到到了四点:一个简单高效的数据挖掘和数据分析工具。对于所有人都是易用的,而且可以在各个环境中使用。它是基于Numpy,Scipy和Matplotlib库。开源的,可以商用。这个库另一个最大的优点是库的设计
40、是十分有条理的。我们可以看到scikit-learn主要分为六个板块,他们分别是:分类(classification)回归(regression)聚类(clustering)降维(dimensionality reduction)模型选择(model selection)预处理(preprocessing) 其中分类和回归问题又被称为有监督学习,而聚类问题被称为无监督学习。而我们在实际进行机器学习过程的先后次序是1)预处理,2)降维,3)有监督和无监督学习,4)模型选择,如图6.2所示。图6.2 机器学习流程6.1 预处理(preprocessing) 对数据进行一些清洗,转换,使得他们更适合
41、机器学习模型。scikit提供了一些预处理的方法,他们分别是标准化,非线性转换,归一化,二值化,分类特征编码,缺失值插补,生成多项式特征,如图6.3所示。图6.3 预处理相关分类6.1.1 标准化 为什么要对数据进行标准化处理?如表6.1所示,我们可以看到收入这一列数字特别大,而年龄这一列数字相比之下就特别小。因此,在某些机器学习过程中,收入特征就会表现的比较“抢眼”,而影响最终的模型效果。所以我们要将其单位去除,让大家在同一起跑线上。 我们需要去除这种影响,将该表转换成另一种形式,如表6.2所示。 在scikit中提供了scale方法来对数据进行标准化。 (1)导入相关模块。 (2)导入相关
42、数据,这里我们将上述表格导入。 (3)将数据标准化。 (4)查看标准化结果。 (5)查看标准化后的均值。 (6)查看标准化后的标准差。6.1.2 非线性转换 类似于标准化处理,它是将数据映射到0,1的均匀分布上。非线性转换将每个特征转换为相同的范围内或者分布内。通过这个变化可以将异常的数据变得更平滑从而受异常值的影响也会变小,但是它却一定程度上改变了特征内部和特征之间的距离和相关性。 (1)导入相关模块。 (2)创建非线性转换对象。 (3)导入相关数据。 (4)进行线性转换。 (5)查看线性转换的结果,所有的数值都被转换0,1区间内的数字。6.1.3 归一化 归一化的作用是缩放单个样本,使其具
43、有单位范数。有两种归一化的方式,分别是范数“L1”和范数“L2”。 (1)导入相关模块。 (2)导入相关数据。 (3)归一化数据。 (4)查看归一化之后的结果,这里要注意,归一化的是针对每一行做的。6.1.4 二值化 二值化的作用是将数值型的特征值转换为布尔值。 (1)导入相关模块。 (2)导入相关数据。 (3)查看最后的编码结果,我们可以看到所有大于100的数字都被编码为1,所有小于100的数字都被编码为0。 (4)查看相关结果。6.1.5 分类特征编码 在机器学习过程中,我们经常会遇到字符串形式的特征。这个时候我们就需要将这些字符串类型的特征,转换为数值型的特征。比如说“老师”,“学生”,
44、“主任”,我们需要将这些字符串转换为整数。比如讲“老师”转换为0,将“学生”转换为1,将“主任”转换为2。 这样的转换会提高机器学习的效率,但是这样的转换还是不够的,因为这样连续数值的输入,分类器会认为类别之间是有序的,但实际上“老师”,“学生”,“主任”他们时间是无序的,而且没有大小的区别。这个时候我们就需要将这些数值进一步转换。 我们的解决思路就是将某个特征n个可能,转换为n个特征,转换后的特征是0,1二值类型数据。 (1)导入相关模块。 (2)创建One-Hot编码对象。 (3)导入相关数据。 (4)训练One-Hot编码对象。 (5)查看编码后的结果。我们可以看到第一列有四种情况,所以
45、第一列会被分为4个列。也就是说原来的。 0表示为1,0,0,0, 1表示为0,1,0,0, 2表示为0,0,1,0, 3表示为0,0,0,1。 同样的道理,第二列也被分为四个列, 4表示为1,0,0,0, 5表示为0,1,0,0, 6表示为0,0,1,0, 7表示为0,0,0,1。6.1.6 缺失值插补 我们所获得的数据不一定是完整的数据,里面可能存在着缺失的情况。这时候就需要对这些缺失的数据做一些处理,以补全它们。 (1)导入相关模块。 (2)创建插值对象。 (3)导入相关数据。 (4)训练插值模块。 (5)进行转换。在axis=0的情况下,第一列有两个非空值,他们的均值是1.5,所以空值全
46、部都用1.5填充。6.1.7 生成多项式特征 在机器学习中,有些时候数据集的特征很少,这个时候就需要我们自己根据以后的特征构造一些新的特征出来。 (1)导入相关模块。 (2)创建多项式特征对象。 (3)导入相关数据。 (4)训练多项式特征对象。 (5)将原数据转换为多项式,X的特征已经从转换为。6.2 降维 在机器学习过程中,我们可能会碰到一些维度非常多的数据,当使用这些复杂维度做学习时可能会产生两个问题: 维度多会造成过度拟合。 维度多会增加机器学习算法的复杂度,从而降低机器学习的效率。 scikit-learn库中提供了三种降低维度的方法,他们分别是PCA,随机投影和特征凝聚,如图6.4所
47、示。 在本书的第16章PCA降维我们会详细讲解其方法和思想。图6.4 scikit-learn提供的降维方法6.3 有监督学习、无监督学习 有监督学习是指在训练模型的过程中,已知正确结果。scikit-learn中提供了多种有监督学习的方法,如图6.5所示。本书的第8章至第15章都属于有监督学习的范畴。 无监督学习是指在训练模型过程中,不给出目标变量,让算法自动找寻训练集中的规律,如图6.6所示。本书的第18章聚类具体会阐述无监督学习思想和方法。6.4 模型评估 当我们对一个数据集选定模型,并进行训练之后,我们需要对这个模型进行评估,以判定这个模型的优劣。不好的模型通常有以下两种情况: 欠拟合
48、。欠拟合是指模型不能很好的适应和拟合已有的数据。欠拟合的模型在训练集和测试集上表现得都会很差。 过度拟合。过度拟合是指模型非常完美的适应和拟合已有的数据,这将导致该模型的泛化能力严重下降。过度拟合在训练集上表现几乎完美,而在测试集上则表现的很差。 所以,最优的模型应该是欠拟合和过度拟合的折中,它既较好的拟合了训练集又具有很好的泛化能力,这种泛化能力主要体现就是在测试集上也会有很好的表现。6.4.1 测试集评分在scikit-learn包中,提供了测试集评分的方法。让我们看一个简单的例子:(1)导入相关模块。(2)导入相关数据,这里导入鸢尾花数据集。(3)查看数据集属性数据形状。(4)查看数据集
49、目标变量数据形状。(5)将数据集分割为训练集和测试集,分割比例是4:1。(6)查看训练集数据。(7)查看训练集数据。(8)查看学习集数据。(9)查看学习集数据。(10)创建knn分类器对象。(11)训练模型。(12)对测试结果进行评分。 看来这个模型的得分不错。我们可以调整模型不同的参数对其最后的得分进行比较,然后选择得分较多的参数模型作为最终的结果。 但是,在不同的实验过程中,我们的测试集可能在某次实验上,同训练集同时出现了过度拟合的情况,从而导致了在真实的应用过程中,泛化能力降低的结果。我们现在对数据集的划分,如图6.7所示。 为了避免这个种情况的发生,我们需要再设置一个“验证集”,当模型
50、训练完成以后,现在验证集上对模型进行评估,然后选择评估分数最高的模型,再在测试集上进行最终的测试,如图6.8所示。图6.7 将数据分割为训练集和测试集,可能同时出现过度拟合图6.8 将数据分割为训练集,验证集和测试集 这是比较标准的模型评估过程,但是这并不是最优的办法。虽然“验证集”的选择,有效的避免的测试集出现过度拟合的情况,但是现在我们已经将元数据分为了三个部分:“训练集”、“验证集”和“测试集”。我们大大减少了“训练集”的数据量,这可能造成训练的模型效果很差。另外一方面,由于验证集和测试集,仍然是一次选择的结果,所以最后的模型评估结果有很大的随机性。 交叉验证(Cross-validat