00:00
好,那么接下来我们还是在我们的猪皮notebook里边可以去新建一个Python程序,对吧?好,那么我这里还是先给一个标题,我这个叫做K近零算法,呃,教程吧,好,然后呃,首先第一步大家会想到一样的啊,我们还是要先引入依赖对不对?这里边我们会用到哪些依赖呢?首先我们要做数值计算,大家会想到呃,该有这个number派肯定还是要有,对吧?然后大家会想到我们这里边可能就会因为K径零嘛,要算距离,要算各种各样的这个向量之间的关系,可能会用到呃,就是跟矩阵啊什么的这些数据格式相关,对不对?那么我们在Python里边有一个做数据分析的这样的一个呃库非常的有名,我们这里也需要引入这个,这个东西叫做panda,大家听说过吗?呃,可能大家对Python不熟的话,没听说过啊,但是呃,如果有同学用过Python的话,应该对它还是比较熟的,有很多,特别是做这个科学计算或者这个数值分析的时候,是经常会用到它啊。好,然后接下来大家会想到,呃,我们如果要是只引入这两个依赖的话,接下来下一步大家会想到我们该做什么了,按照我们的标准流程,一开始引入依赖,第二步是不是我们要做机器学习的算法先得?
01:49
考察我们的数据啊,诶,我们现在还没数据呢,这个数据大家想想能用我们昨天做这个线性回归的那个data吗?因为那个data是不是它是一个一个X一个Y,那个Y是连续值啊,它不是一个分类数据,对不对?哎,所以那个数据我们就没有办法,呃把它用来做分类了,它显然不适合做分类,所以大家看我们选择什么样的模型,什么样的算法,是根据具体的问题,具体的数据来做选择的,对吧?不是说呃,一份数据我们什么算法都往上录好,那么接下来我们首先要解决这个数据的加载和预处理的问题。
02:34
呃,那么在这个问题之前,我们先得考虑数据从哪来对吧?我这里边就不再去找单独的文件把这个数据写入了,我们这里就简单一点啊,我们这里呃,直接引入SK乐,呃,这也是Python里面的一个库,对吧?机器学习库对不对?它里边其实就有我们对应的一些数据集,就是一些事例的数据集,我们直接引入SK里的。
03:09
数据集,呃,这个数据集叫什么名字呢?这个叫iris iris,这是个英文,呃,就是英文专业的一个英文词汇啊,它它是什么东西呢?它它叫鸢尾花,这个我专门查了一下啊,呃,就是SK乐官方的这个库里边它有这个数据集,这是一个鸢尾花的数据,那大家能想到它应该是一个真实数据了,对吧?啊,所以这个可能我们做这个算法会更合适一些,好,那么我们看一下怎么引入啊,那Python里边我们如果只是引入某一个类库的话,那么我们可能就是from什么去import什么,对吧?From什么东西呢?From SK learn.data set,呃,这是SK learn下面的一个类,然后我们引入它的一个什么方法呢?只要引入一个方法就可以,它有一个方法叫load iris,那大家能想到调一下这个方法是不是直接就可。
04:10
把我们鸢尾花的这个数据,原始数据都都加点进来啊,啊,所以这个就是比较简单的一种方式啊,除了这个之外,我们再给大家引入几个,呃,几个方法啊,这个方法都是SK learn里边的方法,我先直接写,大家看看这个大家从名字能能分别出来它是什么东西吗?SK.model selection这个这个类里边它有一个东西叫做大家看啊,叫train test split,大家想这是一个什么什么方法训训练对吧,然后test测试对split切分划分对不对,所以这个方法他应该可以做什么事情啊,这个方法是不是可以切分数据集为。
05:10
A,训练集和测试集,大家能不能想到是不是这样一个东西啊?呃,所以大家看就是Python就好用,好用在这个它里边有各种各样的类库,各种各样的方法,我们如果要是想手写的核心的东西,我们去手写,那自己想直接调用的这些东西,我们直接拿过来用就可以了。好,那么再给大家引入一个东西,因为大家想到我们前面说了,最后评估我们这个算法,或者说像我们说到有这个各种各样,L1距离,L2距离,曼哈顿距离,欧式距离,我们选择哪种方式呢?选择哪个这个超参数呢?这些东西我们是不是要有一个评估的策略和方法啊,我们这里的评估是不是就得看它的分类预测的准确率啊,所以那这个准确率我们大家能想到,我们当然可以手动去实现,我们根据他训练集里边已经贴好的打好的那些呃,分类的标签,我们遍历一遍,对吧,一个。
06:10
一个去比对,当然可以这么做对吧?呃,但是这显然就显得有点笨了,有点费劲对吧?我们也这不是我们的核心内容,所以说我们直接引入另外一个方法啊,在s skin里边,它的matrix这个类里边有一个方法叫做accuracy score,那大家能想到这是一个什么什么方法啊,Accuracy是准确率对吧?然后score那是得分对不对,这个评价对吧?所以这里就是用来计算分类预测的准确率,哎,所以大家看一下,这就是我们要引入的一些东西啊。好,那么有了这个前面的引入之后,接下来我们就做这个数据加载预处理了,对不对?呃,那这个很简单啊,大家会想到我先定义一个变量直接调用,因为前面我们已经引入了,对吧?直接调这个方法是不是就可以啊?诶,所以大家看一下,我们看一眼这个iris是个什么东西吧?哦,大家一看这是个什么东西啊,大家看一个大括号对不对?然后大家看这个东西好大好大,对吧,下面还好多东西呢,那大括号括起来的东西,大家直观的想这个有点像什么,在Python里边数据结构像什么?像一个字典对不对,对,字典就是一个大括号,然后里边大家看k value6对不对,然后下边我们看完这个之后,这是不是又是一个k value6啊,呃,又是对吧?呃,它确实像一个字典,但是这是在呃,我们的这个呃,就是s k learn,还有这个panda。
07:58
所有的这些类库里面相当于把它又包了一层,那么大家如果想看它的type的话,其实可以打一下,对吧?大家看一下它的type是什么呢?是X SK learn里边,呃,UU下边的bunchnch这个type,所以这是给它包好的一个类对不对?那么大家可以简单的就可以把它认为这有点像我们的一个对象对吧?啊,这是不是有点像一个对象啊,它里面有各种属性对不对啊,所以大家就把它认为是一个对象,或者大大家把它认为是一个map也可以啊,所以这个大家看一下里边到底是什么结构吧,首先是data data,那大家会想到既然叫data塔,那是不是我们要的核心数据是不是就是这个呀,就是一个数组,对吧?那它既然是AR瑞,那这应该是none派里边的那个数组结构对不对?呃,它包了一层,实际上里边的东西就是一个二维的list。大家看到是。
08:58
List外面还包了一层list,对不对,这就有点像一个二维数组,一个矩阵了啊,这是我们的这个基本的数据啊,然后我们接下来继续看,除了这个之外还有什么呢?还有target。
09:13
它给的它里边是什么东西呢?呃,又是一个南派里边的arra啊,呃,这个南派里边这个东西叫ndrra,它的数据结构叫ndrra啊,然后大家看一下,它这个就是变成了一个一维数组了,对吧,一维然后里边的值是什么呢?就是012。那他还能想到这是什么东西吗?是不是,前面这应该是我们的数据的样本点对吧?每一个值应该表含呃,表达了它的某个特征对不对?那这里边是不是就是每一个样本点对应的分类啊,是不是就是类别啊,哎,对,所以大家看到这里的data相当于是我们的X,那这里的target是不是就相当于是我们的Y啊,只不过这里的Y取的是一个离散的值对吧?是分类问题吧,离散就是012,好,那这就是我们最基本的数据都在前面已经有了,那后边还有一些什么东西呢?那后边大家看到其实就是一些解释说明性的东西了,对吧?比方说这个叫target names。
10:21
那是不是就是代表我们这个012,它分别代表哪一类对吧?大家看一下这又是一个数组,它分别叫什么呢?三个英文单词啊,这里简单给大家说一下啊,这个我专门查了一下,第一个这个呃塞sata好像这么读啊,这是个什么东西呢?这是鸢尾花里边的一种,呃,这个应该叫叫山渊尾,就是应该叫这个山渊尾啊塞托A,然后后面这个这个叫worthy color,大家看有一个color对吧?这个叫杂色鸢尾,它可能颜色比较奇怪啊,杂色鸢尾,然后最后一个这个叫jei,它是叫就是维维吉尼亚鸢美啊,这个都是,大家姑且就认为它是这种花的下面细分的不同的品种,对吧?所以大家能想到这是一个什么问题吗?这是不是就是把这个花它长什么样,提取一些数据出来,然后根据这些数据要给它做一个分类,就直接把。
11:21
把它判断出来这是哪一类花啊,诶,所以这就是一个很真实的分类问题,对不对啊,所以我们就用这个数据集,它还是比较真实的啊,好,然后接下来大家还可以看啊,后面当然有一些这个说明性的,呃,这个字段对吧,大家可以看这边number of instance,这这都是一些字符串啊,我们看可以直接看到最后了,诶大家看这里还有一个字段,一个k feature names。Fisher names特征名称对吧?那这个特征名称大家会想到它应该跟什么对应啊,是不是跟我们data里边的这每一个值这个对应啊,这个值我们看一下,呃,大家看每一行,这应该是一个样本点对不对?呃,它有几个几维啊,几维的数据啊,是不是有四个维度对不对,有四个特征,那么这四个特征分别叫什么呢?呃,大家看就在这里定义了,对吧?叫呃这个sample length sample,还有petle length petal,那这是什么玩意儿呢?这个叫这个是花萼的意思,就是花萼长度厘米做单位对不对,花萼宽度,然后是这个是花瓣,花瓣长度,花瓣宽度,这个很专业对吧?啊,这个就是植物学上这种特征提取,然后去做一个它在植物学上的分类啊,所以这个就是一个很真实的数据啊啊,当然最后还有这个fair。
12:50
大家想找到这个CSV,这也是一个CSV文件,大家想找到的话就到自己对应的,大家可能跟我的目录不一样,大家去找到这个对应文件就可以,好这我们先瞄了一眼这个data它长什么样啊,然后接下来那么我们已经知道它长什么样了,那我们怎么用呢?这这个这么一大串东西,我们到底应该怎么用它呢?我们比较常见的一种处理方式是前面我们不是引入了pandas吗?那么我们这里边会把它转成一个pandas下边的data free,呃,那么大家就会这个东西,大家就会觉得比较熟悉了,对吧?呃,我们在这个呃,Spark里边也是有这个data frame这个概念的,那么在这个pandas里边的data frame data frame跟Spark其实是类似的,大家也可以认为就是有点像是一张表一样的结构,对吧?呃,那么当然它有一些区别就是呃,比方说这个在。
13:50
Wa里边这个data frame的大小应该是不能变的,对吧?你如果要改变的话,你就需要去重新再创建一个data frame,但是在Python里面它的大小是可变的,然后它可以对这个呃行和列直接行一些算术的运算操操作,所以它如果提供了这些特性的话,呃,那后面大家就会看到有一些操作非常非常简单,就是直接就可以把它就是一行搞定这种的啊,呃,那么大家这里注意,我这里是直接把这个艾瑞斯写进来了,但是大家标准的写法是这样啊。
14:24
前面定义这个data frame,它的data是什么?Data是iris,对吧?然后呃,不是data,应该不是艾ris,是艾RIs.data对不对?呃,我们要的其实就是这个具体的data啊,好,那么我们把data单独提出来了,那么我们对于一个data frame来说,它是不是还应该有这个列名啊,对吧?Columns,这里叫columns等于什么呢?Iri点,大家想这个columns我们应该给什么?它这个名称应该给什么?是不是下面那个feature names啊,这是它的特征,对,特征名称,对吧?Feature names,好,呃,然后大家会想到我这个data frame,除了,呃,我们先看一眼现在的这个DF长什么样对吧?我们直接把它print一下,这个Python好的一点,就是print啊,就是print大法好对吧?或者大家如果要是。
15:24
就是直接看的话,就是直接敲DF,这个直直观显示可能还看起来好看一点,对吧?大家可以看一下这这是一个this frame对不对?呃,那么我们的列,这就是已经选取出来的feature names对吧?然后大家会看到这一共有多少条数据呢?一百一百五十条对不对,从零到149,下面它打印出来了150行四列,对吧?啊,这是我们这样的一个data frame相当于是一个表格,这就是我们原始数据,所有的数据都有了啊,那么大家会想到我们其实不光想要它的这个,这相当于只是我们的X对不对,每一行是一个X对吧,就是一个样本点,然后一个样本点里面又包含四个它的特征值,也就是X1 x2 X3 X4,对吧?啊,这是这样,我们的一个数据结构,我们除了X之外,我们是不是还想知道还还得有Y啊,对吧,那这里边比较方便的一点,就是这个panda里边的data。
16:24
Re,可以直接去更改它的这个数据结构,可以直接在后面加上一列,呃,那大家看这个怎么加啊,我们要加的一列这个名,这个column给它叫什么名呢?就叫类别对吧?我们就叫class吧,然后这个class它应该等于什么呢?是不是iris点应该等于什么来着啊,我们是不是那个叫topic呀,对吧?所以我们可以把这个再加进来,那么我们再DF一下,大家看是不是后边就多加了一个class啊,然后它的这个取值是不是就是012这些取值啊啊当然这个这个是就是呃,Panda里边它这个默认的这个显示中间会把它这个用点点点给它缩略掉,对吧?那么大家如果想想想看的更多的话,那大家需要去改一些这个,呃,它它就是全局的这些设置,这些大家不用去考虑啊,所以大家看这个Python里边确实做这个处理是不是非常方便。
17:24
所以这也就是用这个来给大家大概说一说啊,然后如果大家想到这个class,大家看这个012觉得不舒服,想把它改成具体的那个名字的话,也是可以改的,我们怎么改呢?就再把这个。Class我们做一个操作对不对?大家看我们后边是要把这个DF里边class这一列做一个操作,然后操作完了之后直接再把它复回来,是不是就把它更改掉了,那么我们看要做什么操作呢?这里边就有很多算子,比方说map这个大家很熟悉的算子,对吧?呃,直接做一个这个map操作,Map怎么操作呢?这里边也非常简单啊,就直接传入一个一个字典就可以,那呃,或者大家理解就是一个一个map对吧?直接传入就可以,那么零我们要求它改成什么呢?改成iris点那个叫什么来着?Target name对不对,Target names0,好,那么我们把这个敲完了之后,大家看一眼,大家看是不是这个零就全变成这个sata这个山鸢尾的这个名称了啊啊,就直接取出来了,当然大家会看到下面,因为我们没有定义,所以那个二是不是它不是。
18:40
到你把它map成什么样啊,所以这个东西我们还是要给一下的啊。好,我把这个直接复制一下,因为大家想到后边都类似对不对,我们二是不是要给到iris target names里边的第二个值对不对,这里是一同样也做一个改变,好,那么我们把它运行一下,下边是不是也就全全改变了?二就是我们那个什么维尼吉亚原理对吧?呃,所以这是我们前面对它做的一个,呃,算是一个数据的预处理吧,然后大家在,呃,另外大家可以看这个,我们在这个Spark里边data frame是可以有这个describe方法的,对吧?同样在这个pandas里边也有describe方法,大家可以看一眼,就是,呃,这是不是就是我们整个数据的一些统计信息就拿出来了呀?啊,大家看这里边有它数量对吧,150个,然后均值对不对,方差,呃,这个是标准方差对吧,Std。
19:45
然后最小值最大值这些是不是跟这个呃,Spark data frame里边是一样的啊,但是这里边可能多了几个,这几个应该是Spark的describe好像没有的,对吧?大家说这是什么呀?25%,50%,75%,这是这是它对应这个数据的不同分位数的取值对不对?50%是不是就是我们平常所说的中位数啊,诶,那大家知道这个中位数的概念吗?这这50%中位数跟这个均值有什么区别啊,大家看这个均值是5.84,这个是5.80不一样对吧?这个有什么区别啊,均值就是所有的加起来,然后除以个数对不对,这个叫均值,那中位数是什么呢?中位数是,哎,对,就是如果你有100个人的话。
20:45
我举第50个人,然后他的那个数是多少,然后就是多少,对不对,是按照排名来的,那这个有什么好处,这为什么这是跟这个均值会有不同的意义呢?那大家肯定知道我们班所有同学,呃,包包括我咱们一起啊,去跟马云一起去做一个这个,呃,财产的这个平均值,那那么大家就会发现我们每个人可能都是千万富翁了,对吧?呃,但是这个东西有意义吗?呃,对,这就跟这个数据分布有关,对不对?如果说数据分布就是大家可能这个整个的财产值都很少,那有一个马云是特别高,他一下把我们的平均值就拉高了,那这个时候就没有多大意义,那这个时候如果我们看一下中位数,就是按照财产来排,排到中间的那个同学,他的这个收入大概是多少,那大家就可以明确的看出来,那比那个平均数是不是要低很多啊啊,所以结合这两个数,大家就能。
21:45
大概的看出来我们整体的一个数据的分布情况对不对,你要是更精确的话,就可以看到25%,25%那个位置的对吧?这个数大概是多少,75%那个位置的数大概是多少,所以这都是我们整个数据的一个统计信息,对吧?呃,这里panda的这个describe还是数据信息比较多的啊,比较全,好,然后我们这里在,呃,呃,那么大家现在看我们的所有数据是不是都保存在这个DF里边了呀,那我们具体要做机器学习算法的时候,我们还是习惯把它提出来一个X,一个Y对不对,那我们在从这个DF里边把XY拿出来吧,X应该是什么呢?
22:28
啊,当然这个DF我们只是在就就是在这里给大家做一个展示啊,其实不是要给大家,就是直接从DF里边做别的操作,那我们X是不是其实直接可以直接从iris里边拿对吧?那艾瑞点data是不是就是X啊对,所以我们看一眼这个X是什么,这是不是就是我们所说的一个。二维数组啊,当然就是none派,把它再包了一层,变成了一个ND瑞对吧?里边是不是就是一个二维数组,可以认为是一个矩阵对不对?哎,这就是我们想要的这个X,好,那同样Y是不是应该等于iris iris点什么,是不是target啊,大家直观能想到,我们看一眼这个Y是什么?诶,这个Y它变成了一个一维数组对吧?诶,前面我们其实看到了Y确实是个一维数组,这里就有一点操作起来可能不太方便,因为后边我们要调用的一些方法,比方说这个划分测试集,呃,训练集啊,比方说后面我们预测这个准确率啊,所有的这些SK learn,还有南派panda,它里边的方法针对操作都是对矩阵做操作的,所以我们是不是还得把它转成一个二维的呀,呃,对这个方式我们其实昨天在讲那个调库,做那个线性回归的时候也给大家说过,对。
23:52
啊,它的方法要求呢,都是一个矩阵,所以说我们得把一维转成二维,这个怎么转来着,还记得吗?Re ship对吧?Re ship负一一啊,这个是表示什么呢?就是表示你这个形状的这个,呃,列表啊,我不管你是它有多少行,有多少行算多少行,我把它最后全排成一个任意行,然后一列的一个矩阵是不是就变成一个列向量了?好,那么我们看一眼这个Y变成什么,大家看是不是变成一个列向量啊,就是这样的样子啊好,呃,这就是我们的一个初始的一个数据处理啊,当然这里大家可以把它的这个ship看一眼,XY,它都有一个ship的这样的一个属性,看一下它的现在的ship是什么,X的ship是154,这表示X是一个什么样的矩阵啊?对150行四列,所以就是150条数。
24:52
每一条数据里边它的特征有四个,对不对啊,这是我们的意义啊,然后Y就变成了一个150行一列,对不对,150个数据里边都有一个分类,对不对,就一个Y,好,这就是我们基本的一个状况啊,好,那么接下来我们还得做一个预处理,因为大家会想到我们既然是按照标准流程要把它切分训练局测试集,对不对啊,那我们接下来这个调库就会方便啊,我们接下来是划分。
25:24
训练集和测试集,那么我们就直接调库了,大家看如果要是我们自己写的话,可能这个算法还稍微有点麻烦,对不对?调库就非常舒服了,直接X train X test,这是不是我们准备分好的这些东西啊,Y train y test,它等于什么呢?直接调train test split,直接调这个方法对吧?啊,那当然了,这个方法是不是里边得传进去一些原始的数据啊?呃,原始数据要传什么呢?X一个,Y一个对吧?除了这两个参数之外,还应该传一些别的参数,比方说大家能想到还应该传什么参数,大家会想到我们之前讲交叉验证的时候,讲简单交叉验证是不是最简单的方式,就是直接按照一定的比例把它。
26:24
扒出来啊,对吧,或者还可以什么,呃,就是S折或者是留一对吧,那我们这里是不是就是一个简单交叉验证的想法,应该按照一个基本的比例把它划开啊,要不然我怎么知道你这个就是难道一半一半吗?对吧?所以大家注意,这里边我们基本要给一个叫做test size的参数,那直观的想大家这就是测试划分出来之后,测试集占的大小比例对不对啊,这里我们按三七开的比例的话,Test size给一个0.3啊,这是test size,然后我们还可以给一个比方说叫random state,那大家能想到这个是什么吗?这相当于是我们划分,我们是要随机划分对不对,我们不能有选择的,就把本身是一类的东西全划划分出来,所以说我们是随机选择的,这个random state就相当于是我们的那个随机生成器的那个种子,对吧,随机种子,那这里我们随便给一个吧。
27:24
都给一个35,当然就是说大家后面做测试的时候可以改这些东西,大家会发现改了这些东西之后,我们这个训练级测试集划分不同之后,后面会影响到结果的,因为大家会想到我们这个数据150条还是比较少的,对吧?所以你划分到哪一块其实很重要,然后后面我们再给一个参数叫做呃,Stratify stratify是什么呢?这个是表示,就是它要表示我们对于哪一个参数做保持比例分割,我们这里straty等于Y,这个表示什么意思?
28:04
按照Y的那个分布等比例分割,所以它的意思是说什么呢?我前面随机是随机,但不是完全随机的,就是我还要保证那个Y它是既有很,就是不是有012吗?对吧?我在训练集里边也得有同样比例的012分布,测试集里边也得有同样比例的012分布,对不对?我不能说训练集里边训练出来之后发现全都是零,你是够随机,随机出来之后全都是零,那我测试机效果肯定不好,对不对?因为我就不知道,呃,它分类是一和二长什么样吗?呃,所以这个地方我们给定一个,它按照Y进行等比例分层,呃,所以这个就相当于我们的X是完全随机的,对不对啊,根据不同层级的Y把X完全随机。好,这是这个划分训练集和测试集啊呃,一条命令搞定,尽管就是也比较简单,但是里边这些参数大家可能还得稍微绕一绕,就知道它是什么意思就可以了,会用就行了。好,那么呃,接下来我们就可以大家再来看一下啊,已经划分完了,比方说我们看一眼这个X train,对吧?大家看这是不是就是我们分出来的这个X的训练集啊,对吧?然后我们再看一眼这个Y,这是不是就是Y的训练集,大家看这个就不是刚才我们一排零,一排一,一排二对吧?这是不是就是有012都有啊,而且我们是按照比例分出来的对吧?所以那么直观直接这么看好像看不太清楚,我们这样吧,x.ship对吧?
29:46
然后我们y train.ship看一眼,诶大家看到这是不是我们的X train就变成了一个什么样的矩阵啊,一百零五行四列对不对?哎,那大家大概算一算,我们这个按照三七开的这个比例的话,150我们是70%选择训练级对不对?那70%乘起来是不是它乘以0.7,是不是一百一百零五啊,那大家可以算一下啊,那当然我们如果愿意看的话,X test它的shift应该是什么样子,是不是就是剩下的就应该是,诶这个写错了啊,是不是剩下的45个就应该全划分到测试级里边去啊?哎,这就是我们这个训练集和测试级的划分,好这这大家看我们前面这个光。
30:47
或这个数据预处理就做了很多啊,因为前面我们那个线性回归里边,大家只是就是重点在实现那个算法,现在我们这个KN可能它算法相对简单,我们要把这个整个流程标准化,对不对?呃,刚好这里给大家把这个数据集的划分和数据预处理也给大家简单的讲一下,就是我们在做机器学习的时候,前面其实都有这些步骤的。
我来说两句