七月在线公开课笔记-十三-
七月在线公开课笔记(十三)
1447-七月在线-机器学习集训营15期 - P3:02-CV-2-行人重识别项目(ReID)跑通训练+评测流程 - 程序员技术手札 - BV1ASste6EuZ
好啊,各位同学大家晚上好,嗯那今天是我们的啊,COMMDIVISION里面的第二次的这个项目课程,然后在上一节课程里面中,我们其实是跟大家已经讲过了啊。
REIDENTIFICATION就是raid的这样一个任务的主要的背景,Background,以及啊它的作用啊,他能有什么样的应用的场景以及它的价值,我们可以回顾一下啊,我们说到id这件事情的本质。
它其实是图像啊,这个计算机视觉领域里面的图像搜索的问题,那特别的呢它其实是啊图像的以图搜图的问题,也就是我给定一个请求啊,query查询的一张图片,那我要求要求什么呢,要求我们在数据库里面去搜索一。
些相关的图片啊,其实本质上就是啊这个啊这样本的图片,然后呢返回出来,所以虽然我们的raid看上去它是一个识别的问题,对吧,它是识别的一个id也没错呀,如果你这么理解是非常的合理,但其实本质上呢。
它其实是通过我们检索的这样一个技术的手段,而去达到最终的这样一个recognition,识别的目的啊,所以大家一定要记住我这句话啊,我们要看透过现象看本质啊,看起来它是一个识别类的这样一个问题。
但其实呢它确实是一个这个检索的一个,技术手段来进行解决的,那么我们说了,在raid这样一个领域里面呢,嗯它很重要的是这个特征的提取嘛对吧,所以他会有一个特征库的概念。
也就是啊我们有一个底库database的这样一个概念,那这个底裤呢其实就是啊我们说是它是gallery,那它其实就是我需要事先啊知道哪些图像啊,哪些人的人体的图像,它关联了是什么样的身份的信息。
也就是我们的ID的信息啊,那只有这样的前提下,我才能通过检索的手段去达到识别的目的,不对对不对,还想想看,不然这个问题就不可解好,那你要通过检索的手段去达到识别的目的啊,没有问题,那么嗯对于特别的啊。
就是我们怎么能够通过啊这个技术的手段去解,刚才我们这个问题呢,那我们知道啊,所谓的图像的检索的问题,它本质上呢就是其实是需要知道一个图像的,这样一个特征的表达,那如果没有这个表达,我怎么去做检索。
怎么去做识别,其实都是一句空话,对不对,所以为此呢我们其实是需要什么呢,我们其实是需要知道每张图片他的feature是什么,OK所以我要知道这件事情,因为如果我一旦把database里面的图像。
和我们的查询匹配的,GARY里面的图像全部都表示成了特征向量啊,不管是feature map也好,还是fish vector也好,那么在我这个后台背后的这样一个啊计算呢。
那其实就会把它这个转化成feature和feature,之间的啊similarity的这样一个比对,那换句话说呢,其实就啊会是这个啊,你想想两个特征向量让你去算相似度,你能算吗,那肯定能算啊。
那你其实就把这两个向量的内积算一算啊,就结束了啊,就是它的相似度和相关性,对不对啊,如果是这样的话啊,那是不是问题就迎刃而解,那为了达到这样的一个目标,那我们该怎么做呢,那我们是不是需要对。
我们有一个特征提取的一个模块来搞定,这件事情,对不对,我们要有一个特征提取的模块来搞定,那这个特征提取的这个模块啊,now又是什么呢,那我们知道啊,就是在我们CN的课程里面。
是不是跟大家已经有过简单的这样一个勾兑啊,我们说特征提取的这样一个,特征提取的这样一个啊额模块,它其实本质上啊我们在CN那里面,我们可以把它抽象出来,把我们的呃那个分类的那一个head给它去掉对吧。
本身我的CNN的输入是一张图片,输出是一个soft max的概率分布图啊,概率分布,那如果我把最后的那个FCSPSS给去掉,那么我们是不是你想象一下在你的啊BGG也好,或者alex net也好。
是不是其实在你的卷积层之后会接两个啊,FC然后再接一个输出对吧,那中间的那两个2048的那个FC呢,其实就是你可以考虑到你作为这个latent,vector的这样一个表达。
就是你的这个特征的这样一个输出啊,所以如果是这样的看待这个问题的话,我们其实就已经啊知道了啊,我要去提取我们的一个图像的视觉的特征,那么我们就可以通过中间的FISHMAP,或者FC的这样一个抽出来。
那我其实就会得到他的这样一个特征表达了,所以这是一个非常显而易见的这样一个呃,思考的这样一个方式,那这个问题现在我们就转化成了,我们要去训练一个CN对吧,那这个CN后面我们要去不管是抽FC也好,抽啊。
feature map也好,那其实就是啊随我们的这样一个啊随心所欲了,所以现在的这样一个本质呢,我们就把它转换成要求解一个啊,训练一个啊特征向量啊,特征的这样一个向量,而特征向量呢其实就是一个CN对吧。
所以我们要train这么一个C,那我们怎么train呢,我们需要有类啊,标签有数据,对不对好,那我们说了,我们的REID的这个数据其实本质上是啥,本质上其实就我们说了,它是每张图像啊,他会对应一个id。
换句话说其实你应该知道的是啊,你这个id对应哪些图像对吧,比如说小明这个人啊,然后他啊今天走了一趟轨迹,那经过了这个七八个十字路口,那OK他可能就有七八张,这样一个被十字路口抓到的这样一张图像,对不对。
所以这个就是构成了我的训练数据,我就知道这若干张图像描述的是这个id,所以说如果说啊我们的啊,嗯如果说我们把每一个id,都当做一个class name的话啊,都当做一个新的一个类的话,那是不是。
其实这本质上就是一个图像分类的问题,所以再次呼应到了什么呢,前面我给大家总结的,我们的raid的这样一个问题的本质,它其实是虽然是识别的这样一个问题,但它的本质它其实是一个图像搜索的一个。
比对的一个技术手段,去来解决这么一个识别的问题,那图像搜索的技术的啊,图像搜索的这样一个比对的核心,其实就是特征对吧,刚才我们就说了,我们的这个CN,其实就是我们的这样一个训练的这样一个,核心目标。
那所以呢嗯我们现在就啊可以train这么一个,刚才我们说的这么一个CN,也就把他的id当做一个class啊,我们就可以处理出来,但这里值得注注意的是什么呢,我再提醒一下大家。
你千万不要认为所有的评测数据集的id的信息,都一定要出现在你的训练数据中啊,我再说一遍,刚才我说的这个意思,不要认为在raid这个任务任务里面嗯,或者说不要认为在图像搜索的这样一个,大类的问题里面。
你评测数据集的那些id class,就必须要出现在你的training data里面,这是一个非常非常啊容易混淆的一个误区,这是一个不切实际的啊,我再举上一次跟大家举过的这个例子。
试想一下你的IPHONE啊,或者其他的手机,有那个人脸识别和人脸解锁的一个功能,对不对,你有没有就是在你的这样一个使用的过程中,要把你的人脸的图像拍多张图像,上传给苹果的icon的服务器。
让它更新一个模型,然后再返回给你部署,你才能work,我们没有这样的功能,我没有这样的体验,对不对,我们唯一要求的体验是说,你当时在借你的face id那个隐私的时候啊,你会这个头转两下。
然后这个拍两张这样一个图像就OK了,但并没有说啊,我们可能有这么一个时间差,还要人家啊,美国的这样一个啊苹果总部串一个model为每个人,那这个代价就大了,去海了去了,对不对,就不切实际。
所以任何啊我们把这个技术点扩展一下,任何凡是未来你们在工作中或者在学习中,看到一种带库的,就是database啊的这样一个带库的,这种啊CB的这样一个任务啊,它其实的最大的好处就在于什么呢。
它的泛化性我们是预期它是足够好啊,因为我们不要求他训练,他只需要什么呢,往这个库内扔图片就OK了,大家想想看是不是这样对吧,甚至举例来说有些这个厂商啊,比如说b a at,它有很多的这种云上的这个。
开放人脸库的这样一个识别,比如说啊公众人脸库啊,或者明星人脸库或者政治人脸库,对吧啊,他有这么一个能力,那你们说假设他确认好了一个模型,那我们知道啊,就是我们现在有很多的这个途径对吧。
我们可能会会有新的一些呃,i it啊,不管是人明星也好,还是动漫也好,会层出不穷,对不对啊,哪天这个啊B站上的up主,哪天他的这个抖音上的一些呃,这个呃这个这个群演那火了。
那我可能百分百来不及训练了对吧,那我那很简单,对于产品和运营的同学来说,他搜集一些这些的case啊,百度一下,谷歌一下,然后往你的那个数据库里面一导对吧,那这样的话你模型马上就能够更新了,对不对。
我就能识别出新的这种IP的人脸信息,这就没有这个时间差,还要再训练了,所以大家记住刚才我这一点就是啊,在这样一个子任务里面啊,或者这样一个,一大类的问题你肯定不会预期什么呢。
你的测试的数据的样本必须要出现在训练数据,这是不合理的一个要求,对不对,显然就是一个不合理的要求,所以呢这你就能够理解了,在我们的testing data中,在我们的测试数据中可能会出现一些新的id。
那些新的id让你去识别,没有说让你去做分类去做识别啊,对不对啊,其实让你通过检索的目哎那个手段去做识别,所以这就很合理呀对吧,对于训练数据集,我给你1500个人啊,这个每一个人呢可能有啊几十张图片。
然后让你去train一个分类器,注意这个分类器的分类的head,classification的head,他只能分类1500个人呀,对不对,因为只有这些出现在你训练的样本好,那假设测试数据集来了。
新的50个人怎么办怎么办,这50个人的数据的图片呢,送到你这个CNN模型里去,显然他也可以走通走通一次这个前向的传递,对吧,走通一次inference,所以他最后的那个激活它的这个分类,它也会有信息的。
但是没有意义,对不对,因为它不是属于这1500个类,那我们要的是什么呢,我们要的是它中间的那个feature和特征嘛,所以我们知道他的FC或者feature map的输出,那有了这个输出。
然后我们再把这个testing data里面的那一些,它肯定会关联几个id,就塞到我的database里面去,那这样的话呢,你通过后续的vector之间的检索和比对。
和这啊这个testing data中的这样一个,数据集的检索比对,那你就有了新的这样一个啊,就是识别的这样一个结果啊,所以啊这就解释了刚才为什么啊,我一再强调说,千万不要认为testing类中。
也一定是要出现在trading数据中的,这个id是可以不overlap,甚至我们希望它不overlap,因为只有这样,你自己衬出来的模型才会觉得可信,对不对,你才会在未来的工作中有底气跟你的老板说。
我的这一套模型,这一套框架它是具有泛化性的啊,不然的话你自己心里肯定也会觉得啊,非常的这个不踏实对,所以这就是我们在review了,我们上节课的整体的这个思路啊,我们应该是已经对齐了啊,对齐了好了。
那我们来看一下,回顾一下我们上节课的这样一个代码哈,希望同学们就是在上节课之后,应该是有过一些的啊,复习和这个啊run过一遍了嗯,我们目标是要去构建我们的这样一个特征,向量的这样一个啊提取器。
所以呢我们现在的啊手段呢,其实就是训练一个CN的一个特征的抽取器,对不对,然后具体的backbone呢,我们在这里选取的是啊,任何的一个CN的backbone其实都是work的。
只不过为了让大家能够在你们的笔记本上,可能就能够快速串起来啊,如果比如说有一些GPU的时候,大家可能抢了或者有一些啊这个掉线了,那这里我考虑到这个原因,就给大家选了一个mobile net。
那事实上你选RESNET或者啊更这个啊,更heavy的一些啊,backbone啊,inception的系列的,我觉得也没有问题,啧,好,那么嗯前面是一些基本的一些超参数的一些,定义对吧。
比如说batch size啊,optimizer啊,优化迭代器啊,对吧啊,然后这里呢我们会加载我们的训练的数据啊,就是我们的这个啊image的这个data image path。
然后我们说了就在第54行里面呢,它其实是啊啊sorry,我们是在这个啊52行里面呢,啊我们上节课跟大家说过了,他的IE的信息可以通过他的name来进行解析的,对不对啊,所以这是一个啊很好的事情。
然后并且呢我们跟大家说了啊,我们有一个zip的这个命令能够帮助我去做啊,很好的一个啊解析,那解析出来这个id呢,它其实是这个啊一个字符串,那其实我们是需要在我们的嗯训练的框架里面。
我们希望我们的label是自然增增增长的对吧,01234啊,或者这个啊他是一个one hot编码的形式,所以我们就有一个label encoder,能够帮助我们干这件事情啊。
它可以通过sk learning的面里面的PREPROCESSING,可以去啊帮助我们去做这样一件事情的转换啊,非常方便,那转换完了之后,我们就可以去分五分割,分割我们的training的数据集。
使得有这个啊training data和validation的data对吧啊,能够去啊干这件事情,那我们可以通过SKN里面的try test,split这样一个函数去做这个test。
这样一个split啊,当然我们可以通过我们的test size,这样一个超参数呢来控制我的比例,比如说八二分还是好七三分,然后注意啊,我们这上节课也跟大家强调过了。
就是我们有一个random states,千万是要来进行设置的,为什么呢,是因为啧我希望我每次运行的时候,我的train test data它其实是一致的,那不然的话你每一次来进行调参。
你就不知道到底这个参数调整的好,是因为你的数据集变了,还是因为你的模型确实更好了啊对吧,然后有了之后呢,我们是不是就可以去加载我们的backbone。
我们backbone在这里选的是mobile net v2,那在之前的课程我们跟大家已经讲过了,就是这种lightweight的这种一个CN的这样一个优势,它其实是通过这种这个深度可分离卷积的。
这样一个嗯小技巧啊,能够帮助大量的减少我们的训练参数啊,如果我们的卷积核是3×3的,大家还有印象中它大概参数量能降低多少吗,还有印象吗,想想看在我们的上上节课,上上节课应该是有过啊,这个相关的讲解的啊。
我们是不是说了,它大概是K平方分之一啊,其中还有一个小的那一段呢是忽略不计是吧,所以如果我的kernel size是33的话,那我其实参数量就能够大概降低到这个啊,1/9嗯,OK我们继续。
那有了这个backbone呢,我们其实是啊这个超参数,我们选的pulling是max,所以这就意味着当然我们这个with是internet。
所以就代表着我们需要啊有一个image net pretraining,一个model,没关系,就是如果你第一次运行的话呢,啊,你的网络就会去去这个啊,服务器上自动的download这个参数。
然后呢通过pulling是max的话,给你输出一个啊max average pulling的啊,max那个global max pulling的一个feature vector。
然后后面你就会加个dance啊,就是FC的layer,因为你要去分类嘛,分类你的这个到底有多少个id,所以你会有一个经过soft max的输出,然后把整个model的输入输入,把它给接起来。
这就是你的baseline model,所以这大概就是我们整个的这个啊情况啊,整个的这样一个情况嗯,我们已经写到了这个baseline model了,对不对,所以后面的代码就非常的呃。
这个大家可以自己想象吧,所以是非常的这个直接,因为接下来呢我们就会啊可以来train这个模型,当然在train这个模型呢,我们需要有写一个data loader啊,这就是我们今天的一个重点。
当然我们先啊不用纠结这个这个工作,因为我们把整个high level的这个啊骨架,帮大家理清楚了,然后再去把它填充啊,这样大家会对整个东西啊,整个啊project整个项目会理解的更加的这个透彻。
所以我们假设我们有了一个啊这个data order啊,假设有一个data order,那这个data order大家想想看嗯,我们一般会用什么来实现呢,啊通常的大家的想法是说老师啊。
我知道我把所有的数据啊,class他的name,以及它对应的这个输入的图像都加载加载进来,没问题啊,就是你的training的data的X和Y的这样一对配啊,所有的pad都加进来,有什么问题吗。
啊没有问题啊,如果你的训练的数据,其实它是能够在被你的,显存和加载进来的情况下,内存加载进来的情况下完全没有问题,OK比如说EMINNEST的这种数据集,SA10这样的数据集。
但是大家别忘了在实际的工业界中啊,你恰恰是有大量的这种训练的数据,比如说十几万几10万的训练数据,那一下子加进来存不下你的显存呀对吧,所以你希望的是什么呢,你希望的是通过batch的形式,批量的形式。
从你的硬盘里面加载到你的显存里面去,然后训练完了之后呢,换下一批对吧,这样的话,那在我们的Python的这个啊数据结构里面呢,我们其实是要用一个叫generator的,这样一个迭代器来进行实现的啊。
希望大家应该是有一些印象,Ok,所以我们假设啊,我们的generator其实已经啊写好了,一会儿我们会啊会跟大家去写啊,假设我们已经写好了,对吧啊,有一个这个generator batch。
对于training data or而已,好假设我们有一个validation的,generator啊,然后是,啊回头,当然这里面有超三对吧,我们要来进行定义,有参数好,那有了之后呢。
呃我们还可以额对我们的这个模型啊啊,加一个checkpoint,也就是说我对每一轮呢我可能是需要什么呢,需要这个去存一下我的模型的这个位置,不然的话后面我再来呃,这个比如说追溯我当中的哪个模型好的话。
我就没有办法对吧,可能我们需要有一个checkpoint,啊来进行保存,那这个checkpoint呢我们其实可以通过啊这个,这个里面来TENSORFLOW里面的那个checkpoint的这个。
call backs来进行导入,OK那什么叫做call backs呢,还有印象的同学应该就知道,他其实也就是回调函数对吧,所谓的回调函数,你顾名思义嘛,就是从它的这个名字里也能知道啊。
他是在某种情况下来进行这个啊回调的啊,也就是你要run了某一个操作之后,它会来进行回调,那他在什么情况下回调呢,通常来说,他是在训练完一个这个epoch的数据集,下来进行,就整轮数据集结束之后。
一轮之后他会来啊回调,所以这里定义的话,比如说我们定义的一个存储的一个文件啊,然后这个monitor呢是监控的意思,监控的一个指标,那比如说我可以监控啊。
validation accuracy或者validation loss对吧,划一趟给大家,然后verbals,意思就是说啊,如果说啊,我当前的checkpoint要比之前的好啊。
然后并且我要保存下来的话,我可能会给你输出一行这个log啊,我说当前的这个参数会更好,还有一个这个save best only啊,我们可以把它设置成true,这个意思就是我每一轮在迭代完了之后呢。
我都会去看一下我是不是比之前的这个呃,在validation上,accuracy上这个指标来的更加的好,如果是的话,我就保存下来啊,就这个意思,所以这样的话我们就啊可以去train,我们的模型了。
啊fit,然后呢train generator啊,就是导入我们的这个训练数据集,然后呢,steps per epoch啊,你根据他的名字就知道了,那其实他在算那个什么呢。
number of iterations对吧,所以number of iterations是多少,是不是其实我有多少数据,然后呢去除以我的batch size对吧。
那我们的validation的这个data是什么呢,是不是就是我们的generator对吧,然后MALIDATION,那是不是其实就是number of,Wild d image pass,除以我的。
Bad size,然后我的白size就是我们的白size,然后我们的bub,刚才我们说了,可以打印出来,Shuffle,我们是不是需要啊,让我们的training data来进行一些random。
shuffling啊,问题可以,然后number of ebox,我们之前定义好了100个对吧,好然后我们的call backs,call back x呢,它其实可以有一个什么呢。
有一个list就是我会有一个列表,我都可以用啊这个回调函数来进行这个链接的,那通常来说呢啊在我们这里定义好的,我们可能定义了是一个啊checkpoint,就是去存在每一个训练的epoch,完了之后呢。
我们就会去存我们的啊,啧这个呃checkpoint就我们的model的weight,那大家想想看还有什么样的呃,可能的回调函数会存在这里呢,大家想想看,那我们在每一轮结束之后。
是不是有可能会要调整我们的学习率,比如说呃每十轮啊,或者每20轮,我可能会要降一下我的学习率对吧,这是很合理的一个啊调参的一个经验嘛,那所以对于调整学习率呢,啊这样的一个回调函数呢。
也可能是放在我们的什么呢,我们的这个呃call back x里面可以去进行实现,好啦,那这样的话就是我们整个框架已经搭完了对吧,架子都已经有了,那唯一的这个呢就是缺什么呢,generator啊。
缺generator好,那不着急啊不着急,我们就回到这个啊generator的这部分的这个代码,我们来把它实现完就OK了,好,大家有没有觉得在前面,我们的内容有什么样的问题。
我们给我们停大概半分钟的时间啊,没有同学问问题的话,我们就继续了,这块有没有一些疑问好,看起来暂时没有问题,OK很好,然后那我们就继续了啊,我们继续,好那我们定义好。
定义一下我们的generator的batch,那在定义的这个时候呢,大家想想看可能有哪些参数啊,我们会需要用到呢,那其中第一个参数非常容易想的两个,其实就是X和Y嘛。
其实这里的X不就是image pass list,情况就是image path list和image label的意思吗,诶不好意思,然后呢还有number of classes,吧我有多少类。
还有很合理的呢,那我的尺度吗,这两个对吧,batch size也很显而易见,比如说我们给他一个默认的32啊,我64shuffle啊,比如说我们也可以给他,然后呢,还有一个呢。
就是有时候啊我们可能需要去啊看一下哦,我们一会儿要用的数据扩增的一些数据,增强的中间的结果啊,或者存一些其他的东西,我们可以给一个目录啊,我们前面说过了,就是啊在计算机视觉领域里面啊。
在training的时候,我们通过数据扩增的方式呢,我们会去实现什么呢,去去降低我们过拟合的风险对吧,所以就是啊,这个呃我们一会快要来进行实现,那这里给大家啊两个例子啊。
就是这个image label list和image past list会长什么样子呢,啊我们预期是这样的,啊,那可能他长得这个样子呢是啊,比如说他的目录是可能杠home杠。
比如说data下面的一点JPG啊,然后他可能是长这个样子啊,一个pass list,然后这个image的,label list长什么样子呢,可能是七二十三八十等等等等啊,他可能会长这个样子。
那我们output是什么东西呢,大家想想看,For output,而对于这个generator generator的batch而言,我输出会是什么样子的,显然我肯定是都叫是一个batch的数据的加载了。
那我肯定是要加载什么呢,加载我们的,X batch,I batch,对吧,我肯定要加载这个嘛,那是不是我要return呢,是return这个吗,大家想想看,我最后一行就是我的这个函数的代码,的最后一行。
我是不是return这个,如果回答是return的同学呢,那就是啊这个编码的基础是稍微啊,我们在需要再好好回顾一下了啊,就对于generator迭代器而言,我们的关键词是yield。
啊不是return啊,好,那除了是返回x batch和y batch,这样的一个X和Y的这样一组配,那还会有什么样的形式呢,还会有什么样的形式,其实是取决于什么呢,取决于。
我们想要让我们的generator干什么,但我不想让他干什么,我们希望我们的generator batch的这个东西,不仅是能够在什么呢,在我们的训练的数据中会用到。
我们是不是在evaluation的时候,或者在inference时候也会要用到,因为我都要读数据啊,只不过在训练数据中啊,我们需要用到的X和Y,而对于做evaluation的时候。
或者做inference的时候,我们就没有了那个Y对吧,我们是要预测Y有X,大家想想看是不是这样子,所以这样的话啊,这样的话我们就希望什么呢,我们希望我们的这个这样一个函数,是能够兼容什么呢。
兼容我们的训练的过程,和我们的160ATION的过程,大家有没有get到啊,我的这样一个想法的布局啊,就是你在编码的时候呢,你就应该有这么一个想法了,因为这两个过程非常接近,只不过呢对于我们的呃啊。
只不过对于我们的这个呃influence的过程而言,我是少一点东西而已对吧,所以这两部分的代码是大部分啊,是很多程度上可以来复用的,所以如果你说老师啊,我就是想要新写一个函数,我就不让他们复用,可以吗。
哎可以的啊,没问题是OK的啊,就是功能上的这个实现完全没有问题啊,只不过啊你可能会显得,如果你的同事以后来review的代码,可能会对这部分好抽象的一个呢,这个可能会有些许的这个小小的这个建议啊。
就是这个意思啊,如果能精益求精啊会更好,所以呢我们也希望什么呢,我们能不仅能够返回这个XY啊,也干脆就返回我们的x batch也是OK的,那这个取决于什么呢,大家想想看。
是不是取决于你的image label list有没有提供啊,那如果我没有提供,那当然我就认为我是在influence阶段,没有任何的问题啊,啊如果我提供了,那OK我可能是在training的阶段啊。
所以这也很好理解对吧好,那么如果一旦有我们的这个啊,image label list和image这个pass list呢,其实我们大概率是希望什么呢,希望我们两者是啊就是啊划等号的对吧。
我们是希望这两者是一致的,好OK啦,所以我们可以先定义我们的这个batch size啊,大概有多少,其实就是我们的image path list了,好如果if shuffle,啊如果要shuffle。
那我就可以直接在image path list和image label list,直接shuffle,那注意就是这里的shuffle啊,你需要来保证什么呢。
shuffle前后的pass和label是要一一对应的,不然的话就有问题端,千万不要比较这个意思,这个想都没有想就开始什么呢,想都没有想就直接对什么呢,对呃先shuffle我们的label。
再shuffle,我们pass啊,那就有问题,你要带着他俩一起shuffle,那当然可以写一段这个自定义的函数,去干这件事情啊,只不过呢我们有一些这个能够帮助我们,就是啊。
有一些这个呃现成的函数能帮我们干这件事情,比如说,我们就可以用这个shuffle啊,来帮助我们去shuffle啊,同时shuffle这俩玩意,好他输入也很简单啊,就这两玩意,好让我们继续。
然后我们从设定一个index吧,我们从零开始,然后while true啊,这个是老套路了,因为我要去不断的循环我的啊,取我们的数据集嘛,在我们的batch里面来进行啊,循环好,While tru。
那我们来看看current的index在哪了啊,current index在哪在哪呢,是不是你当前的batch index去乘上什么呢,你的batch size,然后我们磨一下我们的大N。
啊就完了对吧啊,为什么要磨呢,因为有可能我们后面我们下一个迭代的时候,对吧,我超过了我的那个当前的这整个啊,depot的这样一个数据啊对吧,所以如果说if大N大于等于,Current index。
加上我的白痴size,那说明什么呢,说明我现在还没有到头啊对吧,所以我的current,C u r current,batch size就可以,为什么呢,我们的batch size没有问题。
嗯batch index加一就好了对吧,否则的话什么呢,Create by ch size,最后一个batch size就等于,对吧,因为我就等于他俩的差嘛,因为如果我再加上整个白痴size的话。
那我就超过了它啊,那我就是下一个轮迭代了,那下一轮迭代呢,那不就又置零了吗,对吧,又置零了,好所以这样的话额我们就写了这么一个啊循环,在这里啊就是我给大家提一个小小的思考,大家想想看。
就是后面这一点我处理,如果偷懒不处理,可不可以,可不可以,我们说是可以的,因为你想啊,就是你想想看是为什么,因为,如果说,我不处理的话,那无非就意味着什么呢,最后那一小撮数据。
它不出现在我当前的训练数据中而已,准确的说,我纠正一下,是并不出现在我当前1poke的数据中,唉这句话你承认了,你认可了,为什么我说是不出现在当前epoch的呢,有同学能想出来吗,为什么呢,因为什么呀。
因为刚才在我们training的那个文件里面,那个代码里面,我们写了一个回调函数,还记得吧,这个回调函数我们说了,他是做checkpoint的,对不对,但是在那个回调函数上面是不是还shuffle了。
对吧,我们还shuffle了,所以呢很简单,我当前可能不出现,但是不代表我以后不会出现了呀,因为我下一轮就shuffle了,那可能大概率啊,我本轮遗漏的那一小撮数据。
并且那一小撮数据还没到我的白痴size,对不对,这么一小数据,我觉得我下一个会出现,就算我下一轮不出现,我下下一轮也会出现,对不对,那你想想看你有多大的概率,你每次shuffle都没有sh不到任何一个。
那假设你有100轮的话,那你有二的100次方,你都没有杀不到这个,那这个概率就很小了,对不对啊,所以这个就啊解决大家疑惑了,甚至我就再给你算的严格一点,就算你有啊很小的概率都没有杀不到。
但是呢那又怎么样呢,我的数据集可能是十几万的数据集,我少那么几十个数据就不行了,你想想看不至于对吧啊不至于啊,所以从这两个观点呢就能解决,刚才啊我给大家提的这样一个小思考好了,现在呢就是啊总而言之。
我们就已经啊啧,由我们的这个啊当前的这个两个index,那么我们希望要做的是什么事情呢,我们希望是根据这些index能够读到什么呢,我的training的数据集X和当然批量的啊,分批的啊batch。
然后x batch和这个y batch,所以呢我希望有这么一个函数啊,叫load image batch,这个函数能够帮助我来加载啊,我的这些数据数据集,比如说。
我当前知道我的image的pass list对吧,我当前的index是current index对吧,那我要读到哪呢,我是不是要读到current index加上current batch size。
对吧,然后我的image label list是什么呢,是不是current index读到哪呢,current index加上current batch size。
当然我还希望有一些简单的其他的超参数对吧,可能可以来进行传递,Number of classes,以及你要读进来的image的wise和image的height,对吧,很合理吧。
所以我希望有这么一个函数,能够帮助我干这件事情好,那我们就回到前面来,我们来实现一下这个函数哈,它有什么样的啊,话筒,好啦,这个就是应该,嗯能够理解了啊,能够理解了,好我们把它的超参数写一下。
刚才我们写过了,那首先呢我们可以解析一下我们的batch size,为什么呢,因为这里面啊我都是load image batch,所以很显而易见就是我的,image pass list length啊。
其实就是我的当前的batch size,毫无疑问对吧,没有任何问题,然后呢,我们可以初始化一下x batch和y batch的形式来,expect的形式,答案是什么,是读入图像呀,对不对,读入图像。
那读入图像是不是,其实我们知道图像是三通道的一个cancer对吧,所以就是我们的bash size in height image base,还有一个什么呢,三呢对不对,RGB3通道呀,没问题吧。
YBH呢,200是什么,没大家想想看WIFH是啥,显然WIFH是,这玩意,后面怎么写,关键的来了,后面怎么写,是不是想想就知道应该是什么呢,Number of classes,为什么。
因为我希望我的label,是one hot in coding的形式,对不对,所以自然而然我们就有了,当然后面我们加一个,能想通不,是不是应能抢通,因为啊我需要one hot encoding。
那所以自然而然呢我number of classes啊,我就知道诶哪一个是一,哪一个其他是零,好了,那这样的话呢我们就有了x batch和y batch啊,它的初始的定义,那接下来的问题就在哪呢。
接下来的问题其实就在,我怎么把x batch和y batch给填满来,注意是正确的,填满来,那我的问题就解决了,因为这样的话,我就把我的data从黎从这个硬盘里面,加载在我的显存里面。
因为它我都已经读进来了,然后我就扔到我的深度学习的框架里面,让他去training就好了啊,我的任务就完成了啊,所以我整个逻辑呢就这么一个思路,大家看看这有什么问题啊,如果没有问题的话,我们就继续。
那接下来就是我们刚才说到对它进行填满对吧,那填满很简单啊,我写个for循环对吧,啊然后我们解析一下image的has就等于我们的,pass list i咯对吧。
好那接下来呢我们要去解析我的这个image path,读进来是不是就OK了,好那我们中间到时间休息一下,然后大家可以去喝点水上个厕所,然后迷惑回过头来继续写,好啊,那我们继续。
额如果我们要去解析这个pass的话,那我们其实会要用到open CV的一个命令啊,就是像CV two点immigrate,然后我用这个CV two点EMIRAID这个函数来读,进来的时候呢。
它的通道是BG2的通道啊,就是啊不是RGB的,所以这个需要需要大家给稍微留点啊,留心点,啊这个时候呢我们的image shape是这一个,128啊,6643,那如果什么呢。
如果说我的这个shape是不不是啊,就不等于我之前定义好的这个,那我肯定要resize一下,But hin uh resistar,这个,那我要把它再调回到RGB的话,我该怎么操作嘞。
因为我后面的一些normalization啊,或者一些啊这个先验的一些超参数啊,我可能都是根据RGB的对吧,最大想想该咋办呢,很简单,不要想复杂了,因为我的长和宽它是不动的对吧。
因为我只有depth的那个维度,是RGB到BG啊,RB加到RGB,那很简单,是不是直接让他反一反就好了对吧,这个就很简单了,然后呢,是不是就这个东西,我们就x batch的第I个就已经写完了对吧。
都已经写完了,可以吧,很合理啊很合理,那接下来呢我提醒大家,接下来我们可能要考虑一下,image label list这个东西了,大家想想看该怎么来处理,怎么来处理呢。
我们前面在刚开始的课程我们就讲过了,我们说我们希望我们写的这一坨函数,是能够同时满足于training和influence的,而对于inference而言,我的image label list是缺失的。
所以自然而然我们就希望什么呢,我们就希望我们可以通过image label list这个东西,来判断我到底现在是处在training的阶段,还是处于在inference阶段的对吧。
这样的话我的可操作性就强多了嘛,所以很简单啊,我就可以这样干了,所以if image的label,List is not n,那这样的话如果不是OK,那我就直接把我label list的第I个取过来了。
然后呢我要把我的why batch给赋值填充完了呀,对吧,也就是我的那个one hot encoding,那我该怎么写呢,因为我们的one hoencoding是只有一个一,其他都为零啊,那该咋写。
是不是其实很简单,直接就是一就好了,能想通吗,如果能想通的话,这个其实就是呃,这个其实就是我们的这个y batch,就把它给构造好了,好啦嗯,那接下来呢,接下来我们是不是就return了,对吧。
我们要到return什么呢,return x batch和y batch没问题,但对于这是对于training的情况下,那对于inference evaluation的情况下呢。
我是不是只需要return我的x batch就OK了就OK了,大家想想看是不是这回事情,所以如果是这个情况下,我们是不是要return x,batch和y batch,如果不是的情况下。
是不是我们就就直接return我们的x x batch结束了,想想看,这样的话,我们就把整个load image batch的这个函数写完了,我把它都放在这里啊,我把整个都放在这里。
大家来看看有没有问题,好有问题提出来没问题,一会我们继续走,上面的这些超参数都是传入的,不管是past list还是image able list,这个东西怎么来的,参看上一节课程对吧,我们已经说过了。
在上一节课程里面,我们是不是都已经解析好了,他的啊,class name啊啊past list,label list对吧啊,Training image,Pass,Original ideas。
这些我们都已经解析好了,那还有问题吗,看起来应该OK,好那看下OK的话,那我们就继续了啊,那load image啊,batch我们就已经有的话,那OK我们就可以回到我们前面。
我们这个中断的这个部分了对吧,就是x batch,Y batch,我们就可以好,回到这儿来了啊,回到这来了,然后我们通过刚才我们实现的这个load image batch,这个函数是不是就。
就可以读到我们的这两个X和Y的这样一,个数据集到数据了,好那我们已经快接入尾声了啊,接入尾声了啊,如果说我们前面argument的这个设置是true的,啊就在这里面,我们是不是有一个AUG写错了。
啊我们写了argument是true的,那我们其实是需要什么呢,需要做数据增强的,这个数据增强怎么做呢,啊我建议大家用这么一个包啊来做,就是在这个之前呢,你可能要做一个准备啊。
我建议大家用这个数据增强的报,好就是这个吧,你也应该可以通过pip install一下这个啊,问题不太大啊,问题不太大,所以也可以,然后呢嗯你进入这个,刚才我给你的这个链接的这个主页啊。
然后他就会给你嗯啊,这个给一个show的一个example的一个例子,然后你把那个例子啊拷贝下来就好了,这个例子就是他会给你设定一个sequence,这个sequence呢,啊他会给你这坨啊帮你写好啊。
比如说啊随机翻转啊,然后这个是不是要加一些这个椒盐噪声啊,然后是不是加一些旋转啊,会不会有一些,这个啊随机的一些平移呀啊等等啊,就是他会给你,你就直接用这些标准的操作啊,就OK了啊。
就他其实会定义很多的一些嗯,可能几十种,上百种的这样一个数据增强的一个操作,你进入这个主页,你看一下呃,你就呃非常的这个明确了啊,你就非常的就他的这个非常非常的多啊,好那我们就回到刚才我们的。
if augment啊,If augment,那首先就是啊,我们可以对batch这个数据呢确认一下,把它转成,Int,啊如果不做这个可能会报错啊,我只能说可能也许不会报错,如果报错了。
他可能就会提示你需要是INT8,刚才我们定义好的那个sequence,就是你从主页上可以啊,抄作业抄下来的,就OK了啊,它的使用操作非常的便捷啊,因为他都已经帮你啊,接口化了。
OK然后如果if safe,啊那刚才这里啊,你就直接去啊,用那个啊自己写了,就是你可以把当前的这个image给存下来了啊,就是直接下image点save什么东西啊,自己可以把它实现啊,或者不用啊。
如果你不想把它save下来,那你直接这个注释掉啊,没什么问题好,我们继续啊继续,呃X的batch好,我们说啊我们通常会做一些啊normalization对吧,比如说,除以二五,这很正常吧,啊。
然后事实上啊,通过我们对那个image net这个数据集的一些啊,经验啊,就是这是我们经验归纳出来的啊,就统计出来的,然后他有一个均值减去均值除以方差,然后这个统计的经验值呢,我们会把它放在这里。
所以大家后面不要再问了,就怎么来的,他就是统计大量的数据得到的,仅此而已,那直接就x batch,Y batch,那看看有没有什么问题,我来回的给大家切几遍啊,好那如果这里没有问题的话。
我们就可以回到我们今天课上啊,刚开始讲的最后的那个,就是我们就可以串起来了对吧,但只不过在这里呢,我们啊要把刚才那个generator啊,这个batch可以把它写完了,对我们要把它写完。
比如说我们就暂时不需要画了,这样的话我们就把我们的train generator,实现完AB了,大家看有没有问题,啊没有问题的话就很简单,那后面的validation的generator。
我们基本上很多参数是一致的对吧,为什么这里的argument是false,而上面的是true呢,大家想想看,为什么,是我写错了还是有意为之的,很显然,这里的false是,因为我们这个时候。
我们加载的的是validation的data,是我们的验证的数据集,那如果是验证的数据集,我们是不预期,并不预期它需要经过数据增强的东西,想想看是不是这一点,是不是我并不预期它会经过数据增强。
因为没有意义,因为我要知道我的每一次的好指标的上升,我的validation的评价的这个数据集是不变的,对吧,我要知道呃,我的数据是不变的,而是由于其他的这个带来的提升导致的。
这才证明我的参数是啊合理的,所以这样的argument我是要把它固定,而是固定住,是不要去动它的训练的,那这样的话呢,我们就把我们整个的训练的框架拉通了吧,完全可以run起来啊,我们再回扫一下,对吧。
数据读入,然后啊模型的构建修改,哦sorry,不好意思,差一步啊,我刚刚还好,我回扫一遍,差一个,大家有没有看出来我差哪里,他还不不能够站起来,它会报错,有没有看出来是在哪。
是不是我们还没有配置损失函数,想想看是不是这样,我并没有在哪里直,那个指明我们要用什么损失函数对,所以是在98行下面的这个我们需要有一个,baseline model点。
compile一下我们的loss,啊时间,啊这里的matrix指的是什么呢,就是你到底需要什么样的accurate,这个啊ACC啊或者accuracy啊,这样的指标,啊大概就这样。
所以这样的话我们就把我们的loss函数指定啊,这样是能够run起来的,好吧对,好然后下一节课呢我们就会啊,我们训练跑出来了,那理论上面有模型了对吧,有些模型我们怎么来进行评测呢,那下节课就是我们的重点。
OK嗯,大家看看对今天的内容还有什么样的问题吗,OK如果没有其他的问题的话,我们今天的内容就先到这。
1447-七月在线-机器学习集训营15期 - P4:02-数据分析与特征工程串讲 - 程序员技术手札 - BV1ASste6EuZ
好那么我们开始我们今天的一个课程内容,我们今天的课程内容呢其实嗯并不是特别难,我们主要是给大家讲,给大家讲解一下我们的一个数据分析,和我们特征工程两部分啊,一个是数据分析,一个是特征工程。
那么我们的一个具体的一个嗯时间安排呢,就是我们有四部分的一个具体的内容,首先呢给大家介绍一下数据的一个处理和分析,然后第二部分呢讲解一下特征工程的一个嗯,具体的原理和实践。
第三部分呢讲解一下具体的模型的训练和验证,第四部分是总结与回顾,好我们就开始我们的第一部分啊,数就是说我们的一个具体的数据分析的过程,在开始我们的数据分析之前呢,我们先会给大家讲解,就是说问题与建模。
这个呢其实是在我们的一个具体的一个嗯,数据挖掘,data mining的一个任务里面是非常重要的,数据的建模,它其实是嗯,决定了我们最终的一个解题的一个方法,以及我们具体的一个解决的六。
解决的一个问题的过程,我们都知道这个机器学习,它是划分为具体的一个场景的,这个场景呢就是我们是相当于是一些具体的一,些problem,或者说具体的一些task,这个task呢我们是根据在机器学习里面啊。
我们是根据分分任务对吧,我们到底是分类的回归的排序的,或者是无监督学习的对吧,我们的分类相当于是classification回归regression,排序是这种rank,无监督学习。
就是unsupervised learning对吧,那么这个地方呢,为什么我们是呃机器学习的一些具体的一些,应用场景,要做这些具体的划分呢,就是说其实本质我们的这些具体的一些场景呢。
它是都是可以对应到一个,机器学习的一个问题上面,那么我们的具体的一些,不管是在学术上面的一些问题,或者说在我们的一个互联网公司里面,遇到的一些问题呢,我们是可以根据我们的问题的一个类型按。
来完成一个划分的对吧,我们就是说遇到一个问题,我们的问题到底是有没有标签对吧,我有有没有这个label,如果有的话对吧,我们这些人是一个有监督的,有监督的,如果我们的一个label是无的话。
那么我们就是无监督的,然后在我们的一个有label的情况下,我们的label到底是什么类型的,这个label到底是它如果是离散的类型的,那么它就是一个分类的一个类别对吧,分类问题。
如果我们的label是这种数值的,那么他就是一个回归问题对吧,如果我们的一个label是这种次序的,那么就是一个排序问题,以此类推,那么这个无监督机器学习里面,也可以进行具体的划分。
我们嗯如果有基础的同学,应该知道我们在这个无监督机器学习里面,我们可以划分成什么,划,分成我们的一个就是说比较典型的PC,这种降维维度就降低,或者说这种k means,做我们的一个具体的一个聚类对吧。
这种pc a l k means都是我们的具体的一些啊,无间多器学习方法对吧,当然还有些其他的,比如说加入了这种深度学习的,这种自编码器的一些方法对吧,那么我们在做一个具体的一个建模的时候呢。
首先是需要对我们的一个具体的一个问题,做一个大致的划分,它到底是分类的,违规的排序还排序的,还是无监督的,这是第一点,第二点呢就是说我们的一个具体的问题呢,其实我们是可以把它嗯。
就是说有一些典型的一些案例,就是下面比如说预测某个用户是不是违约的,这个呢就是一个很典型的一个金融风控的一个,二分类问题,二分类的问题很典型的一个金融风控的问题,预测房屋的或者是房价的一个热度。
或者房屋的一个价格,那么这个很典型的对吧,是一个回归的问题,因为我们的一个房屋的价格是数值的,预测我们的一个温度的走势,或者说交通拥堵的一种情况,这个呢其实它也是一个我们的一个回归的问题。
但是呢这个问题他其实更加就是说具体一点,它其实是我们的一个时间序列的问题对吧,time series时间序列,那么这一类问题呢,其实在我们的现在嗯,互联网公司的一个应用场景里面,或者说在很多的公司里面。
都是有着相关的一个应用场景的时间序列,或者说预测我们的道路上面是不是有行人,或者说识别我们道路上面的一些具体的行车辆,对吧,这个都是个非常典型的一个应用案例,那么这个地方。
为什么我们可以从场景来进行划分,也可以从案例来进行划分呢,我们现在的一些具体的一些机器学,习的一些算法,都是在一个具体的一个案例上面,或者说一个很典型的问题上面进行使用,我们现在各位同学去找工作呢。
就是肯定就是说不是啊,什么工作都找对吧,我们肯定是非常建议大家你去呃,知道你自己适合什么样的工作,或者喜欢什么样的工作,比如说这个用户预测用户是不是违约,比较典型的。
就在这种金融风控是金融风控的一些公司里面,比如说蚂蚁啊,蚂蚂蚁花呗,蚂蚁对吧,或者说这种融融360,这种就是说金融风控的一些公司,然后呢,如果你的一个岗位是做这种,用户违约的一个预算。
那么你就去需要好好学习一下这种违约算法的,一个具体的一些原理对吧,所以说这个呢,我们是非常建议你把这个具体的案例和,能够和你自身的一个知识点,以及具体的一个就业的一个方向,能够结合起来是最好的。
其次呢我们对于一个数据集呢,我们是可以根据我们的数据集的一个类型,来做一个划分的,我们现实生活中呢我们的这个数据科学对吧,数据科学,数据挖掘,或者说我们的这个机器学习,深度学习。
它的本质就是我们的一个数据,那么在这个地方,我们的数据它其实也是可以做划分的对吧,我们的数据有这种表格类型的结构化的数据,和我们这种半结构化的数据,JASON的或者说XML的这种半结构化的数据。
或者说我们这种非结构化的数据,就是我们的一个图片类型的,视频类型的文本类型的这种非结构化的数据,这些呢都是非常三类典型的我们的数据集对吧,那么我们的不同的数据呢,我们在做建模的时候。
其实我们也是各自存在不同的一个区别的,我们在现实生活中呢,其实嗯对于初学者而言,对于初学者而言,我们比较建议嗯,就是说是学习这种嗯表格类型的数据,表格类型的数据,表格类型的数据呢就是说它是呃。
就是说我们的一个具体的数据集呢,就是这种二维的,二维的这种形式进行展开,我们的行就是我们的一个具体的样本,我们列呢就是我们的具体一个字段,比如说我们给定一个表格,这个表格里面拥有的是某个学生。
他的一个具体的一个姓名,他的一个具体的一个嗯,就是额他的一个成绩啊等等的对吧,相当于是每行是一个学生的一个记录,每一列是他具体的一个字段,那么我们这这是表格类型的数据,为什么我们这个地方会把这个数据集。
讲的这么清楚呢,因为我们不同类型的数据集,其实我们在它适用的得到的一个算法,它也是不一样的,表格类型的数据呢它可能比较适合用的数模型,就是说比使用那种x g boost,或者嗯我们NH级BM。
这个我们在上上周呢,我们的有有我们的老师给大家讲对吧,然后呢如果是非结构化的数据,我们比较适合用,那什么我们非结构化的数据,比较适合用这种deep learning的深度学习的模型对吧。
所以说我们的一个具体的数据的类型,也决定了我们最终适合用什么样的一个,具体的算法,所以说呢,我们是需要对我们的一个具体的问题啊,他的领域嗯类型啊,以及它的具体的一个数据集啊,要好好的一个了解清楚。
其实呢我们在识别到这个问题之后呢,我们并不是说是有一个完从头到尾的这种解,解决的过程,我们的一个具体的一个从头到尾的一个,解决过程呢,是我们的一个嗯就是识别问题,理解数据嗯,数据预处理建模与评估。
这个相当于是我们的一个嗯完整的一个,从数据的一个理解,然后对数据的清洗建模,然后再到再到最终的部署和评估,这是完整的,但是呢在这个解决我们的问题的过程中呢,我们的一个具体的一个。
它并不是说是一个瀑布式的这种串行的,一个开发过程,它是中间呢会需要进行反复迭代,那么如我们PPT所示的,我们在进行迭代的过程中呢,我们可能在中途呢可能是需要返返回返攻的,对吧。
反攻的这个呢其实是嗯很常见的,我们写一个程序,并不是说是一下子就能写成功的,那么类似的我们训练一个模型呢,也不是说我们一下子就能训练完成的,不是的,我们在进行一个建模的过程中呢,我们可能很有可能。
在一拿到我们的数据集的之后,拿到数据集之后呢,你可能是从我们的数据集能够找到,对我们的问题更深次更深的一个理解,那么我们就回过头来,结合我们的原始的一个问题的背景,然后再去理解我们的数据。
或者说我们在建模的时候呢,我们发现我们的建模,它的一个模型的精度不太好,那么以此类推,我们也可以反推,是不是我们的一个具体在处理数据的时候,存在某种误差,或者说出了差错对吧,所以说在我们建模的过程中呢。
它不是一个瀑布式的这种端到端的过程,它其实是有这种循环的过程的,循环的过程的一直一直循环,或者说是中途任意一个节点都会都会反攻,那么一直一直循环,循环到什么时候,能一直到我们的一个最终的一个模型的。
一个精度和模型的一个预测速度,它达到我们的要求的时候,我们才停止迭代,好在我们的建模过程中呢,其实本质啊,就是说有很多同学可能之前没有做过这种,机器学习的一个实际的一个项目部署啊,或者项目开发。
其实这个在进行建模的过程中呢,你可能是可能会对这每个步骤,它所花花费的一个时间比较感兴趣对吧,这个地方我们在进行花费时间的时候呢,可能这一部分的一个时间只占10%,机器学习建模的部分占10%。
然后做数据处理的这部分时间呢,可能是占据70%的,因为我们的数据它可能是比较脏的,我们是需要做把它做一个聚合的,也需要从我们的数据集进行一个理解,然后做一个特征工程的。
所以说实际做一个模型训练和验证的过程,其实时间很短,大部分时间都在做一个数据处理和数据清洗,数据分析的过程中,在我们建模的过程中,我们关键的要做的是什么呢,关键要做的就是。
你首先要识别出我们的问题到底是什么,它是什么类型的,以及通过我们的这个具体的一个哦数据呢,你能不能够找到数据的一个分布的规律,这个分布的规律呢,就是说其实就是我们的原始的某个字段。
它内部的一个分布的规律,这个分布的规律,其实就是需要我们对这个字段进行一个分析啊,这个分析呢可能是要画一些图,画图呢我们是呃如果是类别字段和数值字段,我们各自适合画的图不一样,画完图之后呢。
我们可以找出它内在内在的一个分布规律,其次呢我们的一个具体的一个数据集呢,它每个字段和我们的一个标签,也是存在某种规律的,也就是假如我们是一个表格类型的一个数据,我们每行是我们的一个样本,我们有两列啊。
一列是我们的一个字段,字段A还有一列呢是我们的一个label,在这个地方呢,我们是可以进行一个分析分析进分析什么呢,我们是可以分析一下,我们的一个字段和我们的一个标签,它的一个具体的一个分布的规律。
或者说我们的一个具体的一个,它们之间是不是存在什么关系啊,这个都是可以通过我们的一个分析的过程,来得到的好,那么我们在进行建模的时候呢,B会是不是存在有关完整的,或者说完美的一个解决流程呢。
或者说完美的这种解题套解决过程呢,或者解决模就是说会不会存在完美的模型呢,其实是不存在的,因为我们不同的任务呢,它的一个具体的解决方法,和建模方法都是不一样的,我们并不能一概而论,特别的呢。
特别的呢就是说我们的具体的数据,不同的情况下,我们的建模方法是不同的,我们的一个具体的一个任务,不同的情况下,我们的建模它具体的任务也不同,那么这个地方,我们的数据和我们的具体的一个任务呢。
就决定了我们最终他到底是做什么以及如何做,在我们的机器学习的一些这个领域里面呢,我们常见的应用呢就是说你可以嗯,首先可以按照我们的数据集来做一个划分,我们数据集做一个划分呢,就是我们是嗯比如果是初学者。
比较推荐你去学结构化的一个数据,因为结构化的数据呢,它的一个数据集往往都比较小,也比较适合你去做人工的特征工程,那么结构化的数据集里面,就是说我们的这个数据呢,它是使用这种表格形式来进行一个。
存储和展示的,在这个结构化的数据集里面,我们常见的这种任务,由广告搜索的推荐催电系统,金融风控最优化问题以及匿名数据挖掘的问题,然后呢我们以此类推,还有一些其他的图像的,AARP的文本的语音的这个地方。
我们就给大家稍微讲一下图像,图像的呢就是我们的一个具体的数据集呢,它是以这个image的形式进行存在的,image我们也知道它其实就是一个文件对吧,我们的一个图片呢,它的一个不可能的一个文件。
可能图片尺寸有大有小,它不是一个规整的形式,它是一种非结构化的数据,那么对于我们的一个图像的领域呢,我们常见的任务有这种图像分类,物理检索我们的语义分割,超分辨率重建以及人脸识别,自带估计。
关键点检测等等的一些任务,这每类任务呢都是可以找到我们的,相应的工作岗位的啊,你去搜啊,直接在这种招聘网站上搜,都是可以找到的对应的一个岗位的,那么类似的在文本和语音里面。
我们也也是有着对应的一些特定的一个岗位,和特定的任务嗯,那么我们在进行学习的时候呢,就是说非常建议你嗯熟练掌握这其中一种,或者说两种是比较好的嗯,因为我们这个你不可能,就是说你把这个基础学完了。
然后再呃不去学这个具体的任务啊,这不太可能,因为我非常建议你去学完基础之后,然后去挑选其中的一两个具体的任务,然后进行一个深入学习啊,这样是比较适合你的,一个具体的一个职业发展的。
那么有同学可能就会问到老师,我怎么知道我选哪一个嗯,就是说是哪一种这个领域啊,或者哪一个具体的问题比较适合我,这个呢就是非常推荐你去把每一个这个地方,你可以把这个截个图啊。
或者说在我们的QQ群里面可以拿到我们的课件,然后呢你再去嗯嗯了解一下每个任务,它具体是在做什么,然后你就是可以找到你比较感兴趣的,一个愿望好,那么我们今天呢给大家在进行举例的时候呢。
都是以这个to sigma connect,这个租房热度预测的这个数据集给大家展开,给大家展开,这个数据集呢其实是一个K哥的一个比赛啊,说我是从K哥的一个具体的一个课程里面筛选,把它抽取得到的。
那么这个具体的一个数据集呢,他在他在做什么任务呢,它是需要我们使用这个租房的一个信息,对这个房屋的一个热度做一个预测,这个房屋的一个热度呢不是它的温度啊,这个房屋的热度呢相当于是它的一个受欢迎。
受欢迎的一个程度,就是说这个房屋它受欢迎的一个程度,我们是需要使用这个房屋,它的基础信息来预测它的一个热度,那么这个地方其实本质就是对我们的一个,房屋的热度进行一个分类对吧,那么我们的一个具体的数据呢。
它拥有了我们的房屋的信息,这个房屋的经纪人信息,房屋的地理位置信息,我们在做的时候呢,其实本质需要将这些具体的字段,做一个聚合的统计,所以说他的一个具体的操作过程呢,其实是需要做大量的一个统计啊。
这个to西格玛这个具体的数据集呢,它原始来源于KO的一个具体的比赛,他总共包含了十四十四个字段,分别涵盖了啊数值类型的类别,类型的文本类型的,日期类型的和图片类型的这些字段啊,然后呢通过这个数据集。
或者通过这场比赛呢,你可以完整的掌握到我们具体的数据挖掘的,各种技能嗯,它包含的一些具体的一些数据呢,我们在这些字段呢,我们待会也会展开给大家讲解啊,你不用担心,好,这个呢我们先给大家花了一点时间。
给大家讲完了我们的这个初始部分,我们如何对我们的数据集,以及我们的问题做一个抽象对吧,我们到底如何对它进行具体划分好,我们接下来呢就开开始,正式开始我们的第一部分额数据处理和分析,这个地方啊。
就是很多同学呢觉得算法工程师做一个他的算,很多同学可能觉得算法工程师的一个工作,主要是训练模型,其实不是的,算法工程师百分,我刚才也讲了,70%或者70%以上的时间呢,都是跟数据的一个处理相关的。
比如说数据的一个清洗,数据的一个查询,70%以上的时间都是在做直线,然后还有10%的时间可能才是建模,其实建模的时间其实是非常少的,因为我们现在的一个具体的机器学习的,这些库呢都非常完备的。
你只需要把我们的数据集把它处理好,那么接下来送到我们的具体的一个模型里面,就行了对吧,所以说我们在这个地方呢,很多时间都在做一个数据的清洗,数据的查询和数据的分析,那么在去西格玛。
这个租房热度预测的比赛里面呢,其实我们遇到的一个问题是什么,在render hop,render hop呢是纽约啊,纽约new york它的一个租房的一个网站,就相当。
相当于是我们国内的这种链家的网站一样,那么在这个网站上面呢,就是说很多的一些房客,他可以在上面找到他想要的房子,那么我们在这个网站上面呢,也有一些具体的一些嗯,房屋的一个信息呢会被张贴出来。
那么我们是需要预测一下这个房屋的一个热度,这个热度呢就是这个房子它受欢迎的一个程度,或者说他的点击率在这个地方呢,就是说我我们的一个具体的任务呢,是跟预测这个房屋的热度,预测完成之后,我们能够做什么呢。
我们这个得到的一个模型呢,可以更好的去分析一下我们哪些房子,它可能是更加受欢迎的对吧,也可以对我们的这个租房的信息来进行控制,比如说嗯,我既然能够识别出我们的一个房屋的热度,那么我们可以将这个嗯。
比较受欢迎的一个房屋呢,它它均均匀的一个采样的采样进行发布对吧,不要一下子发布很多的一些比较受欢迎的房子,对吧,让它均均匀的就相当于是有一个等待一段时间,然后再发布。
或者说呢我们通过这个房屋的一个热度的预测,模型呢,也可以帮助我们的一个业主和中介,请理解我们的租客的一个偏需求偏好啊,这个呢其实是也是非常有帮助的,他的去这个地方呢,我们的去西格玛呢这个具体的一个问题。
他的评分方法呢它是用log loss来做一个评价的,他的一个具体的问题呢其实是一个分类问题啊,我们的一个热度呢就是分为我们的三个,我们的一个就是三类啊,high media和low3类。
我们接下来做一个具体的一个预测的时候呢,我们是需要预测得到,我们的一个具体的一个房屋,它是属到底属属于某一个类别,然后这个地方呢,我们其实本质是需要识别出我们的一个,它每个类别对应的概率值啊。
这个地方相当于是这一行,它的概率值相加得到等于一啊,那么这个地方呢我们嗯在进行评价的时候呢,是用我们的一个logo loss来做一个评价,好我们在这个原始数据集里面呢,其实它包含的信息还是蛮多的。
我们的一个有一个train jason和test jason,这是我们的一个原始的一个数据集,然后呢这样他还给了一个嗯image sample,点zip这个文件,这个文件里面呢就是我们的一个嗯。
就是说所包含的一些呃房屋的一个照片,这个呢就是我们的一个具体的一个嗯,房屋的一个照片的文件夹,相当于是我们在这个数据集里面,我们还给定了这个房屋的一些具体的照片信息,当然这个照片信息呢。
它就是一个非常典型的这种非结构化的数据啊,我们就可以把它利用起来,在我们讲解完这个具体的一个问题背景之后呢,那么我们接下来就可以思考一下,我们的具体的一个sin题,它到底是一个什么样的问题对吧。
首先他这肯定是一个有监督的一个问题,因为我们是有训练集,以及我们有测试集的对吧,这个地方有监督的这个问题其实很好识别,我们是有训练集的,也有测试集的,然后在训练集里面呢,我们是有这个具体的标签的好。
那么在有监督问题里面呢,它其实是一个分类问题,分类问题对吧,我们的具体的标签呢是分三类的,它是一个分类问题,然后呢是分三类的,就也就是说它是一个多分类问题好,那么这是一个问题的建模以及问题的一个抽象。
然后接下来呢,就是说我们是需要提前做一个思考的,就是说我们在做一个建模的时候呢,你首先要对我们的一个问题背景进行一个理解,然后接下来就是可以对我们的一个,具体的一个标签做一个假设。
也就是说你可以自己思考一下,我们的一个房屋的一个信息,是如何影响到它的一个热度的呢,或者说一个房屋的一个信息,如何影响到他的一个具体的受欢迎的程度的呢,有没有同学想回答一下对吧。
我们的一个具体建模的时候呢,你是就是说是需要这样思考的,类似于这样思考什么去影响到我们的标签,以及我们的标签和什么相关,有没有同学想回答一下的,就是说我们在做一个租房的时候,什么样的房子。
它的一个具体的受欢迎的程度是比较高的呢,对,因为同学讲回答的,那么这个地方呢,就是说如果大家有这个租房的一个呃,就是说曾经租过房子啊,或者说有这种租房的一个经验的话。
可能就知道什么样的房子他比较受欢迎的,首先呢它的价格比别人低的对吧,相同条件下面这个价格比别人低的,肯定比较受欢迎对吧,其次呢这个房子他的一个位置对吧,房子肯定他的一个位置信息位置比较好的。
那么他肯定也是可能比较受欢迎的对吧,然后呢这个房子它内部有什么家具对吧,这个呢也是呃就是说这种配套的一个信息啊,也是会影响到他是不是受欢迎的,所以说呢在我们建模的时候呢,你首先可以从这个角度来进行思考。
就是说我们的一个标签,它是它是如何进行一个就是说什么样的数据寻,它可以影响到我们的标签,其次呢我们还可以思考,就是说什么是我们的标签,我们的标签是如何进行定义的,这个其实也是非常关键的。
你的一个标签它到底是这个热度,到底是怎么定义的呢,你可以把它定义为这个房子,它的一个嗯在我们的网站上面被查询的次数,或者说这房子在我们的网站上面,它被点击的一个次数都是可以的对吧。
这个相当于是他被就是说这种受欢迎的,一个程度对吧,就可以视为一个热,那么我们在做一个建模的时候呢,首先可以对我们的具体的一个标签做一个理解,其次去思考一下我们的一个具体的标签。
它是如何受到我们的数据集所影响的,在我们的这个问题里面呢,我们拥有的这个具体的数据呢是这些啊,我们分别是bathroom,bedroom啊,B2dd created啊,description啊。
这些字段我们一个一个来看,bathroom呢,就是我们的具体的一个相当于是梳妆台,或者说这种洗手间的个数啊,厕所的个数,然后呢我们bedroom呢它是这个卧室的卧室,这个呢我们在这个地方其实都标示好了。
具体的一个字段的类型的啊,这个地方其实需要注意的啊,我们在进行一个建模的时候呢,其实是非常建议你把每个字段的一个,具体的一个类型给它清楚地标识出来,然后如果能够理解嗯,或者说翻译这个字段的一个哈。
它的一个含义的话呢,也可以把它那个字段的含义给它记录下来,这样呢其实是非常非常有助于你对数据集进行,一个理解的啊,然后呢我们还有个这个B0DB20id呢,它其实是一个类别类型的。
就是这个建筑物的一个id,因为我们的一个具体的一个建筑物呢,相当于是我们的到底是哪一哪一号楼对吧,这个地方你可以理解就是一个楼的一个编号,或者说我们的门牌号,然后呢还有一个created。
就是我们的这个房屋,它的一个信息被张贴的一个时间,然后description呢就是一个文本类型的,就是说这个房屋的一个描述信息,它的一个我们在做张贴一个房子的时候呢。
就是房东或者中介会用一段话去描述一下,这个具体的一个房子,他到底是什么样的一个类型,以及它的一些具体的一些描述对吧,比如说我们的房子它坐北朝南,有电梯,怎么怎么样对吧,用一个文字来做描述。
然后呢diss display address呢,就是说这个访问它的具体的地理位置,所展示的地理位置,然后还有一个features,这个features呢它是一个列表类型的。
就是说它其实是将一些具体的一些特点,这个地方呢有点像这种中文里面叫叫这个打tag,打个标签,比如说呃这个房子有电梯呃,什么什么,就是说有电梯呃,有门铃对吧,然后哦不要不要物业费对吧。
相当于是用一个个的一些具体一些tag,去描述这个房屋,然后还有一个我们后面的是个listing id,这个呢就是一个主线id,就是说我们的这个具体的房,这每这个张贴的房子的一个唯一的标识,就是主建。
然后我们的NETITUDE和longitude呢,就是我们的具体的一个房子,它的一个具体的经纬度,然后manager id呢就是说是这个房屋的中介,他的一个信息也是类别类型的中介id。
然后photos呢是这个图片类型的,就是这个房屋的照片,price呢就是这个数值类型的,是这个房屋的一个具体价格,房屋的一个具体价格,然后这个photos呢就是我们的一个具体的一个。
房屋的一个具体的照片,price呢就是它的一个具体的一个我们的一个价格,然后street straight address呢这个街道信息,然后interest level呢就是我们的具体的一个标签。
我们具体的一个标签,那么这个就是我们的一个具体的数据集啊,他就是长这样的啊,长成这样的,那么我们这个地方,其实是把每个具体一个字段呢,给大家解释了一下,那么我们来看一看我们的原始的一个数据集啊。
它就长这样的,我们的每个具体的一个嗯,这个数据集,每个阶段我们的bathroom有1。5个诶,为什么有1。5,为什么有1。5个,这个地方呢其实是这样的啊,我们厕所是1。5个的话。
就是有可能是这个厕所呢是有公用的,或者说有的厕所呢只能是用来嗯,相当于是呃这种洗手的啊,就相当于是这种呃共用的厕手,或者说是嗯对半,这种厕所都是都是有的啊,因为我们租房的话,这是很常见的。
然后我们的卧室个数呢一般是整数的,然后我们变0id对吧,这种id类型的这个这个其实是一个字符串,这个其实是一个字符串,但是呢其实它也是一个类别类型的好嗯,created是我们的时间对吧。
然后这个地方的features是我们的一个list,好,然后呢,如果各位同学就是说想对我们的一个,就是说我们的一个就是具具体数据集,想要进行深入的理解呢,我们的一个具体的一个额数据集也给了大家啊。
然后你可以自己一下去看好,我们在做一个数据集的一个理解的话呢,就是说我们首先嗯,也可以从我们的具体的统计值做一个判断,我们这个地方呢,就是说我们在做一个数据的一个处,理和分析的时候呢。
我们是非常建议你从一个整体的一个分布的角,度做一个啊统计以及做一个分析啊,因为我们在一个具体的一个,对于我们的具体的数据集,它基本上就是一个行列的一个形式,这个地方我们的一个列呢。
就是我们的一个具体的一个字段信息,比如说这个房屋所有房子的一个bedroom,或者说它的bathroom的一个信息,我们对于这个字段我们是可以做一个统计的,就是说可以得到它整体的一个分布。
或者说得到它整体的一个规律,得到了这个规律之后呢,我们可就可以用这个统计的一个信息,去对我们这个字段进行描述,这个地方呢就是说我们在做一嗯,在数数理统计或者概率论里面。
我们是可以学习到一些具体的一个数值分布,随机分布的一些嗯,就是说常见分布的一个呃一些情况对吧,我们有这种均匀分布,被阻力分布,我们波动分布等等,那么这个地方我们的不同分布。
其实它都是可以做一个相互转换的,对吧好,那么这个呢我们就不做展开讲,因为这个其实不是我们的重点啊,我们其实就想给大家就是说说清楚,我们具体的数据集呢,我们其实是仍然建议将这一个字段,把它单独拿出来。
然后做一个具体的统计,我们在做一个具体统计的时候呢,我们经常会做这样一个统计,就是说99%的一个数据,他是怎么样的,或者说99%的同学,他的一个成绩是怎么样的,或者说我们就是说你的一个成绩。
已经进入了前1%,这个地方的一个99%和1%,他在说什么呢,其实它本质就是在说一个具体的一个嗯,分位点的一个信息,或者说是一个统计的一个分位量,在这个地方就是说你的一个具体的一个统计值。
99%的数据都处于某个范围,或者说你的一个具体的一个数,它的一个字段,它的一个你是不是位于在某个范围内,这个地方呢,我们常见的这个百分比啊,就是这种分位点的一个含义啊。
当然我们也可以做这样一个具体的一个处理,就是说我们可以统计我们的,25%的分位点,50%的分位点,这个50%的分位点,就叫我们的中位数对吧,然后我们的75%的分位点,然后就是说把某一列单独拿出来。
计算这个我们的三个分位点,然后计算完成计算这个分位点之后,然后做什么呢,我们可以得到一个IQR,I q2,其实它是等于我们的Q3减去我们的Q1,就是我们75%的分位点的一个,数值取值。
然后减去25%的分位点的一个取值,得到我们的IQ2,然后通过我们的一个IQR,可以得到一个具体的一个上界和下界,这个地方其实是这样的啊,我们的一个具体就是这样的,我们的一个上界呢就是我们的一个Q3。
加上1。5乘以IQ2,Q1呃,我们的下界呢就是Q1-1。5,1。5乘以IQ2,这就是我们的上下界,这个上下键可以用来做什么呢,我们的这个上下键可以用来做一个缺额,我们的一个离群点的一个判断。
也就是我们通过这样的一个计算,得到我们的上下界之后呢,我们的这个范围内的一个数据,就是我们认为它是合理的分布的,然后在这个范围内之外,比如说小于我们的下界,或者大于我们的上界的数据。
我们就认为是我们的一个离群点,离群点,那么我们就可以通过这个统计的方法来识别,得到我们离群点,那么这个镶嵌图它还可以用来做什么呢,它还可以用来做,就是说得到我们的具体的一个数据,它是嗯怎么分布的。
因为这个地方我们有三个分位点啊,这个相线图在这个英文名字里面叫这个box,PTS对吧,箱线图它为什么叫相线图,其实就有有点像那种拉杆箱的样子,我们这个地方的25%的一个位置。
和50%的位置以及75%的位置,那么我们如果这三者分布的一个位置,不一样的话,我们得到的就是它原始的一个曲线性,原始哪个分布就是不一样的,对吧,假如说我们的具体的一个,中间的一个最核心的一个箱子。
他的100我们的中位数不一样,中位数的位置不一样对吧,那么其实我们得到的一个取原始的分布的,形态也是不一样的,这个相当于是我们的具体的一取值,我们从25%到50%的,25%的一个。
相当于是整体数据及25%的一个分布,都是位于在这个取值的范围内,就是说在这个范围内,如果这样呢,相当于是均等的,相当于是整体的一个分布是比较均衡的,就是类似于这种正态分布的,没有没有左偏。
那么如果是这种形态呢,就是有点像我们的右偏,也就是说我们的这一部分的一个数据集,它是分布的一个比较密集的对吧,相当于是一种右屏的状态,所以说呢我们通过镶嵌图呢,是可以一方面可以识别出我们的数据集。
它的是不是有离群点,另一方面呢也可以得到我们的具体的一个,数据的原始的一个分布的形态啊,那么对于我们的数据集,我们如果是想要做一个分析,我们怎么做呢,就是非常简单啊,做一个数据分析其实都是非常简单。
我们可以分析一下我们的具体的每个字段,它的一个出现的一个次数,就是我们选择得到某一列,然后算一算某一列,它具体的一个整体的分布的一个规律,比如说我们画一个bedroom的一个count pose。
就是我们画一个出现次数的一个统计的一个嗯,柱状图,我们bedrooms为零的一个房,房子有多少个,bedrooms是唯一的一个房子多少个,以此类推,这个地方呢,我们你可以画这个具体的一个直方图啊。
或者柱状图,当然也可以通过我们的一个pandas里面的,describe函数来做一个描述性的一个分析,pandas的一个describe函数呢,就是嗯可以可以很方便的计算得到某个字段。
它的一个具体的分位点的一个情况,它的一个最大值最小值25%分位点,50%分位点以及75%分位点,各自的一个取值啊,各自的一个取值,那么类似的我们也可以看一看我们的bathroom。
他的一个具体的一个嗯就是的分布的情况,在我们的bathroom,取值为一和取值为二的房子是最多的对吧,其他的就是1。52。5,3。5,4。5的房子都是比较少的,那么我们对于我们的具体的一个可视化呢。
我们也可以对我们的一个数值类型的,比如说我们的一个经纬度NTITUDE,和我们的NTITUDE做一个具体的一个可视化,那么我们这个地方是对NTU做一个可视化,这个地方其实它绘制得到的是一个密度直方图。
在英文缩写里面叫KDE,相当于是我们的一个color density的呃,我们的一个嗯就是图对吧,相当于是一个密度直方图,在这个图里面呢,其实它本质绘制得到的一个形态呢。
跟我们的这种柱状图其实是差不多的,只不过这个地方我们的一个柱状图呢,它其它的一个具体的一个,这个类别的一个取值空间,它的一个相当于是取值空间比较小,类别取值空间比较小,如果是这种数值的话呢。
我们是数值的,它的一个类别取值空间就比较大,因为我们的数值,它的一个就是相当于是它可以分的比较离散,对吧,那么这个地方我们可以发现,在这个我们的这个经纬度的绘制,得到的密度直方图里面有一些位置。
它的一个房屋它可能是比较集中的对吧,在这些位置,那么在这些位置里面,就表明我们的这个有可能我们的一个房子呢,它可能是处于集中在某些位置,集中在某些位置对吧,好我们的NTITUDE和longitude。
我们可以对于数值类型的,我们可以画一个密度的密度直方图,那么类似的啊,我们对于我们的这种嗯price price呢是我们的价格,我们也可以绘制这种图图形,就是我们的这种密密度直方图,价格呢。
它就是我们的一个,相当于是跟我们的一个金钱相关的对吧,跟金钱相关的这个呢其实是这样的啊,我们的现实生活中呢,就是他有点像这种20%的人呢,掌握80%的财富,这是2080的一个原则。
或者说20%的一个房子,他都是就是说哦,80%的房子,都是在20%的一个价格区间内,它都是我们的一个这种分布啊,都是严重的左偏的,我们的价格啊,它是这种只要跟金钱相关的,它往往都是左偏的。
而且都是跟我们的2080,这种原则是匹配的啊,也就是说20%的,80%的房子,都位于20%的一个价格区间内好,那么这个地方呢就是说我们的一个价格,其实跟所有跟金钱相关的字段,它的往往都是左偏的。
那么这个左偏的呢,就是说我们如果遇到一个字段,它是跟金额相关的,而且是左偏的呢,我们是可以把它做一个处理的,我们怎么做一个处理呢,比如说我们把它做一个取log,这个就是一个很好的处理。
相当于是去除他的一个偏态的这种效果,把它尽可能转为正态分布,因为我们也知道啊,在做一个具体建模的时候,如果这个字段它是正态分布的,那么我们很容易得到这个它的一个模型的一个,无偏估计对吧。
如果我们的数据集,它的一个具体的字段是这种非正态的,那么我们得到的一个模型,就很难去得到它的一个参数的无偏估计,那么我们接下来看一下我们的BI0id,bi0D呢,就是说这个具体的一个建筑物的编号。
建筑物的编号呢其实它是一个字符串类型的,相当于是一个嗯,我们把这个具体的一个房屋的一个信息,把它进行编码的字符串,这个地方呢我们把它做一个统计的时候呢,他其实这个取值空间是蛮大的,因为这个地方。
其实他虽然说是一个类别类型的字段,但是呢这个地方的类别类似于字段呢,它是加有id这种成分,在这里面id是什么,Id,就是用来标示某一个具体的一个他的一个身份,对吧,等于身份证号。
你之后看到的跟我们的这个id相关的字段,它往往的取值空间都非常大,虽然说他是一个类别字段,它的但它的取值空间是非常大的,那么我们在做一个具体的一个统计的时候呢,我们就可以统计一下。
这个地方就不建议画这个密,我们的一个柱状图啊,因为他的一个取值空间非常大啊,所以说画出来也并不是特别好看,你在做这个地方呢,我们可以统计一下它的一个具体的一个value counts。
就是他的一个次数啊,做一个统计就行了,我们可以看一下,我们BIDID取值为零的情况下,有八千二百六十八十六套房子,这个呢其实我们很清楚的,可以看到这个地方的零,其他的一些变量I1键都是这种等长的字符串。
这个说明什么呢,这个地方的零它就是一个去我们的一个缺失值,缺失值我们的一个Missing value,或者说是一个默认值,天天是我们这个地方是没有填这个变量id的,某个房子是没有填这个变量id的。
这个地方呢,就是说我们通过一个数据分析,是能够找到某个字段,它到底是就是说有没有缺失值,有没有这种具体的一个额分布的情况呢,然后呢我们对这created,这个created就是我们的一个日期类型的。
时间跟时间相关的,如果是跟时间相关的呢,我们就可以绘制类似于这种图像,我们的X轴是我们的日时期,Y轴,就是说在这一天他所发布的一个房屋的一个,具体的一个个数对吧,也是类似于这种柱状图的这种形态。
那么我们可以看出我们的具体的这种房屋,它所发布的一个时间有点儿其实有规律的啊,对吧,是有规律的,那么这个呢其实是一周一周的波动,那么类似的呢,我们如果是遇到了这种文本类型的数据呢。
我们是可以这个与文本类型的数据呢,我们是可以做一个云图,Wordcloud,云图,云图的含义呢,就是说我们的一个具体的一个在绘制的时候呢,如果这个文章里面这个单词出现的次数越多。
那么它的它的一个字体就越大,就是这个意思,没有其他意思,云图其实很多同学都知道,我们这个地方呢,通过云图,我们就知道,大部分的房子呢可能是位于这些wall street啊。
或者BDVA这些对应的一个位置对吧,那么我们也可以对我们的一个display address啊,做一个统计,这个地方呢display address呢,其实他也是这种字符串类型的。
那么对于这种字符串类型的呢,我们也可以做一个统计得到的统计,得到一个统计值啊,然后做一个可视化,比如说我们的一个具体的一个,做这样一个可视化,就是说我们的一个具体的一个嗯房子,如果它出现了一次。
他就是说对应的一个地址,类似于就是说只出现了一次的这样的地址的,一个房子,他拥有多少个对吧,其实这也是一个非常非常典型的一个,左偏的一个分布,也就是说我们大部分的房子呢。
它的一个出现地址啊都是比较独立的,都是比较独立的好,那么我们来看一看这个features,features呢就是一个list类型的,对于这种历史类型的呢,我们可以统计一下这个房子。
相当于是它是这个它的含义,就是这个房子的一个特点对吧卖点,那么这个卖点呢你就是我们的一个tag,那么我们可以这个地方呢可以统计一下,这个features是它具体的个数,大部分的房子的一个特点的个数。
就是他的tag个数是在00~0到六之间的对吧,然后呢大于六的也有,那么对于我们的这个features呢,我们也可以画一个云图来看一看,大部分的一个tag呢,就是说可以dog dogs aloud。
可以养狗对吧,elevator我们有电梯的,Door man,有门铃的对吧,然后我们还有这种什么可以养猫的,有健身房的等等等等对吧,这个就是我们的features。
然后这个地方我们有个manager id,manager id啊,这个地方就是一个中介的id啊,也是一个非常规整的一个字符串的类型的,那么我们接下来就是我们,其实刚才是将我们的这些字段。
大致给大家讲了一下,然后我现在问大家一个问题,就是说,如果大家通过我们的具体的数据集的一个理解,你会认为哪些字段对我们的具体的一个房屋的,一个热度是非常非常相关的呢,也就是我们给大家讲的。
这些具体的一些字段之后,你会认为哪些字段,会影响到我们的一个具体的房屋的热度呢。
也就会影响到我们的标签呢,对有没有同学想回答的,对呃soft的同学以及莫西莫辛同学,以及两位手机用户同学,有没有想回答的,如果你看了之后,看了我刚才给大家讲的这些字段之后,你有没有觉得。
哪些字段可能会跟我们的一些标签有相关呢,有没有同学想回答的,那么这个地方呢就是说我们刚才也讲了,在讲这个数据集之前,肯定我们的这个价格位置对吧,都跟我们的一个具体的一个呃,房屋的一个标签是相关的。
其次呢还有可能跟我们的标签强强相关的,是我们的这个B20id,以及我们的manager id,这个BADID,这个BDD呢和manager id都是这种id类型的,id类型的呢。
其实他都是很有可能跟我们的标签强相关的,比如说某个中介,他发布的房子都是比较优质的房子对吧,那么这个地方可能他的一个房子的一个,热度都比较高是吧,好那么我们就继续,那么我们在做完具体的一个可视化之后呢。
有可能有同学就觉得,可视化是不是就是我们刚才所说的这么简单啊,其实可视化并不是说是这么简单的,我们先给大家讲一讲这个可视化,可视化呢这个地方其实在Python环境下呢,也有非常多的一些具体的库啊。
我们可以很方便的可以进行使用,比如我个人比较喜欢的就是这个con这个库,con这个库呢它是基于matt plot lib的,然后可以很方便的用来绘制这种,就是说我们的这种数据的一个分布的。
这种可视化的图形,他在做一个画图的时候呢,我们在做一个画图的时候,其实你可能第一次看这个图觉得很难看懂,其实我们一步一步可以把它剖析一下,我们这个图呢其实它包含了三个字段。
X轴Y轴以及我们的这个clue,这相当于是smoker它的具体取值,那么这个地方我们在看图的时候,首先看一下我们的X轴,X轴是我们什么,我们X轴是对我们的一个day,做一个分类的情况下。
然后Y轴是我们的total b啊,具体的一个取值,然后这个地方呢,其实他还做了一个具体的一个分类,也就是说我们的day取值为我们的TUESDAY的情况下,我们我们的smoker取值为yes。
或者说取值为low对应的样本,然后呢我们在这个取值不同的情况下,我们在对我们的total b啊,绘制一个得到一个象限图对吧,那么我们在做一个具体的画图的时候,或者说看这个图形的时候。
你要弄清楚这个具体的画图,或者说图形里面它到底包含了多少个元素,这个其实是非常关键的啊,非常关键好这个呢我们的这个box blox呢,它其实在做绘制的时候,其实是不单纯的对一个字段进行绘画图啊。
相当于是这个地方哦,我们是使用两个字段进行分组之后,然后分别绘制得到了我们的一个象限图对吧,然后类似的啊,然后类似的我们再给大家找一个啊,嗯这个地方对,小提琴图也非常典型。
对我们的day和我们的一个smoker进行分组之后,然后绘制得到这种分布,这个分布呢它非常像一个小提琴,他是这种竖竖着的一个分布,然后这个分布这一部分。
这一部分是我们的day取值为TUESDAY的情况下,smoker取值为yes的情况下,我们的toto be要整体的一个分布,然后这部分呢就是我们的一个day取值为TUESDAY。
smoker取值为NO的情况下,我们toto bi的一个整体的一个分布,它其实是嗯,相当于是也是一种对两个字段进行分组的,情况下,然后再去看一个具体的数值的一个分布的情况,它比这个镶嵌图呢。
可能嗯就是说更加直观一些啊,但是呢这种小梯形图呢,它不能看出我们具体的一个数据,它有没有离心点啊,他其实是看只能看到这整体的分布的情况好,那么类似的啊,在simple的库里面呢。
其实有非常非常多的一些画图的函数,都可以就是很方便的用来做一个画画图啊,那么这个地方呢其实是有很多的一些库用,都可以用来做画图的,比较典型的就是说如果是学Python的话。
最最嗯就是基础的画图的库呢是这个MATTPLEAP,它是最为底层的我们的画图的库啊,最为底层的画图的库好,然后呢如果是基于Macbook lip呢,就是由这个我们刚才所讲的这个CBSBL呢。
这个库是基于match prolip进行二次开发的一个库,然后可以快速的绘制,得到我们的这些很漂亮的一个图标,也就是说我们他其实是调用这个match pch lib,做一个画图啊。
所以说它是一个高层的一个啊组件,然后呢还有一些其他的库啊,比如说这个我们的PLOTLINE,或者说我们的BOKEH嗯,这些库呢都是比较高阶的库,它可以嗯跟我们的浏览器啊进行集成啊。
然后做这种可就是说这种叫带有交互式的图啊,都是非常非常方便的,还有一些呢,就是我们对我们的具体的一些地理位置,做可视化的图嗯,比如我们的这个地方,FOAIUM都是这些图啊,都是可以嗯。
相当于是不同的数据类型,我们做不同的可视化好,然后还有一些对我们的缺失值,做一个可视化的啊,我们在之后的课程也会给大家讲的好,那么这个地方呢,就是说有很多同学在学了这些画图之后呢,就可能是会觉得迷糊。
或者觉得我第一次接触,你给我讲这么多图干什么,其实这个地方是这样的啊,我们的本质的可视化呢,就是在于我们如何是用一种一种图,或者合适的图,对我们的一个字段做出一个具体的一个可视化,做出个统计。
比如说我们想要对一个具体的一个数值,做一个可视化的话,其实我们是可以画出它的一个柱状图的对吧,一个数值在不同分组的情况下,它去写一个可能分布的情况,或者说你不画这个柱状图,你就画这种密度图。
其实本质是一样的,就是它展示的一个形形态啊,以及具体的一个形状是不一样的,类似的你可以画这种我们的累计分布图,现在有点像我们的一个CDF对吧,从我们的一个相当于是,小于我们的180的一个数数据。
它大部分就是它的比例是在0。05对吧,接近0。05,然后呢,小于190的数据呢,是在0。2 20%的比例,然后一步一步增加到一,这种相当于是画会值得到我们的一个CDF对吧,我们在概率里面的CDF。
就是说我们的数数据它整体是如何进行分布的,然后呢我们也可以绘制得到这种散点图,绘制得到散点图图之后呢,我们可以散点图,它是二维的对吧,我们可以绘制的它它绘制到它单维的。
相当于是它的边缘分布的密度直方图对吧,这个都是非常常见的一些画图方法,通过这些画图方法呢,我们就可以将我们的具体的一个数值,以及相关的资料呢,把它进行用合理的方法给他展示出来。
好额那么我们休息56分钟好不好,我们休息56分钟,然后继续我们休息到这个9。02,然后我们回来好不好,然后我们休息一下好,然后大家如果有什么问题的话呢,你可以在我们的一个聊天框里面打字,让我知道啊。
好我们休稍微休息几分钟好不好,好嗯然后我们准备回来额,然后各位同学对我们刚才所讲的内容,有什么问题吗,我看大家都比较沉默啊,如果大家有什么问题的话,也欢迎提问啊,因为嗯你有问题的话。
可能学的会更靠更快一些,不然如果你没有问题的话,相当于是嗯我相信呢可能你没有问题,但是呢如果你真的有问题的话,那可能就是第一时间提出来的效果会更好一些,对好,那么我们就继续好不好好,我们继续啊。
嗯然后呢,我们接下来看一看我们的一个特征,工程与实践啊,我们在做一个具体的一个嗯,具体的建模的时候呢,我们在进行具体建模的时候,其实我们是给到我们的一个数据,我们是需要构建一个具体的一个模型对吧。
那么这个具体的一个数据呢,其实我们的一个数据,它可能的一个类型呢是多种多样的,我们在这里面呢,其实我们是首先来看一看第一种数据类型,是类别类型的,类别类型的呢,就是说我们其实它是一个嗯非常常见的。
我们的数据的一个类型啊,就是说我们的数据字段它是这种类比特征嗯,比如我们常见的这种个人信息,性别,城市省份,民族户口类型,这个里面都是我们的具体的一些呃,类别类别的人,然后我们的颜色对吧。
颜色里面的取值有红色,白色等等等等,国家里面有具体的取值,中国美国对吧,然后我们的动物这个地方呢,其实我们需要注意,就是说我们的类别,它有一个具体的取值空间,这个取值空间呢就是它具体的一个。
就是说这个类别它能够取值的这个字符串,相当于是这个类别是一个sage这个集合,这个取值空间呢就是它的一个具体的一个元素,类别特征呢是我们在做数据处理的时候,在我们在做建模的时候。
任何特征任何时候都要做处理的一个数据,因为类别特征它往往都是这种字符串类型的,我们对一个具体机器学习模型啊,它是只能接受这种数值类型的一个计算,我们可以回想一下我们的线性模型,我们神经网络对吧。
其实它本质只能接受我们的一个数字类型的,一个数据,所以说类别类型呢,数据呢我们在做处理的时候呢,我们肯定是要把它做一个编码的好,另一类型的数据呢,它的一个具体的一个取值空间,它有大有小,对吧有大有小。
如果是小,我们都是就是说这个没什么问题,如果是比较大的话,就有可能有问题,这个地方的大呢,就是说如果一个类别它的取值是100,取值空间是一百一千一万对吧,也就是说取值具体的取值的可能性越来越大。
我们这个地方呢取值的可能性越大,并不并不一定是他的缺点啊,就是它原始数据集就是这样的,我们再做一个具体的这个取值,就是说我们在做一个具体类别,类型的编码的时候,如果这个取值空间非常大的话。
因为他这个特征呢我们叫做高基数特征,对于这类特征呢,我们如果做处理的话呢,我们就非常容易出现离散的一个数据,离散的数据就是说他是一个稀疏的啊,会把它处理成这种稀疏的高纬的一种情况。
而且对于我们的一个类别类型的这个字段呢,我们是很难对它进行一个缺失值填充的,如果他是有这个缺失值的话,我们是很难对它做一个填充的,因为这个比如我们某个学生,它的一个具体的一个性别作,有的也就是是缺失的。
那么如果是性别是缺失的话呢,我们是很难对它做一个填充的对吧,因为我们填充的话,其实很容易就把它填充错误了,在我们的类别类型的里面呢,我们是有这两类,一类是我们的一个无序类别,一类是有序类别。
无序的呢就是我们的具体的一个取值,它的一个次序它是没有这种大小之分的,也没有这种就是说这种关系啊,就相当于是相互平等的,如果是有序的类别,就相当于它的具体的取值是有这种大小关系的,你觉得他的取决于这种。
相当于是比如说这种情感强弱,或者说这种我们的一个得分的情况对吧,嗯是我们的硕士本科硕士博士对吧,对,具体的一个学历的一个从低到高对吧,还是有序的,那么我们在做一个具体的一个编码的时候呢。
我们这个地方是给大家讲一些比较基础的啊,先给大家讲一些比较基础的编码,我们首先呢给大家创建了一个data frame,这个data frame呢就是一个我包含了这个学生的id。
学生的一个国家education教育信息,以及我们的一个目标编码,这个target就是我们的啊,这个target就是我们的目标啊,应该是我们的一个标签,其他的列就是我们的一个具体的一个。
学生的一个基础信息,然后我们就用这个表格来完成,我们的具体的一个类别特征的一个编码,对于我们类别特征的编码其实是有非常多的啊,这些具体的编码方法的,那么我们只挑选里面非常典型的给大家讲啊。
其他的呢我们其实用到的场景会很少,首先呢我们来看到看到的是这个one one hot,完后程呢它又称作叫做独热编码,独热编码就是我们对这个具体的一个嗯,一个取值。
把它转成这种one or k is hot的这种形式,这个K呢就是我们的具体的一个类别,它的一个取值的个数,取出空间的大小,比如说我们这个地方的education,对于education这一列。
我们就对它进行编码的话,如果它原始的话是有三个取值的话,我们对它进行编码之后,我们的这一这一列就把把它转成了一个三列的,这种情况,三列,那么玩hot呢。
这个地方它原始的这个学生他是一个master education,是等于master的,那么这个地方我们在做one hot之后,他就转变成了一个1×3的这一个,行向量的吧,我们相当于是增加了三列。
然后在这一列把它复制为一其他位置复制为零,那么类似的其他学生的一个信息呢,也是在某一个位置是一其他的位置是零,one hoch这种形式呢,它是相当于是把我们的一个原始的一个字段,把它展开了展开了。
相当于是每一列,每个取值做的这种二进制的编码完,或者呢比较适合用在这种线性模型里面,它比较适合用在这种无序的类别,做一个编码的时候,因为我们在做完one horse之后,我们的一个类别的取值的一个大小。
仍然是相互平等的,比如说我们这个地方,00010001和100,这是我们的本科硕士博士,他具体在做编码之后转得到的向量,那么他之间的距离仍然是相互平等的,相同的对吧,仍然是保持着这个无序的王后合成呢。
它的一个优点,就是说他在做编码的时候是非常简单的,是能够直接将我们的类一个类别特征,进行有效编码的,但是呢它的缺点就是说,它很容易导致我们的一个维度会爆炸,假如说我们这个字段。
它的一个取值空间是100的话,我们做完完后之后,这个维度就增直接增加了100,然后呢再增加一维度,增加的同时呢,我们的具体的一个数据集呢,也会变得非常稀疏对吧,这个地方相当于是三列里面。
只有相当于是1/3的数据是非非空的,如果这个具体的取值是取值空间,非常更大的情况下,我们的这个系数性会更加稀疏,我们在这个具体实现的时候呢,我们可以从pandas的get damain函数。
或者说从SKN的one hot encoder,来做我们的一个具体的一个编码,就是one hot编码,第二类呢是我们的label encoding,Label encoding,就我们标签编码。
标签编码呢它是将我们的一个具体的一个类别,把它用一个独立的一个数值id做一个转换,这个地方呢就是说我们把这个具体的country china,编码为零,USA编码为一,UK编码为二,JPM编码为三。
以此类推,他呢他那个方法呢,就是说我们的一个具体的一个操作呢,Nel encoding level encoding,原始的具体的一个应用场景,就是对labor做的,就是对我们的一个标签做的。
这个地方呢我们的label label coding呢,它也可以对我们的一个字段做一个编码,我们字段我们可以把它编码为具体一个数值,也就是说我们用一个具体的数值来代替,它原始的字符串的一个取值的情况。
这个地方我们的一个label encoding呢,它比较适合在数模型里面进行使用啊,比较适合在数模型里面进行使用,它的一个优点,就是说它不会增加这个类别的一个维度嗯,就是说我们的原始的这个具体的一个呃。
字段是一列的,我们在做一个编码之后,它仍然是一列对吧,它不会增加我们数据的维度,LIBENCODING比较适合用在有序的类别,就是说如果是原始是这种,有有这种大小次序的话。
我们在通过label encoding编码之后,他仍然也会保留这种次序啊,Lil encoding,如果在做一个编码的时候,你没有指定它的大小次序的时候,他可能是进行随机编码的这个地方。
我们第一个出现的一个取值是china,china是零,相当于是我们把它第一个出现的这个取值,把它编码为零,第二个编码为一,使用这个出现次数,他的一个先后来求编码对吧,其实这个地方。
如果我们没有指定它的大小关系呢,这种编码方法,它就会改变我们的一个取值的一个大小关系,相当于是破坏他们之间的一个次序啊,在我们使用label encoding的时候呢。
我们可以用pandas的factorize,或者说用s client的一个label encoder来做一个操作,我们还有的呢就是我们这种BENCODING2进制编码,二进制编码呢。
就是说我们在做一个编码的时候呢,我们可以对某个字段类似的,也非常类似我们one hot的这种操作,我们可以把它转为这种二进制,把它转,先把它转为一个编码,比如说先把它使用这种label encoder。
作为转成一个具体的数值,然后转为数值之后呢,然后把它进行一个二进制二进制的编码,好,binary encoding呢,其实它的一个操作,其嗯就是说跟我们的一个one hot是非常类似的啊。
他但是呢他也会,他会也会带来这种次序的改变啊,因为one hot他其实是没有改变这种大小的关系的,但是呢这种binary coding呢,它其实是加入了这种大小关系的一个嗯。
就是说改变的barry encoding呢,它的可以视为这种完后台一个替代品啊,就是整体的一个维度会变变得更加低一些,还有一类呢是我们的一个frequency encoding。
或者说叫做我们的一个count encoding,它的一个具体的操作呢,就是说我们是可以把这个具体的某一列的,一个具体的取值的一个次数,用来做它原始的一个编码,在这个地方。
我们如果是对我们的这个country,这一列做一个编码的时候,china出现了两次,我们把它变某一二,UC出现了两次,我们也把它编码为二,UK呢出现了一次,我们把它编码为一。
就相当于是用这一列这个具体取值,它出现的一个次数,然后做一个具体的一个嗯,相当于一个替代啊,这个就是我们的一个具体的一个操作,content encoding或者fency encoding呢。
你还可以做把它换算成频率啊,就不不仅仅是次数啊,把它换算成频率也行,content encoding呢,它的一个操作其实是嗯,有点像基于这种上帝视角,也就是说它不是基于某个样单个样本。
它是基于整体的某个字段做一个统计的,所以说呢这种统计的方法呢,它比较适合我们的一个嗯,就是说分布一致的情况下,比较适合这样进行操作嗯,这也是它的一个缺点,就是说如果分布不一致的情况下。
我们的一个counting coding,他得到的结果就不一致了,比如说我们的训练集,和我们的一个具体的测试集,如果他两个字段的一个取值的分布是不一样的,话对吧。
那么你在这个地方做content encoding,其实它的一个具体的一个结果,就会存在一个冲突,就会存在一个冲突,好抗体口令,那这个优点呢就是说它是非常简单的,不管是有序编码还是无序编码。
都可以用来进行使用啊,都可以进行使用,好我们继续,那么coding coding呢在做具体的实现的时候呢,我们就是用这个嗯就是统计它出现的次数啊,不管是用value counts啊,还是用什么方法。
同样的算的次数就行了,好还有一类呢就是我们的一个target encoding,target encoding呢就是我们的一个具体的一个操作呢,就是我们是统计一下我们的具体的这个字段。
它对应得到的一个标签,它的一个具体的一个取值的一个情况,这个呢就是我们在做一个具体的一,个操作的时候呢,比如说我们对我们的一个CTRL字段,做一个target encoding。
如果是对我们的CTRL字段做一个targeting coding呢,我们其实本质就是对我们的一个数据集呢,我们是统计一下这个count字段,它对应的一个label的一个取值的情况。
比如我们的一个contest的china,它对应的一个label对我们的大get it分别是多少,一和零,我们对它取出一个均值就完了,然后就得到0。5对吧,USC0和一,然后求一个均值也是0。5。
这个地方呢,其实本质就是对我们的一个类类别取值,它对应的一个标签的一个关系,相当于是求它的一个均值啊,求一个均值,具体的一个实现呢,就是说我们对客户端我们的某一列,然后求它对应的一个标签的一个均值。
然后就得到他的一个具体的一个标签编码,标签编码其实它非常非常适合用在什么场景呢,就是说我们这个地方的标签编码,其实得到的一个结果,有点类似于一个具体的一个均值,或者说一个先验的一个概率。
我们的一个具体的一个,它到底是什么含义呢,就是说我们在做一个具体建模的时候,其实我们的模型是很难去理解他,这个china到底是什么含义的,但是如果这样说,CTRL等于china的同学。
他的一个具体的一个标签,整体是等于有可能是零点,就是说0。5的,那么这样呢是更加有意义的,这个就是我们的标签编码,它其实是让我们的一个模型来,学习起来更加容易,但是呢他给人1coding。
他还有一个缺点,就是说它可能会让我们的一个标签信息,标签信息呢给他泄露出来啊,因为这个地方我们的一个具体的一个看一看,我们这个UKUK呢,这个地方我们只有一个一位同学。
这个地方我们如果是把他这种标签编码之后,其实本质我们是会将我们的一个具体的一个嗯,标签信息给他泄露出来对吧,我们相当于是直接把他的标签给它编码进来,它其实是非常容易过滤活的。
因为它其实是将我们的一个标签性,标签信息呢给它泄露出来,它的具体的实践方法,其实本质也是这种次数统计啊,分组聚合做次数统计就行了,好那么在我们的一个具体的一个嗯,就是说类别特征的编码的时候呢。
就非常建议做这种one或车啊,never encoding啊,count encoding啊,和MENCODING,这四类编码,就基本上是可,就说可以涵盖大大部分的场景的啊,好,然后呢。
如果我们是有这个具体的一个,数值类型的特征呢,其实我们也是需要做一个处理的,数值类型的特征呢,它也是在我们的日常生活中,非常非常常见的数值类型的特征,我们有这个年龄乘积,经纬度对吧。
它都是我们的一个数值类型的特征,数值类型的特征呢,它其实包含的一个信息量会更多,因为它的取值的一个克数其实就是会更多,但是呢它会存在一个具体的一个缺点,就在于数值类型的一个字段呢。
它很容易出现这个异常值和离群点,好我们对于数值类型的特征呢,我们怎么做一个编码呢,首先是可以做一个缩放和取整,缩放和取整这个其实是非常常见的,我们如果是对于这个地方,我们新加了一列A级,这一列。
A级这一列就是我们的一个嗯年龄这一列,如果对于年龄这一列,我们其实是可以把它做一个统,具体的一个提取它的一个信息的,edge这一列它原始的取值是34。5,28。9,19。5,23。6对吧。
那么这个地方我们是可以对我们的A级字段,做一个相当于是把它做一个取整,34。0,29。0对吧,把它转变成一个整数,或者说把它除以一个十,然后把它转成整数做一个缩放对吧。
那么这个地方为什么要做这样一个缩放呢,为什么要做这样一个复缩放呢,其实这样一个缩放的目的,相当于是我们是将这个具体的数值,它的一个绝大部分的一个信息给它保留下来,年龄是我们相当于是把它的一个数值的。
一个主要的一个信息给他保留下来,因为这个地方我们34。五二十八。9,其实这个数值它的一个信心其实是非常多的,在这个地方呢我们的信息越多,其实并不一定表明它的一个效,最终的效果是越好的。
因为我们的一个信具体的一个信息,它是越多的情况下,我们的模型反而更难去寻找得到这些这个字段,它的一个共性,如果我们是把它做了一个缩放之后呢,比如说这个地方34。5把它转为三,28。9,把它转为二对吧。
相当于是这个地方相当于是小于20岁的,一的一个取值是小于20岁的二的一个取值呢,就是小于30岁的对吧,那么如果是通过通过这样一个一种缩放,你就会发现我们的一个具体的一个取值,它就会更加有意义,它会。
它其实本质是,将我们的一个大部分的信息给他保留下来,为何日本是零,英国是一嗯嗯这位同学哦,在这吗,UK啊,是是说的这个图是吧,japan他的一个具体的标签,它就是一个对应得到的是零啊,就一个零啊。
然后他的一个均值不就是零吗,UK的话,它的一个具体的一个就是说取值就是一啊,一个一啊,然后他的标签就是一啊,我们这个地方就是china,它有两个一和零,然后求一个均值,就是0。5嘛,就是这样的一个操作。
对其实就是这样的啊,应该是group by我们的country,对我们的country具体的取值做一个分组,然后求求它的一个对应分组,下面的target是一个均值,是这样一个含义,好。
嗯然后然后我们就继续啊,对于我们的数值呢,其实我们还可以做一个非常常见的操作,就是做一个分享,就是对于一个数值呢,我们是可以把它啊划分到大于某个取值,小于某个取值,比如说我们对我们年龄。
我们可以把它划分是不是小于20岁,是不是位于20岁到25岁,是不是位于25岁到30岁,是不是大于30岁,这样按照这些具体的逻辑把它做一个分享,这样呢其实是非常常见,也非常有效的一种操作。
它其实是可以将我们的一个数值的一个特征,把它做一个离散化,但是呢它其实这样的操作呢是需要人工参与的,需要人工进行参与的,所以说呢它其实是这个代码,其实我们需要手写的啊,就是我们的这个具体的划分的方法。
其实是需要人工智能参与的好,我们在做一个具体的数值的一个操作的时候呢,其实我们也是需要将我们的一个也要考虑到,我们的具体的数值,是不是嗯需要做一个具体的一个缩放,这个缩放呢,其实本质呃。
是可以把它视为我们的具体的一个额,数据预处理的步骤,数据预处理的步骤,因为我们的具体的数据集呢,其实这个数值啊,它往往就是嗯不一定是我们的一个具体的一个,呃就是嗯一个比较规整的范围。
我们其实呢是需要把它进行,转换到一个规整的范围内,我们在进行一个如果是把我们的具体数值,把它转换到一个规定规整的范围内之后呢,我们可能对我们的一个模型建模也是更加方便。
它就是说我们的一个模型它更容易收敛啊,以及我们的模型它更容易进行一个训练,这个地方呢我们的数据的一个归一化方法呢,其实有很多啊,常见的就是说我们用这个最大值,最小值做一个归一化。
就是说我们给定一列这个字段,给定这一列这个字段,我们给定这一列这个字段的情况下,我们是可以用这一列它的一个,这里面的一个最大值和最小值做一个规优化,也就是也就是我们有一个这个具体取值,减去的最小值。
然后除以最大值减去最小值,这是我们的一个极差对吧,整体做一个转化,我们利用这个最大值最小值做一个转换,它的一个处理呢是比较适合,用于这种非高斯的分布,可以保留绝大部分的数值的一个信息。
但是呢它非常容易容易受到这种异常值的影响,因为我们的一个最大值和最小值,往往都是我们的一个异常值对吧,很有可能是我们的异常值好,那么如果是这种嗯,比较出比较类似于我们高斯分布用的。
我们就比就比较建议是我们的这种standard scale,这种相当于是一种标准化,标准化,就是减去我们的一个具体的一个均值,除以我们的方差,减去我们的均值除以方差,这样的处理。
它比较适合用在我们的高斯分布处理之后呢,我们的数据集会更加正态化,它就就比较适合用在我们的一个高斯分布的,这种正态分布或高斯分布的这种情况好,还有一类就是我们的max abs。
这个地方是也是非高斯分布啊,这个打错了高斯,我们的max abs,就是我们的一个具体的一个数据集呢,他在做一个处理的时候呢,是用一个绝对最大值做我们的分母,绝对最大值做我们的分母。
这个具体的数据值的一个预处理的这个操作呢,在我们的sk learn里面,有非常多的一些具体的实现啊,嗯如果同学们感兴趣的话,可以在SKN里面,SKHN里面找到更多的啊。
在我们的secret name的一个proposition里面,模块里面,其实这里面包含了很多的一些,我们的一个数据类类别类型的一个编码,以及它的具体的一个数值类型的归一化方法,如果你还感兴趣。
或者说想学得更加深入的同学呢,可以建议把这些SK的这些具体的一些方法,它的文档好好看一下,这些文档里面都写得非常精,非常非常精简啊对吧。
Scare each feature by its maximum,Absolute value,就相当于是绝对最大值对吧,做一个除法,这个其实都是非常简单的一些就是文档啊,如果你感兴趣的话呢。
也非常建议学一下好,我们在做一个具体的一个处理的时候呢,我们其实本整本质还可以做这样一个操作,我们遇到的一个数据集呢,它很有可能是这种日期类型的,日期类型的呢,就是说我们这个具体的数据集这个字段啊。
它是带有这种时间信息的,如果是带有时间信息的话呢,我们其实是非常建议,你可以把这个具体的一个时间信息,把它抽取出来,比如我们可以统计一下这个时间信息,它当前具体的时间信息,它是哪一年的哪一个季度的。
或者说哪一个星期的哪个节假日的哪个小时了,是不是早高峰,晚高峰,以及它可以跟我们的一个历史的一个均值,做一个对比,这个历史的一个均值,就是说我们历史的一个统计值,比如说统计一下。
他跟历史的一个平均值做一个对比,历史的一个最大值做一个对比,历史等于我们的一个嗯,嗯某个分位数做个对比对吧,这个都是可以做,这些操作呢都是对于我们的一个日期类型的,一个字段可以做这样一个操作。
当然我们还有一类呢,就是说我们可以做一个交叉特征,交叉特征呢,就是我们是可以将两个字段做一个交叉构建,得到一个新的特征,这个其实也是嗯非常常见的交叉特征,其实非常常见的交叉。
就是这种加减乘除或者笛卡尔集对吧,那么这个其实可能会有一点点难度啊,因为我们在做这个交叉的时候呢,其实不同类型的特征,就是它做交叉的方法可能不一样,我们一般情况下对于相同类型的特征,相同类型的特征。
就是说他如果是具体的一个取值,假如说我们有两列,我们之前讲的数据集,一个是我们的bathroom,一个是我们的bedroom,还有一列是我们的price,这两列是我们房屋的个数。
不管是厕所的个数还是房屋的个数,这一个取值是跟金额相关,跟钱相关的对吧,这两个是类同类型的,这个跟这两个不是同类型的,那么同类型之间是可以做加减除,或者笛卡尔级的家是什么意思,就是说这个房。
这个房屋它到底包含了多少个房子,多少个房间,就是说把厕所和卧室都算上对吧,除了就相当于是平均每个卧室,可以平摊多少个厕所对吧,如果是不同类型的话呢,可以做乘或者做一个除,比如说做除法的话。
就是price除以bathroom,平均每个厕所他多少钱,平均每个卧室多少钱对吧,这都是有具体含义的对吧,当然你也可以做一个聚合的人,就是说先分组聚合再做同款,比我们在做做这个地方其实是做这样一个操作。
grp by我们的一个bedroom,然后求一个price的一个平均值,这个操作叫做什么,对我们的bedroom进行分组,然后统计一下相同bedroom下面,哪个房子的一个价格的一个平均值。
这个就是一个分组聚合,其实本质就是一个聚合特征,一个聚合特征对吧,那么我们在做一个具体统计的时候,我们可以统计一下相同房子,相同,我们的卧室个数情况下的一个价格的平均值,跟你这个当前房子的价格相比。
它到底就是说嗯价格是高的还是低的对吧,都可以做这样一些操作,这个呢就是聚合特征,那么还有一类特征就是我们的link特征,就是信息泄露的特征,就是我们是个具体的数据呢,它可能嗯有一个特征呢。
是跟我们的标性强相关的,但是呢这个特征它又没有什么具体的含义,就是它是一个立特立个特征,比如我们在进行一个建模的时候呢,如果我们的数据集啊,它是按照这个嗯有这种先后次序的,这种嗯整理。
它可能是将我们的一个相当于是先去整理,我们的一个标签热度为高的样本,然后再去整理我们标签热度为中的样本,然后再去整理我们标签热度为低的样本,那么在这个地方,我们就可以从我们的一个具体的一个房屋的。
一个图片的一个创建时间,从这个维度确定,于是去反推得到我们的原始的标签的对吧,其实这样这个就是非常非常很典型的,就说我们这个这个信息,是跟我们的标签墙相关的,但是呢,其实它是由于我们构建数据集。
所带来的一个误差,它并不是我们的原始数据,它内部分布的规律对吧,这个呢就是说是一个leg特征,它是跟我们的数据集构建的过程中,强强强相关的,但是呢并不是我们的原始数据集,它嗯真实的一个分布的规律。
那么在我们讲完这个特征工程之后呢,希望各位同学能够问问一问自己这三个问题啊,就是说你真的掌握了上述的特征工程的,方法了吗对吧,到底美内特征工程具体用在什么样的场景呢,它具体具体的一个优缺点是什么呢对吧。
这是第一个思考的点,第二个就是说我们的具体的一个,我们的一个有非常多的一些具体的一些,机器学习模型,我们的具体继续学继续学习模型,它能够学习到什么特征,以及它到底能够不能学习到什么特征,对吧。
这些都是我们的一个需要思考的,因为我们在做一个具体思考的时候呢,其实我们现在有非常非常多,非常多的一些机器学习模型,我们也有非常非常多的一些特征工程的方,建模方法,那么我们是需要去思考的。
是不是所有的特征工程,在所有的模型下面都是需要做的呢,或者说什么样的模型,适合做什么样的特征工程呢,对吧,这个都是需要说清楚的,或者说我们是需要人工,是不是需要人工做的特征工程呢对吧。
这个都是我们在做具体实践的时候,要做的一些问题,第三个呢就是说如果是立面的特征,我们如何做特征工程,匿名特征就是说我们这个特征的一个具体,具体的这个含义,我们都不清楚,含义我们都不清楚。
那么这个地方我们就是如何,对于一个你都不清楚具体含义的一个字段,我们怎么做特征工程,这个也是需要你关注的,我们接下来看第三部分啊,我们的一个模型的训练与验证,然后讲完这部分呢,我们就有具体的一个代码。
然后给大家,然后来实践一下,对于我们的具体建模的时候呢,我们的具体数据集啊,其实它是需要做一个划分的,我们在之前的一个呃基础的课程里面,或者说在我们的一个机器学习的教材里面呢,我们都经常有啊。
我们是可以将我们的数据集把它划分为训练集,验证集和我们的一个测试集,训练集呢是我们是将它用于我们的一个,模型的训练和参数的更新,验证集呢是把它用在我们的一个模型的,具体的进度验证和参数的选择。
测试集呢是用来最终验证我们的模型的精度,我们的一个具体的验证集呢,其实是可以从我们的一个训练集拆分得到的,这个验证集,它是非常非常关键的,而且这个验证集呢它的一个具体的一个作用呢。
就是可以用来对于我们的验证,就是说这个模型的训练过程,实时的进行一个反馈,我们的一个模型呢其实它在进行建模的时候呢,分为两种状态啊,欠拟合过拟合过离合,就是说我们的模型在训练集上的一个精度较好。
这样我们的一个泛化的时候,在我们测试集上的精度较差,欠拟合就是说在模型的训练集的一个进度较差,在我们的测试集上面的进度也较差,一般情况下,我们的欠拟合是,就是说是可以通过增加模型的复杂度来避免的。
过滤后是无法避免的,我们的具体给定一个数据集的情况下,我们的一个数据集的一个复杂度,和我们的一个模型的复杂度是要匹配上的,数据集是比较简单的,那么你的模型也尽可能比较简单,也不能过于复杂对吧。
这个地方就是过于复杂的情况好,那么我们的数据集嗯,给定数据集的情况下,你的模型也不能过于简单,你不能不能就是说是个线性模型,这个线这条直线就过于简单了对吧,我们这个地方这条曲线。
往往就是它能够最为满足我们要求的,那么我们在做建模的时候,我们非常建议大家做这种art stop这种操作,这个操作就是说我们在进行训练的时候,我们是可以绘制得到两条曲线。
这个地方我们相当于是不断增加数模型的深度,我们可以绘的绘制得到两条曲线,一条曲线是我们的训练集的误差,另一条曲线是我们的验证机的误差,那么在这个地方呢,我们可以得到两条曲线之后呢。
然后去可以看一看我们的一个模型,它在我们的一个,最低验证机精度的时候,这个是我们想要的一个位置,因为在这个地方我们的一个模型,它很有可能是能够取得得到最好的,泛化精度的时候对吧。
在我们的验证机上取得最好精度的时候,所以说我们在训练的时候呢,是不断不断的去观测我们的模型,在我们的一个训练集上的精度,和我们的验证集的进度,然后选择在最优精度的位置的时候停止训练。
这个呢就是我们的2stop2stop,它其实是非常非常有效的一种,缓解过滤活的方法好,当然也有其他环节固定化的方法,数据库建正则化以及增加随机性都是啊,就是也是缓解过缓解过滤好的方法。
当然alt stop是比较有效的好,我们接下来呢,然后就是嗯,看一看我们的一个具体的代码实现啊,在我们的一个机器学习的实践部分呢,是非常推荐大家用这个Python。
再加上pandas来做一个具体的实践啊,好我们来看一看,首先呢是我们的这个特征编码的这一部分啊,这一部分呢其实我们在这个嗯,我们PPT里面呢也给大家讲讲了啊,然后我们就就是大致给大家看一下啊。
对我们的这个具体的字段,我们就是传入把它传入进去啊,这个地方我们具体的就是原始数据集,就是一个data frame,把它传入进去就可以做一个具体的编码,好这个编码之后呢。
这个其实是一个data frame,这其实是一个long派的area啊,它不是一个data frame啊,然后呢我们在做一个学习的时候,其实是要关注到这个具体的数据类型的啊,这具体的编码呢。
然后大家可以自己下去看啊,我们在做一个具体的一个特征工程的时候呢,其实我们有些时候还是需要知道,我们的一个特征的重要性的特征的重要性,特征重要性是用来做什么呢,就是说我们是可以用用一个具体的一个取值。
去衡量我们的一个特征,它的一个具体是不是重要,在我们的一些数模,在我们的一些模型里面呢,其实我们可以用模型的一些具体,具体的一些统计值,用来反映我们的一个模型是不是重要的。
比如我们在这随机森林的一个回归系里面,我们如果用它训练完成之后,我们可以在我们回去森林回归器里面的,一个feature importance字段可以找到,就是说他具体它输出的就是每个字段的一个。
重要性的一个排序,这个地方如果我们绘制得到一个直方图,这个直方图就是说RM和LSTAT这两个字段,是在我们的这个模型里面认为是最为重要的,好那么这个地方特征重要性呢,其实它的一个输出结果啊。
这个地方的输出结果是一个小数,对于数模型而言,它往往都是用我们的激励指数,或者说我们的一个信息增益这个字,这个字段所带来的一个信息增益,来作为它的一个重要性的好,那么类似的一些其他的一些数模型呢。
也都是有这个feature importance的一个实现,比如我们的一个LEGBM,或者说我们的一个具体的一个嗯,这个嗯随机四零,或者说我们的x g boost,都是有这个我们的一个特征。
重要性的一个实现的好,那么我们接下来呢来看一看我们的具体的一个,就是说to seem to西格玛这个具体的一个比赛,我们怎么做一些特征的啊,然后这一部分呢可能就是说嗯,嗯希望各位同学跟着我的一个节奏啊。
然后来看一看,我们如何把这个具体的这个这个数据集,我们一步一步做一些特征,然后才让他参与我们的一个训练,首先呢我们读取我们的数据集,这个地方读取数据集呢,我们直接是用我们的一个pandas。
然后read csv,然后完成一个读取,读取完成之后呢,我们接下来就可以完,完成一个具体的一个操作啊,这个操作我们先讲比较,就是说关键的啊,就讲这一部分啊,对于我们的一些字段呢,其实我们是可以考虑。
就是说很多角度对他进行统计啊,我们的这个呃FOTOS,其实它是原始是的这个list类型的,这个list类型呢就是说是这个图片的一个URL,对于这个photos我们可以统计它原始是一个list。
我们可以统计到什么特征呢,就是它的一个具体的历史的一个长度,list的一个长度,那么这个list的长度呢,我们就可以相当于是视为它的具体的一个,具体的取值这个数啊,取值个数好,然后呢。
这个features其实它也是一个类似的类型的对吧,然后呢,我们这个地方,其实我们也是可以统计它具体的一个个数,然后这个description,description它是一种文本类型的,文本类型的呢。
我们这个地方就取值,统计一下它到底是拥有多少个单词,这个地方怎么做统计呢,我们就是对它进行一个使用,我们的一个空白符进行分隔,然后统计一下到底有多少个单词就行了对吧,然后如果是这种created的。
它是一个时日时间类型的,那么对于时间类型的我们怎么做,把它转为data data,data time之后,然后提取它的一个年月日年月日对吧,这个呢就是我们的具体的一个相当于是,日期类型的一个统计。
当然我们也可以做这样一个统计,就是我们刚才所讲的这个交叉的一个特征,统计一下,每个bedroom平摊的一个具体的一个价格,每个bathroom平摊下的价格,每总共有多少个房间对吧,等于是这两者相加。
就是总共有多少个房间,我们bedroom和bathroom进行相加,以及我们平摊每个房间的一个价格,每个房间的价格对吧,这些都是我们可以做的,那么这些操作都是非常有用的一些字段啊。
就是它是嗯将我们的一些原始的一个数据,进行一个交叉计算,得到我们的一个新的一个字段,那么我们在做一个交叉的时候呢,你其实是要考虑啊,并不是说所有的字段都可以做一个交叉,这个地方的交叉呢其实也是遵循咨询。
就是说我们PPT的一个规律啊,就是同类之间可以做加减,同类之间可以做除法,但是同类之间一般不做乘法啊,不同类型之间可以做一个除法好,然后呢对于我们的一个具体的数据集呢。
我们其实是可以做一个target encoding,这个地方呢一个target encoding呢,可能就稍微有一点点复杂,我们在原始的数据集里面,我们有一个叫做manager id这个字段。
mani id相当于是一个中介的,一个中介的一个编号的吧,中介的编号,这个地方,如果我们是想要对这个manager id做一个target进行coding,我们怎么做呢。
非常建议用这种五折交叉验证的方法来做,五折交叉验证,是这样一种方法啊,我们把我们的数据集划分成五份,五分,这是我们的第一折,这是一折,这是我们的第二折,这是第三折,第四周,第五周,在第一折的时候。
我们用这个做我们的验证集,然后其他当做我们的训练集,这也就是说这个地方这是我们的VAL,第二折的时候,我们用这一折当做我们的验证器,第三折的时候,这是我们的验证期,第四折的时候,这是我们的验证器。
然后第五折的时候,这是我们的验证期,在每一折我们用到的验证集不一样,然后训练集也不一样,这是我们的交叉验证啊,相当于是我们把我们的数据集拆分成多份,然后把它进行划分成这个地方,划分成五份之后。
我们就需需要迭代五次对吧,那么这个地方跟我们的这个target encoding,有什么样的一个区别呢,或者说有什么联系呢,这个地方,我们的targeting encoding。
其实是很容易出现标签泄漏的一种情况,其实是很容易出现标签泄漏的,你可以设想一下,我们刚才在PPT里面所讲的那个例子,如果一个manager它对应的一个样本就一个的情况下。
那么在这个地方我们如果是做一个targeting coding,我们其实很容易的就可以将就,很容易将我们的一个具体的一个对应的一个target,对应样本的一个标签给泄露出去对吧,那么所以说在这个地方呢。
我们在做一个targeting encoding的时候呢,我们其实是可以把数据集,把它划分成训练集和验证集,训练集的一个manager指对训练集的,就相当于是我们对训练集的数据。
对它进行manager的一个统计,然后对训练集的一个数据部分对它进行编码,然后验证集的呢我们就不做编码,或者说我们的一个测试节目不做编码,我们在是一折的时候,我们的一个验证集是这样的。
然后下一折的时候对吧,如果是他是划分到中间的时候,这个就是我们的验证机,然后我们的训练集又不一样,训练期又不一样,也就是说我们在做一个进行分组的时候呢,我们是对我们的一个数据集进行一个划分,不同折之后。
然后再去统计不同折下面的一个manager的一个,具体的一个取值,这样呢其实是增加了我们的一个平均性啊,它也不会将我们的一个原始信息给他泄露出去,这个就是我们的一个相当于是加入了这种。
交叉验证的target点口令,在写的时候稍微有一点复杂,也就是说我们在做一个具体统计的时候呢,我们是对我们的训练集划分成两部分,一部分呢就是我们的一个训练的一部分,是我们的一个验证的。
然后在训练的部分呢,我们去统计一下我们的一个具体的一个manager,它对应的一个相当于是他的interest level,然后呢对于我们的一个测试集呢,相当于是我们用我们的训练集统计得到的。
manager的一个统计情况,对我们的一个测试集的结果进行一个编码对吧,然后呢如果是下一折的话呢,我们就是用下一部分的M训练的部分,进行一个统计,然后对下一部分验证集的一部分,进行整体的编码对吧。
验证于是每折的时候,我们的一个具体的一个计算,和我们的统计是不一样的啊,再来画一下123啊,就画四折啊,不行不行不行,在第一折的时候,用这一部分计算我们的一个target encoding。
对这部分进行编码,下一节的时候用这一部分计算,我们targan coding对这部分进行编码,也就是说在进行编码的时候,没有自己对自己编进行编码,原始的一个targeting in coding存在。
自己对自己进行编码,但是这样呢我们相当于是用交叉验证的方法,对,相当于是我用这部分做统计,对其他的数据集作为编码,那就不会存在这种标签泄露的情况,而且这样的操作呢,其实是非常非常建议去做的啊。
也非常有效的好,我们这个地方呢是可以对我们的有manager id,做一个target encoding,当然也可以做我们其他的一个building。
building id的一个tacting coding,这个都是可以做的,我们做完之后呢,也可以就是说统计其他的特征,比如说我们到底就是嗯我们的一个房房间,他的一个提就是说他的一个嗯发布的时间。
具体的一个天数,具体的月数,以及我们将我们的一个价格,除以我们的一个经纬度鉴定,是同相同经纬度下面我们的相同位置,下面我们的具体的一个房子的一个价格,这个都是可以做一个具体编码的。
然后呢我们对于这个具体的一个特征,把它处理好之后呢,然后如果是类别类型的特征,我们就直接把它做一个label encoder对吧,把它做一个label encoder,做一个编码。
如果是其他类型的特征呢,我们尽可能是把它转为我们的一个数值类型,转为数值类型之后呢,我们接下来就可以直接把它,用我们的一个模型进行训练了,这一部分呢其实呃是用到了TFIDF啊。
我们在之后的课程会给大家讲,其实它原始的数据集呢可能是这种嗯,这种文本类型的啊,我们是提取它的一个TFIDF特征,然后对它进行一个嗯拼接到一起好,拼接到一起之后呢,我们接下来就是有一个交叉。
五折交叉的训练,这个交叉训练其实跟我们刚才讲的是一样的啊,这个地方我们是用k fold,把我们的数据集划分成五份,用其中的四份做我们的训练,然后用其中的一份做我们的验证对吧,五折交叉验证。
五折交叉验证的一个优点,就是说我们这个地方其实是最终训练,得到五个模型,我们对这五个模型呢,我们是可以对这五个模型,分别对我们的一个测试集做一个预测,然后可以对我们的一个测试集的结果。
就行进行一个求平均对吧,就行求平均,然后就可以得到我们的一个测试及预测结果,的一个均值对吧,这个其实整体而言都是非常简单的好,当然如果是想要对我们的这个具体的数据集,你就是做的比较好的话呢。
你也可以嗯参考我们的第二份代码啊,就是说你可以对我们的数据集,进行相关的处理啊,这个处理操作整体都一样啊,这个地方只不过我们在这个地方呢加入嗯,一个叫做stacking的一个操作啊。
stacking的操作我们在进行模型训练的时候呢,其实我们是可以通过我们的一个五折,交叉验证嗯,可以得到我们得到一个新的一个特征,假如说我们划分成四份啊,四份就是四折。
每折的时候我们得到的用到的验证机不一样,我们训练得到四个模型,这个四个模型,它分别对我们的验证集做一个预测,把我们的验证集我们把它拼接到一起,这个拼接到一起之后。
就是我们的模型对原始训练集的一个预测结果,这个就是我们模型,对原始训练集的一个预测结果,那么类似的,我们也可以对我们的一个测试集,有一个预测结果,我们也可以有对我们的测试机有一个预测结果。
那么这样呢这个新加的一维特征,我们是可以再把它进行啊,进行一个二次训练的对吧,这个操作其实叫做一个stacking,它基于我们的五折交叉验证,我们五折交叉验证可以得到我们的五份,这个地方其实是四份啊。
四份验证集的一个结果,我们把这四份验证集的一个结果进行一个拼接,类似的,我们的四个模型,可以对我们的测试集进行一个预测,结果也可以得到一个新的一列新的一列,那么这个地方我们的具体的数据集。
我们是可以得到训练集的一个新增的一列,我们的测试集的新增的一列的一个标签,我们可以将这个标签把它进行一个二次建模,也就是我们这个地方代码所写的,我们对我们的一个交训练的过程,代表交叉验证的过程。
这个地方对我们的通过五折交叉验证,可以对我们的数据集进行一个得到,我们的一个模型,它的一个具体的一个训练集的预测结果,以及我们测试集的预测结果,然后我们定义多个模型,那么以此类推。
就可以得到多列的一个训练集的标签啊,多列的训练集的一个特征,以及多列的一个测试集的一个特征对吧,我们接下来可以把这多个模型这个地方有,我们有这个随机森林啊,阿达boss啊,叉g boost。
这具体的一些我们的一个嗯模型它的一个特征,新增的一个特征呢把它拼接到一起,然后再做一个二次训练,这个S训练,其实就相当于是有点像这种堆叠的过程,我们这个新增的一列特征,就是我们之前的模型。
对我们的一个训练集标签的一个预测结果,以及对我们的测试集标签的一个预测结果,我们接下来学习呢其实学习的是一个残差,也就是我们之前这个模型跟我们的一个,这是我们的测试结果。
和我们的一个真实标签的结果的一个差异性,它其实是一个残差学习的一个二次的残差,这个stacking呢,有点像这种神经网络的这种思路啊,有点像这种堆叠的思路,但是呢std它其实是这种手工来实现。
这种堆叠思路的这种方法,它是通过这种交叉验证,然后通过这种堆叠的方法,然后完成我们的一个具体的一个模嗯,就是说新增的特征,这个地方我们其实新增了多少列特征,一列两列,三列,四列,五列六列。
这是我们新增的第二层的,我们的输入的数据集,它是一个六列的特征,我们的标签呢仍然是原始的标签,这个标签仍然是原始的标签,我们的一个具体的一个测试集的一个特征呢,也是我们新增了六例。
然后我们的一个具体的一个测试集呢,是基于我们的一个相当于是这个新增六列,做一个预测,因为我们的一个这个地方做的一个,第二层建模呢,是我们的新增六列的特征,和我们的一个标签的一个建模。
我们这个地方的预测呢,就是对我们的新增六列的特征,然后作为我们的输入,然后预测我们的标签,这个呢就是我们的代码实践啊,然后如果各位同学想要下去仔细阅读呢,也是非常建议大家可以下课仔细阅读一下的好。
然后我们继续,首先呢,我们在做一个具体的一个特征工程的时候呢,需要进行一个思考,就是我们的一个具体的特征工程呢,它是跟我们的数据集相关的,不能一概而论啊,不能一概而论,也就是说不同类型的数据。
我们是需要做不同不同的一个特征工程的,这是第一点,第二点呢就是我们的一个具体的模型呢,我们是需要做一个具体的一个处理的,我们的一个具体的处理呢,就是如果是对于数模型,对于我们的线性模型。
其实我们各自的处理方法是不一样的,对这些代码在哪找,可以找到,在我们的一个QQ群啊,我们待会会发到QQ群里面,对待会我会发到QQ群里面,好不好,不同的模型,我们处理的一个特征方法其实也是不一样的。
也是不一样的好,然后呢我们其实在我们学习的时候,重点要学习的就是我们的一个机器学习模型,它适合用什么样的一个特征,这个是你在做学习的时候关键的一个点,什么样有有哪些继续,具体有哪些具体的机器学习模型。
我们有哪些具体的特征,工工程方法,两者之间怎么做一个匹配,这个才是我们在做动手的时候,非常非常核心的一个能力好,那么以上呢就是我们这节课的一个内容,各位同学有问题吗,对如果有问题的话。
可以提出来让我知道啊,对,好,同学们有问题吗,如果没有问题,扣个一好不好,扣个一我们就结束我们今天的课程对,好那么如果大家有问题呢,也可以在我们的QQ群里面艾特我好吧,那么我们今天的直播就到此结束了。
然后我们待会呢会把代码上传到我们的QQ群,好的谢谢各位同学,谢谢各位同学好,谢谢大家,那么我们下节课再见好吧。
1447-七月在线-机器学习集训营15期 - P5:2-决策树、随机森林、GBDT - 程序员技术手札 - BV1ASste6EuZ
好的好的,那那个大家晚上好啊,我们今天上咱们的第二次课,在今天的课程当中呢,我会给大家介绍到另外一类非常独特的模型呃,我们昨天的模型和今天的模型,是工业界当中最爱使用的模型。
而今天介绍的模型相比于昨天的模型,有它自己的一些独特的优势,使得啊工业界当然在工业界的话,我们是两类模型都会用,但是如果大家去看一看各式各样的,近几年各式各样的数据科学比赛,你会看到。
今天我们讲到这一类模型占据了半壁江山,于是无论如何,大家在解决任何问题的时候,都会第一第一时间想到说,我要用数模型去试一下,所以这个地方树模型,包括我们说到的决策树,以及决策树的一些集成模型。
包括今天会提到的随机森林,Random forest,Ok,这个模型相对于昨天的模型有它自己独特之处,它在数据的预处理的部分啊,我的声音大小OK吗,声音小不小吧,那我在具体讲内容之前。
我再跟大家确认一下我的声音大小是OK的吗,没有问题吧,啊所以我觉得说声音小的同学,可能是自己那边声音调的不够大啊,所以调大一点,好吧啊,好没问题,那我们今天提到这个模型非常非常重要啊。
就是数模型的基础啊,叫做决策树,decision tree啊,那基于这个决策树呢,我可以用一些集成的方法,去得到各式各样的高级模型,比如说其中的一个高级模型叫做随机森林,这是我们今天要给大家讲到的模型。
这个模型呢在于它自己独特的特点,我们上节课讲这个模型,做分类的模型叫做逻辑回归,逻辑回归完成的,完成预估的这个方法是,你可以对它做一个WX加B这样的运算,在送到一个sigma的函数当中去。
拿到一个概所谓的概率P,而今天的数模型是另外一类处理的模型,所以这类模型在解决问题的时候,会有它自己的独特之处,而这类模型由于它非常非常友好的,一些数据预处理上面的一些特性,使得它在工业界被广泛的应用。
所以这是我们今天给大家讲到的内容,我们会给大家讲到从逻辑回归,上节课讲到的模型,我们简单的过渡一下,提到今天这个模型叫做decision tree,决策树,我们会告诉大家它总体的流程和核心的问题。
而这一部分也是大家在去参加各式各样的,机器学习工程师面试的时候,公司面试的时候最爱问到的问题,所以希望大家一会儿在我讲到这个部分的时候,能够好好的理解一下,有问题也可以提出来,大家一起讨论一下呃。
我会告诉大家,这类决策树它不仅能完成分类问题,它同样可以完成回归的问题,所以我们会给大家讲到回归数,Requesting tree,我会告诉大家说你回归树是如何去构建的,你如何去生长出来一棵这样的树。
以及你如何去最优化一个回归树,那N科的数单科的角色树,它可能会有他自己的一些问题,我们可以用一些模型集成的方法,去把单科的决策树集成一个集成模型,所以最终这个地方有一个很重要的集成模型。
叫做random forest,叫做随机森林,OK所以我们会给大家介绍到这样的一类模型,好的,所以这个是我们今天我给大家提到的,三个主要的内容,以及他的一些更细的二级大纲,所以大家有一个大题的印象。
我们就开始给大家做一个介绍了,我们思考一下这个地方有一个这样的问题啊,有一个妈妈在这个小姐姐到了24岁的时候,很着急啊,觉得女孩子年纪大了啊,如果没有出价,可能会有一些问题,于是他要去做一个事情。
他又去相亲啊,小姐姐长得不错,所以来相亲的人很多,于是他需要需要去做一个决定,说今天这个人来了之后,或者说今天这个人的条件下,我要不要去参加这次相亲对吧,因为出了门我还得化个妆好。
所以这个地方的问题就是,我是否要去相亲这样的一个问题,我们上节课讲到这个模型叫做逻辑回归好,这个logic的关系是一个很棒的模型,在这个模型的场景底下呢,我可以去完成一个是或者是否这样的一个。
二分类的问题,所以如果我们用logistic regression,去解决这样的一个问题,我们可以找一些需要思考的因素过来,比如说这个不要和我相亲的,这个小哥哥或者大叔,他是否长得足够的高。
他是否足够的有钱,他是否长得比较帅呃,还是说它是一个很有潜力的这样的一个人,或者说他的品德是什么样的一个程度,OK所以我找了这样的一些X1X2X三,X4和X5过来,然后我可以基于上节课的内容。
给定W1W2W3W4W五,当然你可以加一个偏执项啊,OK于是我们做了一个事情叫做WX啊,你可以加一个偏置项给B,然后你可以送到一个什么对SIGMOID函数当中,对你可以送到SM的函数当中去。
拿到一个概率P,找到一个概率P,这就是我们上节课讲到的内容对吧,我们还是给大家讲到了,到我们有用这样一个模型的时候,我们会有一个损失函数叫做log loss,然后我们会对这个logo los。
基于比如说gradient descent,梯度下降去完成一个优化,拿到最好的那样一组WOK好。
这是逻辑回归,我们今天讲完的模型就很有意思了,所以这个小姐姐在发现啊,前面这个东西要有这么多的数学知识。
这是一个很头疼的事情,还要去做数学计算,所以这个事情就变得很boring,所以有没有其他的方法呢。
他想了一下,他说哎好多场景下我有一票否决否决权,如果今天这个小哥哥的年龄大于30岁了啊,不好意思,你就不是小哥哥了,你可能是一个小叔叔了,所以年龄大于30岁呢,有一票否决权,不好意思,就完全不去了啊。
就不用考虑其他的因素了啊,然后呢如果他年龄小于等于30岁呢,我再看看其他条件,哎呀这个这个呃有一点点丑啊,所以呢这个时候哎这个条件也不行,也一票否决了,唉如果现在唉年龄也还还适中,长相也还不错。
那再看一看他的收入状况啊,所以如果要收入状况非常非常穷啊,买个冰淇淋都买不起,不好意思啊,一票否决权取不了了,如果他今天诶收入状况很高,那不就是高富帅吗,好去所以就去了,对吧好,如果他的收入中等。
我要看一看有没有时间陪我对吧,所以是不是公务员好,如果是公务员的话,好建,不是公务员的话不建,而这个很符合大家的日常生活,做决策的这样的一个过程对吗,所以人做决策的时候,有时候是这样一种更直观的过程。
我我才不会去做什么数学计算呢,我就是一些规则,这个东西翻译成程序语言是什么,对呀,它就是if else if什么什么什么,我怎么怎么样,else啊,if啊,怎么怎么怎么怎么样啊。
那else再不是的话怎么怎么样,OK所以他是这样的一个诶,如果怎么怎么样就怎么怎么样,如果再怎么怎么样,就怎么怎么样,如果都不是我怎么怎么样,是这样的一个房事,去判断这个小姐姐是否去参加这次相亲好。
所以我们把这个东西做一个抽象呢,大概是这样的,我们会拿,我们会从左边这个小姐姐和妈妈对话当中,去得到这样的一个决策树啊,这就是一个决策树,所以这棵决策树实际上很清晰,他给了他的每一个分支。
实际上就是你会根据一个,你会根据这个条件的取值去做一个判断,OK顺着这本书往下走,走到叶子节点,你就可以拿到你要的结果,所以这个模型是,这显然也是一个可以用于决定,我到底去不去参加相亲的。
这样一个二分类的一个模型,这个模型是有它独特的特点,它的特点是什么呢,它很简单很简单吧,它甚至不需要去做数学的计算啊,我就是一堆的规则,我做预测的时候就是顺着这个规则往下走,我就拿到结果了。
第二个他的逻辑非常清晰,对不对,它相对于我前面数学自动的那种模型,它的逻辑非常清晰,我就是去做一个条件判断他的年龄怎么样啊,大于小于他的长相是什么样的水平,OK她的收入是什么样的水平。
OK他的可解释性非常好,对不对,如果今天小姐姐告诉你说,OK这个人我去见,那你就可以知道他为什么去见,你就可以基于这些条件去判断说为什么他见哦,是因为这个人收入很高,然后他的年龄和长相也还OK。
所以他们把这种模型叫做透明的,叫做叫做transparent,透明的,所谓透明的意思就是,它它对用户而言是直接可见的,你是知道他为什么去做这样一个角色。
为什么做了这样一个判断好了,所以大家已经见到了这样的一个结构,那么我们来我们现在来给这棵树,这个决策树这个模型做一点小小的定义,决策树是一个基于树的结构进行角色,这样的一个model。
那这个模型它有它自己的特点哦,大家仔细看一下,每个内部节点就是这个地方绿色节点,OK那这个地方的内部节点,就是这个地方的绿色节点,大家看到了啊,这些绿色节点啊,那它是什么呢,每个例子。
节点是不是针对某一个条件去做了一个判断的,就是针对某个属性去做了一个判断呢,所以我上最上面的类似节点,对年龄做了一个判断,第二个类似的节点对长相做了一个判断,第三个绿色节点对收入做了一个判断。
在下面一个绿色节点针对公务员做了一个判断,那我们再看一下每个分支,是不是对应这个判断的一种可能的结果呀,如果它小于30岁,他就走左分支了,他大于30岁,他就走六分制了。
所以这个地方的每一个分支实际上是一种取值,对不对,他要不在这个范围内,要么就是说OK他的收入,他的长相是什么样的程度,所以某每个分支都是一种可能的结果,或者说这个属性的取值。
然后这个地方的每个叶子节点是什么呀,我们说了,顺着这棵树往下走,他如果走到了叶子节点,他拿到结果了,所以叶子节点就是结果呀,就是你的预测结果好,所以这棵树就长成这样,但是这棵树它不是平白无故出现的呀。
这个小姐姐一定是根据自己多年的这个,这个追剧的这些经验对吧,看了不少的韩剧,OK所以就养成了这样的,不不是养成了,就是培养起来这样的一种判断的标准,所以说所以说唉当我有一个小哥哥来的时候。
我可以去做一个判断好,所以这个学习的过程,实际上就是通过不断的去看韩剧,去通过这个训练样本的分析,来确定说我划分属性到底是什么,我最看重什么,我最看重的是帅不帅,是高不高,是有没有钱还是高。
是有没有钱还是高,是有没有钱还是年龄怎么样,所以这棵树是慢慢长出来的,你得去看看他最关注什么,然后看他在关注什么,再看他关注什么,OK好,那预测预测的过程当然非常简单了。
预测的过程就是直接顺着根节点往下走就好了,你是有一个条件就走哪个分支呗,你往下走,直到你碰到叶子节点,结果都取出来了,这里就叫做叫做决策树,好了,说了半天,你知道这个东西长什么样了,你知道这个东西呢。
呃我怎么去完成它的预测,诶,我好像不知道这个东西怎么得到对吧,所以所以我怎么知道小姐姐,她对哪个东西最最最看重了。
这个就是我们需要去了解的信息啊,所以这棵树的生长的这个过程呢,总总体的流程是这样的,大家先建立一个基本的概念,它有一个总体的流程,它总体流程是一个分而治之的一个流程啊。
一个divide and conqueror分支的一个流程,我会自根节点至叶子节点去做一个递归,所以这个地方自根节点和带叶子节点,去做一个递归,去做一个递归,然后,大家看到这个地方呢在每个中间节点。
实际上他会去寻找一个划分的属性,然后这个地方有三种终止的条件,就是这棵树它会一直生长对吧,但它不能一直长下去啊,你总得涨到什么时候,这个小姐姐总得在判断若干个条件之后,就知道我到底去不去参加相亲对吧。
去不去参加这个相亲,对不对对啊,大家能听到我声音吗,大家能听到我声音吗,啊不卡对吧,那个大家切换一下路线啊,我这边我这边是没有问题的,我这边的掉帧率是没没有掉帧率的,我的我这边是百兆的啊宽带。
所以大家那个那个切换一下自己的线路,有可能是这个切换一下自己的线路,有可能是这个直播平台的这个线路的问题,对OK好,所以这个地方呢我这个地方的这一行,说的事情是我需要去了解什么时候停止。
就是这棵树什么时候停止生长啊。
你总得长成一棵这样的树,这个小姐姐才知道说我如何去,做预估吧或者做预测吧,啊现在大家能听到我声音吗,我再问一遍,能听到我声音吗,啊你们切换一下线路好不好,你们切换一下线路好不好。
对我这边的话做不了什么东西啊,因为我这边显示是OK的状态好不好,好那个啊,对我我我我知道您反映的情况啊,你们切换下线路试试看,因为我这边做不了调整,Ok,我这边我这边的带宽和掉帧率,是没有任何问题的。
所以我不知道怎么去调这个东西好吗,好不好,好那个大家先听啊,如果你在听的过程中实在忍不了了,你跟我说,我我再看一看是不是用流量给大家讲个课,好不好,因为我家WIFI应该是没有问题的,好的好。
所以这个地方呢其实像我们要做的事情,是这样的,我知道了,这棵树长成这样,我下面要解决两个问题是第一怎么长,OK第一怎么长好,第二涨到什么时候停,Ok,对不对,我需要去解决这样的问题,对吗好。
所以我需要解决两个核心的问题是诶,我知道这棵树长成这样了,但是请告诉我怎么去长出这样的一棵树,我已经有一堆的数据给你了,我有一堆的韩剧准备好了,小姐姐去看好,但我我我得知道这一堆的韩剧看完之后。
它的判定依据是什么,就是这棵树的怎么去得到啊,怎么找,以及涨到什么时候去停啊,因为你不能说你让他一直涨对吧,你总得说你总得告诉我说,你满足某些条件的时候,你到底去不去参加这次相亲啊。
对吧嗯好的,所以这个地方有三种终止的条件,第一种条件是当前节点包含的样本,全属于同一个类别。
意思是什么呢,我看了这么多的韩剧,所有韩剧都告诉我说,如果这是这个小哥哥是一个年轻有为,长得帅,然后收入又高的这样的一个小哥哥一定要建好,所以所有的韩剧都告诉你这件事情说要建好,所以那就不用。
那就大家都达成了统一的意见啊,我不需要我不需要再去做做什么呃,这个别的条件判断了,所以这样的情况下又高又高又不是高啊,就说这个年又年轻,长得又好又帅,收入高频,我没见对吧,大家都见啊。
所以这个时候大家意见一致,OK那我就拿到了一个结果,不需要再不需要再往下涨了,结果一致好。
那第二种情况是什么呢,当前的属性即为空,或者所有样本在属性上的取值相同。
无法无法划分,什么意思,就是这个是这样的,他今天看韩剧了,他发现一个很纠结的问题,这个很纠结的问题就是男2号也很年轻,也很帅,也很有钱,但是韩剧里头的很多小姐姐不见了,这个就有点小尴尬了啊。
所以这就是你找了好多韩剧过来,你发现诶都是这样的情况,走到这了,有些建了,有些没有见,我好像这个都是一样的条件,有些建了,有些没有见对吧,可能就不好判断了,这时候我就没有办法。
我就我就我所有条件都一模一样,这个时候你还有些看,有些不看,有些贱,有些不见,那我也找不到其他的条件去做区分了。
对吧,所以这个时候你就要停,那个大家听这个课的时候,跟着我的思路来好吗,你们你们现在有疑问是正常的,因为你第一次见到这个东西,等往后讲你的疑问就没了,所以你们可以先提问。
但是我不一定会马上解答你的问题好吧,所以记住了,第一种条件是说所有的韩剧都告诉你说,要去见他,第二种条件通常情况下是告诉你说,哎我所有条件都一模一样,这两个人的这两个人的条件完全都一模一样啊。
你说的没呃,我不好意思,我看到大家提问这个问题,但我们没有理解大家的意思是什么,第二条的属性取值相同,和第一条有什么区别,第一条告诉大家的是,我只要满足有钱,所有韩剧告诉你,只要满足有钱全都要满足。
有钱全都要满足,有钱全是它的属性,我不用考虑了,明白吗,就是这种终止条件,意思是说,如果今天韩韩剧里头告诉我大于30岁,我就不见了,我其他东西都不用看,明白吗,就是只要满足这样的属性。
满足这样的条件全都一模一样,结果全都一模一样,我就不需要去区分了,我这个时候就终结了,OK我有这个条件,一票否决,我就终结了,我不看去不去看有没有钱,不去看是不是公务员不用看了,你能力这么大。
我叫你干嘛,OK所以这是第一个条件说的事情,第二个条件说的事情是,我把所有的属性全都取出来了,这些所有条件都一模一样,这个时候还是有时候见,有时候不见,它,是不是没有办法再往下生长了呀,你要往下长长。
总要去找到一些不同的条件去做区分吧,要不就是这个高那个矮,所以你不你你去见高的,不去见矮的,那如果他都有钱对吧。
他都都有钱,都年轻,都很高,都很帅,还是有些小姐姐不去见,有些小姐姐去见了。
这个时候你告诉我,你还能找到什么条件去做区分,你找不到了,所以这是第二个条件,告诉我们说所有样本所有属性上的取值都相同,我找不到属性,找不到其他的判定标准去区分它了,我说明白了吗,这是一和二的区别。
对有人总结的很,有同学总结的不错,一个意思是说我在这个条件下,所有标签都一样,二是我所有属性全用完了,或者说所有属性都一模一样,但是它的结果还是不一样,啊这这个叫什么OOOIS的,这位同学不要太着急。
呃,我没我还没有给大家讲到如何去做预估,我现在在讲什么时候停,至于停到了之后选什么还没有讲到,不要着急好不好好吗,所以不要跳啊,就是大家稳一点啊,好的,所以我说清楚了吗,第一种情况和第二种情况。
我有我我给大家说清楚了吗,好那第三种情况是当前节点包含的样本即为空,就是呃就是没没有没有样本了,所以这种情况下你是没有办法去划分的。
所以记住了这个地方,当出现这种情况的时候啊,这个小姐姐看韩剧总结到这些情况的时候。
她就有心里有数了,就说OK这个看这个不看,或者说这个不能再分了啊,不能再区分了,请大家条件都一样好。
所以记住大家了解的第一件事情是什么啊,就是这两件事情啊。
涨到什么时候停啊,已经知道了,涨到什么时候停,嗯对下面这这这页有点有点懵,好看的对吧啊,这个地方是从周志华老师的西瓜书里摘出来的,一段伪代码,听清楚啊,是一段伪代码,然后看代码大家都很头疼对吧。
所以我也不需要大家去看,我嘴里头框出来的一些东西,大家看清楚了,我框出来了一些东西,我框出来了一些东西,所以这个时候框出来的东西是,你,什么时候停。
同学说第三个终止条件没有看懂,三是没有输入数据啊,没错有同学说的对,就是你这个店里头有红色,有蓝色,有紫色的衣服,OK我要决定他买不买,本来是衣服是有这三种颜色的,今天紫色卖光了,不好意思。
我到这个地方去做分叉的时候,有三种颜色,紫色的,今天店里头卖光了就没有了,你不能甩这个东西就停掉了,这肯定肯定是没有的,然后另外两个你是可以继续往下找,OK没有对应的样本了。
然后大家往下看呢,这个地方是一段伪代码,伪代码呢其实那个大家要读也读得懂啊,大家要读是读得懂的,我就是把刚才的三个终止条件写到这,这是对应第一类的终止终止条件,这是对于第二类的终止条件。
这是对应第三类的终止条件,好这个我不给大家念,你们自己去对好,现在这里头有个我用红色加粗的部分,在这红色加粗加粗的部分,这个家最近在说了一件事情,小姐今天得判断一下我,我到底现在最看重的是什么。
比如说你今天要在北京或者在上海买个房子,你手头上的钱有限,那你手头上的钱有限,肯定不能所有所有条件都满足,对吧哦,我要学区房,我要房子要大,我要防止新,我要防止这个采光好,户型好,交通便利啊。
哪来那么多钱,所以你钱有限的情况下,我们要怎么样要取舍嘛对吧,所以你要举手的话,他就问你一件事情,说,那你买这个房子,老哥你买这个房子,你最看重什么,你最看重什么对吧,什么样的东西是你完全接受不了的。
你看都不会看的,那有些人会说这个房子朝北的,完全不看,而有些人会说这个房子的年龄啊,这个房龄是他的房子,这个建造时间是在90年以前的,完全不会看,OK好,所以这个地方这个我用红色的这个底色加粗的。
这个部分是很重要的一点,他告诉我们说,我必须要去决定,小姐姐现在去做这件事情,最关注的点是什么,当前最关注的点是什么,这是最重要的点,大家听清楚啊,一会儿我们会讲到三种决策树,这是决策树算法的核心。
你之所以会有三种不同的决策树,很大程度上是因为他们在做做这件事情的时候,有不同的方法,但他们都达到了这样一个目的,所以记清楚啊,终止条件我说完了,那如果他不终止,要怎么样,不终止的话,这棵树要涨怎么涨。
你得去判断你现在看重什么好。
我们来到这个问题,你现在看重什么,插播一点小小的数学知识啊,不要害怕,这个地方有一些公式,我来给大家,以比较直接的方式来给大家介绍一下,这个地方的数学公式,你见到的第一个概念叫做熵。
这个概念是一个物理概念,所以物理老师会告诉你说,整个宇宙是在朝着熵变大的方向去发展的好,这个东西听起来逼格就很高了对吧,那什么叫做商,其实啊一点也不高级,这个东西是一个一个度量标准。
这个东西信息上所谓的entropy,它度量呢就是一堆的样本,它的纯度纯度什么叫做纯度,没有杂质就纯了对吧,有不同的东西混在一起,它就不纯了对吗,所以它是用来衡量纯度的一个概念,然后这个时候一个指标。
这个时候呢大家先看怎么算,我一会给大家解释,假定当前的样本当中,集合当中第K类所占的比例是pk,听清楚啊,今天有一个蛋,这个蛋里头有三种颜色的球,分别是蓝色的,红色的和黄色的,好,我们举这样一个例子好。
所以这种小袋里头就有很多很多的球,他们有三种不同的颜色,蓝色红色和黄色,那个这句话的意思就是说我告诉你说,我的蓝色啊取值是对他的这个比例是P1啊,红色比例是P2,黄色黄色比例是P3。
那大家告诉我这个西格玛P等于多少,西格玛I等于一到,不知道有多少类啊,假设它有N类,那一到N的这个PPI它应该等于多少,大家告诉我这个东西等于多少,你所有东西加在一起的比例当然是一啦,有问题吗。
没有问题啊,就是加在一起概率等于是一,好好问大家一个问题,问大家一个问题,哎我今天问你伸手进去摸球,然后我问你一个问题,我说哎小哥哥,你伸手进去摸这个球,你能告诉我你你你猜一下,你摸出来的是什么球吗。
然后我问你一下诶,如果你现在有你这三种颜色里头,有90%的球都是蓝色,你伸手进这个大眼睛去摸这个球,你会告诉我是什么颜色,你当然会告诉我是蓝色了,因为90%的球都是蓝色,我当然猜最多的那个了。
而且什么时候最不肯定啊,我问大家什么时候这个事情是最不肯定的,是不是三种球的,这这个袋里头这三种球的数量一模一样,你你猜不出来,你没有办法去取一个最大的,你新手进去摸它就是一个随机的啊,我说的三种球啊。
不要和0。5没有关系啊,就是大家那个跟着我的节奏来,有三种球,那我应该是,那我应该是什么样,三种球都是一样多,1/3,对不对,如果他是1/3,我伸手进去摸,我现在就很很懵。
他跟我说小哥哥小哥哥现在这里头最你,你觉得摸出来的这个球概率最高的是什么球,我不知道,因为这三种球居然数量也一样,所以这个地方的信息熵度量的是一种啊,不纯度就是这个值越大,它的纯度越低,这个值越小。
它的纯度越高,那大家告诉我,这个信息熵在什么时候去取到它的最大值啊,什么时候我的纯度是最低,我的不确定度是最高的呀,听清楚我的描述啊,纯度润最低,不确定度最高,对没错,在你每个类别的比例都一样的时候。
哎大家大家高中的时候就学过不等式对吧,我问大家那个不等式哦,不等式它的它的它的这个不等式的,它的一般什么时候取到等号啊,不准是他什么时候取到等号啊,通常情况下是相等的时候对吧,是那几个东西相等的时候。
比如说A等于B等于C,对不对,所以这个地方的entropy取到了极值,取到最大值的时候,也是这个地方的pk相等的时候,能能明白我意思吗,如果这个东西衡量的是一个不,一个一个混乱程度。
或者说它的一个不纯度的话,他什么时候取到最大,什么时候最混乱,是不是所有的pk都相等,是不是所有的pk都相等,是不是伸手尽力了,带头去摸球,所有球队所有颜色的球数量相等,有问题吗,这个地方有问题吗。
没有问题,对不对,好记住了,记住了,有这样一个概念,它叫做安全比,叫做西,它叫做安全比叫做西,它叫做安全比叫做细,他这样去算,他这样去算这个东西在所有的pk相等的时候,取到的值是最大的。
这个时候你最不肯定最不肯定,你完全你完全,你完全不知道自己摸出来的是什么样的颜色,这个东西叫做信息熵,好记住了,信息熵描述的是什么,是不纯度,就是他描述的是它的一个不纯的程度。
所以这个东西越大,它的不纯度越高,它越小,它的不纯度越低,它的纯度越高,OK听清楚了啊,那你想决策树如果要去完成一个判断。
我是希望我的肯定度越来越高,对不对,而我是希望这棵树,你你希望这个规则产出以后,我能更肯定一点点,我能更肯定一点点有问题吗,啊我我说一下,我说一下,这个地方表示的是它表示的是Y的类别数量,听清楚啊。
这个东西不是Y的绝对值啊,它是Y的类别数量,它是一个标记,它表示我有多少种不同的label,有问题吗,所以K等于一到底有多少种不同的label,比如说红黄蓝是三种,所以就是从1~3。
这不是什么Y的绝对值啊,这个绝对值没有关系,这个东西就是一个标记,它表示有多少种不同的label哦,说到就就就点到这好吧,然后你想想啊,诶为什么我需要机器学习的模型啊,机器学习模型是为了干嘛呀。
为了做预估诶,预估是为了为了怎么样,为了提前去拿到一个可以去猜出来的一个答案,或者是提前去预估出来一个答案,所以如果你这个模型构建的足够好,是不是去把我的这个地方的不确定度,降得足够低啊。
这句话有问题吗,你的机器学,你想想机器学习这些模型的本,他希望做什么样的事情啊,他是不是希望去让我提前拿到一个,预估的结果呀,是不是提前拿到一个预估的结果呀,是不是让我未来的不确定性尽量的低啊。
所以我希望这棵树在生长的过程当中,能让现在我对于我训练的数据,它的不确定度越低越好,你最好能让我现在很肯定的,就根据你这个规则就知道这是哪一类,根据另外一个规则就知道是另外一类。
所以这是机器学习模型想要做到的事情,他想让这个不纯度往下降,他想让这个不纯度往下降,他想让这个纯度往上升,他想让我去做预估的时候,这个事情足够的肯定,所以这个时候我有了一个东西去度量,我现在的不确定度。
度量我现在的不纯度对啊,我现在的不纯度,我是不是在每一次生长的时候。
我希望我基于这个规则,可以让这个不纯度往下降啊,好来这个地方又有公式好,不要怕公式,我给大家解释一下,他说了一件事情,他说嗯这样这样这样,现在电商里头这些,现在电商里面有这样一些衣服的颜色啊。
衣服颜色分别是什么呢,OK分别是这个这个啊黄色啊,蓝色,哎呦那大家等我,大家等我半分钟好不好,等等我半分钟好吧,现在OK了是吗,好的可能是直播平台的问题好吗,好所以我接着往下讲了。
记住我刚才记得我刚才说什么吗,我刚才说了一个东西叫做不纯度,叫做不确定性,不纯度机器学习模型,为了干嘛把不确定性往下降,我希望这个东西越来越纯,我希望越来越肯定,所以我们来看看怎么做。
假设我现在有一个属性取值叫做红黄蓝好,所以一个小姐姐来买衣服了啊,红黄蓝啊,红黄蓝号那个小姐姐,一个小姐姐来买衣服了,诶诶那个如果我现在不确定这件衣服颜色啊,我就告诉你说OK有一件这样的衣服。
那肯定是有一些小姐姐买了,有些小姐姐没有买嘛对吧,所以呢哎这个地方呢,就是在我没有根据这个属性往下生长之前,大家听清楚啊,肯定是对于这件衣服呢,肯定是有些有些小姐姐买了,有些小姐姐没有买。
所以这个时候他是不是在这个数据集上,我可以基于买和不买计算出来一个不确定度啊,不纯度啊,是不是可以计算出来一个信息熵啊,告诉我这个有问题吗,比如说有十个小姐姐过来,这十个小姐姐当中有啊。
那个四个小姐姐买了,有六个小姐姐没有买,是不是可以基于这个东西去计算出来,一个不确定性啊,有问题吗,没有问题对吧好,那如果现在新加了颜色,颜色有三个分支,所以这个地方是蓝色,这个地方是红色啊。
衣服的颜色啊,这个地方是黄色,OK那这些小姐姐是不是可根据这些衣服啊,就是她最后有没有买件衣服,衣和衣服的颜色有关系吧,所以我根据衣服是不是颜色,是不是可以把它分到几个不同的袋里头啊。
我是不是可以把它分到几个不同的袋里头啊,所以这个地方有几个不同的袋里面的话,每个袋里头都会有一些样本,但是因为我把我按照这个东西去区分了,所以它的肯定度有可能会变高对吗,所以这个时候这个东西就是。
我在基于现在的这个属性取值,划分之前的这个地方,它的交叉熵,而我说也不是交叉商,他的信息熵,他的信息熵是划分以前的信息熵,后面这个东西是什么呢,对后面这个东西是分成的,每个代理头新分成了三个蛋。
每个蛋里头它的不确定性,但是因为我的样本量减少了呀,所以我要给他做一个加权,我在前面这个地方不是绝对值,我重复一遍,这个东西不是绝对值,这个东西表示这个集合的数量,这个集合的数量。
我总共说了多少个小姐姐去买这件衣服啊,总共有十个小姐姐,我记忆不同颜色区分以后会有多少个小姐姐,对,在这里头也许是啊,我随便举个例子,也许它是5+3加二。
所以这个东西是数量好,所以我在我给大家说一下,这个事情实际上是什么样的呢,是说诶我在做划分之前,我可以计算出来一个不确定度。
不纯度我可以确定出来的不纯度,我在划分以后,我基于某一个东西去做判断了,我基于这个人的年龄大小,我去判断一下我要不要去要不要去和他相亲,我记得他是不是有钱,我去判断一下他是不是要相亲。
所以这个时候它会被分到不同的同类,而每个同类里头都可以算出来一个不纯度,这个时候我会用它这个桶中的数量比例,数量比例去做一个加权,我用这个东西去衡量说,当我用这个离散的属性去做区分的时候。
我的不确定度有没有往下降,我的不纯度有没有再往下降,降了多少啊,所以听懵了是吧。
听懵了是吧,好没关系,听懵了,我们来找个例子,这个地方的例子来源于周志华老师的机器学习,西瓜书的数据集,好的,所以这个问题很简单,我们最终的目标是为了去判断一个西瓜,到底是好西瓜还是坏西瓜。
最开始啊把西瓜什么各种都把西瓜包起来,你不准你去碰,不准你去看我,我只知道最终的结果诶是这样的好,最终的结果呢有有总共会有17个西瓜,这实习西瓜当中有八个是好西瓜,有九个是坏西瓜。
哎你告诉我能算他的信息商吗,就是如果我现在给你17个西瓜,这17个西瓜当中有八个九八个好西瓜,九个烂西瓜,然后把它一起放到这个袋里头,让去摸,你能知道你的不纯度是多少吗。
有公式的嘛,带进去算就好了,所以往里面一代是不是就算出来,信息上长这样啊,0。998,这个值挺大的,你想一想为什么挺大的,八个好瓜,九个坏瓜差不多呢对吧,一半一半一半一半,对吧是吗是吗。
是不是有一半一半,所以这种情况下不确定度肯定很高啊,所以这个0。998,实际上就代表说不确定度还挺高的,诶,那我能不能去找一些其他东西来做,做一些判断的,所以他就找了。
他说前面不是有些信息吗,诶那那不如取下颜色好了,我把颜色取过来总行吧,所以他把颜色调过来了,他就把颜色调过来,他一看。
他说啊那个有多少种不同的颜色啊,好我来看一下,有青绿,有乌黑,有浅白,好,好像就这三种,诶我记得这个颜色色泽等于青绿和乌黑和浅白。
我可不可以把这些西瓜分到三个袋里呀,我可不可以现在把它们分到不同的桶里头啊,我找三个桶过来,我把这些细胞按照颜色分到不同的桶里,可不可以,OK所以你把它分到不同的桶里,我问大家一下,你分到不同的桶里。
是不是桶里还是有好瓜和坏瓜呀,对啊所以这个时候我们来看一下这个地方。
盐分为亲密的瓜,有这么六个瓜,这六个瓜里头有三个好瓜,三个坏瓜,所以我算了一下,在第一个桶里面,它的不确定度是一在第二个桶里面呢,在颜色是乌黑的桶里面呢,在颜色是乌黑的桶里头,我算了一遍,它是0。
918,在颜色为浅白的,同理呢对颜色为浅白,同理我算了一下,它的大小是0。722,所以我基于刚才的公式去算一下,大家看到的这个地方,0。998,0。99998,实际上是原来的不确定度或者原来的不纯度。
听清楚啊,原来的不纯度,那我现在后面这个东西呢,对后面这东西是我现在的不纯度,就是我基于颜色已经分到三个桶里面,我积分到三个桶里面以后,我这三个桶里面的数据,我算出来的一个平均的近似的。
平均的加权平均的这样的一个不确定度,是不是不确定度降了多少啊,你看他说老师老师这个我明白了,他不确定度降了0。0。109呗,对呀不确定度降了0。109啊,哎这是我唯一的属性吗,这不是唯一的属性啊。
还有好多其他的属性呢,好那我把其他属性拿过来,我是不是我在前面这个数据集当中。
是不是还有这个属性啊,是不是还有敲的声音啊,是不是还有纹理啊,是不是还有起步,是不是还有触感呢,对我把每个都拿过来算一遍。
按照一模一样的方式,大家告诉我有多少种取值,我就把它分到几个桶里,我按照一样的方式去算,分桶之前的不确定度和分桶之后的不确定度,我就看看这个不确定度下降了多少,这个东西能够提供多少的信息。
让这个不确定度下降,这是决策树想做的事情,所以你用同样的方式,你按照耕地去做风筒,你按照敲的声音去做风筒,你按照纹理做风筒,你按照起步做风筒,你按照触感去做风筒,它都可以算出来一个不确定度,下降的程度。
你发现哪个下降的最大呀,哪个下降的最大呀,纹理下降的最大嘛,所以是不是基于纹理先去做区分呢,是不是基于纹理先去做区分呢,OK好啊,所以记清楚了,这个时候呢,你的你的这些西瓜已经被分到了三个桶里。
你的西瓜已经被分到了三个桶里,结束了吗,没有结束,继续往下涨。
分到左边这个桶里头的西瓜,可不可以再基于其他的东西去做区分,用一模一样的方式啊。
听清楚啊,你这棵树涨到这一步以后,这个又是一个数据集合,这个数据集合还是不确定还是有好瓜还是坏瓜,所以再往下找,接着去判断,到底哪个东西能让我现在这个桶里头的西瓜,能够不确定度下降。
最多我再去扫描一遍这个地方的耕地,敲声起步,触感和色泽,所以大家能感受到这棵树是怎么生长的吗,我说清楚它的过程了吗,它每一次分桶,每一次的生长,都是希望让我现在的不确定度下降,最多朝着这个方向去找。
好我希望大家没有问题,OK好,所以这棵树就会一直往下涨,涨到什么时候停,涨到什么时候停,是不是说终止条件1231233个终止条件,是不是说只要满足任何一个终止条件就停掉,它就停掉它,然后给一个结论。
OK好好。
这个这个很伟大的模型呢。
或者说这个很伟大的这个决策决策树的模型呢,叫做IP3啊,叫做D3对,它是一个递归的,没错它是一个递归的这个算法啊,就D3K好吧,他这个id3记住了ID3是基于什么,是基于信息增益,记住了啊。
这个东西是会会考考试,那个面试的时候会问的啊,ID3是基于信息增益去挑我最优的划分属性,去挑哪个条件对我现在而言是最重要的,记清楚了。
好诶诶这个信息分析有他的问题哦,信息分析有他的问题啊,为什么会有他的问题啊,我给大家举个例子,班上有45位同学,但这个45的同学,每个同学都会有一个学号,一号2号三号,一直到45号。
老师今天说哎呀我想研究一下,我想研究一下这个呃,这些同学到底成绩好还是不好啊,有没有办法呀,你说老师老师我知道用决策树呗,然后决策树的话,老师说,那那就把他的这些所有的因素都拿出来吧。
每天花多长时间学习,对吧啊,父母亲是什么样的学历状况,OK然后平时的这个听讲的这个程度等等,都拿进来诶,他不小心拿了一个另外一个东西进来,叫做学号,他把学号拿进来了。
哎大家想一想学号有多少种不同的取值啊,学号有多少种不同的取值啊,45种对吧,我分45个叉,我分到45个桶里头,每个桶里头有多少个同学,每个桶里面有多少个同学,你告诉我,每个桶里面一个同学对吧。
分45个差,每个每个桶里面一个同学,一个同学,我还不好判断它好不好吗,我直接告诉你答案了,我直接告诉你说,43号同学是一个超级牛逼的一个学霸啊,2号同学是一个学渣,唉,但拜托啊,这个东西有用吗。
你新来一个同学,他的学号是46诶,46往哪走啊,他没有用吧,所以这是这是T3的问题,T3的问题就是说它它对于这种有特别多取值,特别的取值的这种属性有特别强的偏好,因为你想一想,分叉分的越多。
他是不是越开心,每个桶里面的数量越少吧,因为少他有可能越肯定嘛,所以他特别喜欢去挑这种数目非常非常多,分叉非常非常多的这种属性,这是他的一个问题,T3刚才用信息增益就有这个问题,所以怎么办呢。
他思考了一下,他说这个根本原因,说这个时候有好多分叉的,有好多分叉的,所以有好多分叉,那有好多分叉,带来的这个信息增益的绝对值很大,绝对值很大,绝对值很大,我们说的绝对值是不可靠的对吧。
就是我们我们昨天给大家讲到课里头,我说我用线性回归加阈值,我们阈值定不下来的,所以我一直定不下来的时候,我怎么办呢,绝对绝对值没有用的时候用相对值呗,所以他这个地方给了一个分母,他给了一个分母,诶。
你刚才哪个桶里面一个同学啊,你45个学号,45个桶里头,每个桶里头一个同学啊,哎我问你哦,这个分母是什么,大家告诉大家,现在告诉我这个分母是什么啊,这个这个不是绝对值啊,再说一遍,这不是铜里面的数量。
你们告诉我你们现在看的这个IVA,你们告诉我这个东西是什么,我们记得那个公式吗,负的sigma啊,p log p这个东西叫什么,这个是什么的信息商,这个是不是我刚才这个属性的信息熵啊,是不是我这个属性。
我基于这个属性去看它的分散程度,它的一个伤啊,哎你告诉我刚才分45个分支,这个值有多大,哎45种颜色啊,进去都一模一样啊,我进去伸手进去摸球,它的概率它的不确定度有多高啊,高的很,你别看你的分子大啊。
你别告诉我说你别告诉我说你的分子大没有用,我的分母也大,我的分母也大,所以这是叫做信息增益,听明白了吗,信息增益加了一个分母,这个分母呢会随着你的分差不多啊,我直观的这样说啊,这个表述是不精准的。
但但但对大家的理解可能是有帮助的,就是它分叉多的情况下,它的分母也多,把分母也大,但分母也大,有问题吗,所以这个地方的gun ratio这个信息增益率,他加了一个分母,他说不好意思,你啊。
取那个信息增益大的不够,我得看一看,原来这个属性有多分散,原来这个属性有多分散,OK所以记住啊,这个地方是第二种决策树的模型叫做C4。5,C4。5和D3很像,差别就在于说他选了信息增益率。
他选了信息增益率去作为我的一个判定的,作为我一个特征,我的属性选择的一个判定标准,属性选择的一个判定标准好,我希望我给大家说清楚了,所以到目前为止,我们学了两种不同的角色数,一种叫做D3,一组叫做C4。
5,他们都会往下涨,涨到什么时候体验对这个条件吗,123,那怎么涨去挑最重要的属性,怎么去挑最重要的属性。
信息增益,信息增益率好往下走,这是唯一的思路吗,当然不是,这个地方有另外一个有另外一个数学的指标,叫做DEMIDEX,基因系数,基尼指数这个东西又来数学公式了,看着就烦对吧,没关系。
我给大家解释一下这个是怎么得到的,诶我还问大家啊,这个地方这个地方有小球啊,有两种颜色的小球,黑和白的小球,黑白啊,黑和白色小球诶,我怎么去判断它的纯度怎么样啊。
就是因为有个袋袋里头有有黑色和白色两种球,然后伸手进去摸对吧啊,伸那个伸手不见五指啊,然后你看不到,所以你进你进去,你进去去去摸,你定义序幕,哎,这个时候我除掉我刚才说的方式,去衡量它的纯度。
我有没有其他的方式,所以这DINDEX从你他做了一件这样的事情,大家仔细听啊,他做了一件这样的事情,他伸手进去,摸了一个球,他伸手进去摸了一个球,他又伸手进去摸了一个球,他他在小本本上记下来了。
他摸了第一个球,大家听清楚了,他摸了第一个球,他在小本本上记录一下,说OK这是第一种颜色,他摸到第二个球,他把他放回去了,他把他放回去了,他又摸到第二个球,他摸出来以后,他又记录一下这个颜色叫做C2诶。
我问大家那个纯度高的时候,摸到我摸出来的这两个球,颜色一致的概率是不是会很高啊,如果全是黑色的球,我连摸两次,我摸这个球是不是都是黑色啊,有问题吗,什么时候我摸出来的球。
它的颜色不一致的可能性会比较高啊,哎是不是说我这里头两种颜色都一样,那我去约的时候都是1/2的,可能是不是这个时候不一致的概率就高了,有问题吗,好没问题好,所以我们再来看看公式。
告诉我告诉我取到DK类的概率是多少,取到第K类的概率是多少,是不是pk,我摸一个球的概率是不是pk嗯,我再去摸第二次概率是多少,是不是还是pk,我是不是用一减去摸到所有摸出来的两次。
都是黑球和摸出来的两次都是白球的概率啊,这个公式看懂了吗,这个公式我这么讲,看懂了吗,是不是相当于我摸两次全是黑球,可以摸两次全是白球的概率,我要把它剪掉,我要用一减掉,它是不是要用一减掉。
西格玛所有的不同的类别,以及两次摸出来的都是这个类别的概率,那两次摸出来的就是不一样的,对不对,好没问题好,很聪明啊,大家都很聪明,所以你们理解了,说哎这个东西好像也能衡量它的不,它的这个纯度对不对。
好像也是可以去衡量它是纯度的啊,他的这个不纯度的sorry,他的不纯度的OK好,所以我是不是要去找到不纯度最小的属性啊,我是不是需要去找到使得划分以后,所以你看数学这个东西很神奇对吧。
他换了一个角度去解释这个问题,他换了一个角度去解释这个问题,但是你发现它依旧是合理的,你想这个事情你说太合理了,这个事情对吧,我连摸球都有这么多种这么多种不同的玩法,好接着往下走。
这个地方诞生的这个算法叫做cards cut,是一种二叉树,听清楚啊,cut和D3和C4。5的C4。5的差别在于,它是一个二叉树,它是二叉树,然后这个二叉树它用于选择属性。
选择现代划分属性的方法叫做他的不是方法,它的评估的指标叫做GUIDEX,看你翻译啊,这个东西是偶然吗,他是偶然吗,他不是偶然,数学真的是一个很神奇的东西哦。
所以如果大家来看一下负的PROGP,p log p啊,所以这个地方的负log p4p log p4的log p,它可以做一个什么,泰勒展开它的菜单展开约等于一减X,把高阶无穷小忽略掉。
把高阶无穷小忽略掉,它只只保留一阶的,所以这个时候约等于一减X,这个公式我不想多说啊,泰勒展开,我真的不想多说,他要展开也不想多说,那个有有同学没有看前面的数学课的吗,为什么要补那个数学课。
就是因为在后面的部分,我会涉及到一些数学知识点,但我并不想把这个课讲成一个数学课,所以大家最好有一点点的数学基础,包括微积分,包括这个地方的啊,后面的一些矩阵相关的一些知识。
所以这个地方就用到了一个数学的知识,叫做泰勒展开,叫做泰勒展开,所以如果你作为一个泰勒展开,你发现什么这俩货其实是一模一样的,你你不要以为是什么,DINDEX和和,现在这个我的这个信息商去去做这个呃。
是这个这个取法要求的这个取法是一致的,它是一种偶然,它不是偶然,它在数学上证明,这两个东西就是约等于基本上就是一致的,所以这个东西你用泰勒一展开,它的展开就变成这个,我再给大家写一下这个东西。
K等于一到大K它相当于pk对不对,减去pk的平方,对不对,好这个东西大家告诉我,K等于一取到小,K等于一取到大k pk这个东西等于什么,这个东西等于什么,这个东西等于什么,大家告诉我,对这个东西等于一。
所以发现了吗,这俩玩意儿长得就是一模一样的,我用它要展开以后,发现他就是约的鱼的,发现了吗,这个东西是什么啊,这个东西是什么,这个东西是不是give me dex啊,这个东西是什么啊。
这个东西是不是信息熵啊,你在数学上证明了这俩玩意儿,这两个玩意儿,其实就是一样的对吧,他们两个趋势完全一样吧,对不对,好吧好吧,所以截止目前为止了解了三种不同的决策树,叫做D3C4。5和cut。
然后你发现说这三货,这仨货好像用于最优属性划分的时候,评估的准则是不一样的,但是都好合理啊,然后你在数学上找到了一个方式,就把它们统一起来,你说就是这样的,这个东西本来就是趋势就是一样的好呃。
学过逻辑回归对吧,学过逻辑回归对吧,好我就回归输出的是一个概率P对不对,好P是一个0~1之间的一个一个概率对吧,所以我们告诉大家说,我用一个mod可以把这个东西叫变变成这样。
我用SIGMMD可以把概率变成这样,哎那你讲一下决策树是什么呀,对呀类比一下决策树是这样的哦,决策树可不像你那么平滑,角色数据是个跳票哦,今天是一个小叔叔来找我,今天这是一个小叔叔去找我相亲。
我就不去哦,所以我就直接跳成零哦,如果今天是一个这个这个什么样的人找我去,我有可能就会去哦,高富帅哦,我就是一哦,所以这个地方呢它就是一个跳变啊,这是一个平滑的方式,我给大家对比一下。
因为我们刚学过逻辑回归,你学了这个模型,所以我就用它做对比啊。
这是从二分类的视角去看一下cart呃,有有有有同学是学那个电子或者通信出身的吗,有同学是学电子或者通信出身的吗,那这个地方呢针对于我们的这个问题,你你有其他的一些解释。
比如说它是可以从信息论的角度来来解释的,所以这个地方呢啊这个没关系啊,这个只是我给大家拓展一下知识,我给大家拓展一下知识,所以那个你的你的信源经过一个发射器,发射信号以后,经过信道接收器以后去做解码啊。
达到限速,OK所以这个地方如果大家去看你的X你的特征,你的标签实际上对应的它会有对应啊。
所以大家可以看后面它,它实际上是有一些对应的啊,这个是一个拓展,没有关系,这个部分呢不影响大家理解这个模型,只是我为了让大家对这个理解,对这个模型的理解更加的透彻,所以我做了一个类比这个东西啊。
我会给大家,我会给大家完全展开来说,等到大家积累了一些知识之后,你回来看,你会发现这个地方说的东西是有道理的,你发现所有的这些知识他都是有关联的,它都是可以类比的,它很像。
OK总结一下总结一下总结一下啊。
那个我学了三种不同的决策树,我我再强调一遍,决策树的核心是,第一这棵树长什么样,大家已经知道了啊,就是它是一个这种规则式的往下生长,然后去拿到结果的这样的模型,第二这棵树什么时候停,记清楚了什么时候停。
有三种不同的条件,一定得记清楚什么时候停,第三你这棵树生长的过程当中,每个时间点我最关注的东西到底是什么,我最关注的当前最关注的属性到底是什么,就是这样一个东西,它的不同诞生了三种不同的决策树。
应该说那个有其他的区别啊,但是这是最大的区别,这是最大的区别,所以我们有了D3,我们有了C4。5,我们有了cut,我们希望通过信息增益这样的方式去衡量,什么样的东西能让它变得更纯。
能让我现在的肯定度更高啊,所以我选择了信息增益,得到了T3,我选择信息增益,我得到了B3,我选择了信息分辨率,我得到C4。5,我选择了这个地方的GMMDEX,我得到了cut。
OK相信大家都有一些概念了对吧,好很好啊,然后我再讲一遍,我再讲一个问题,然后我们休息几分钟,我再给大家讲后面的部分好吧,有同学刚才提到的一个点说,老师老师你你你这没讲清楚啊,你这个地方没讲清楚啊。
那个那个你这个地方谁告诉你,说一定是离散的属性啊,哎今天如果有一个有一个字段,它是一个比如说销量这个东西是不是连续值啊,连续值你怎么去分叉呀,哎连续值怎么去分叉呀,你没讲诶,对我没讲。
所以我现在要给大家讲啊,这个事情是这样的,那个要去相亲对吧,来了一群小哥哥,好小哥哥里头有一个有个字叫做啊,很可怕AJ哦,哎A级可能有些同学说哎,有些同学说老师老师你这个A级这个东西哎。
其实东西很好办的,年龄人最小是一岁,最大是那个100,所以我就假定是这样啊,可能100多岁吧,那相亲不可能有100岁啊,那相亲就更小,更更更约束一下,我们约束到那个呃,比如说22岁吧,我们约束一下。
22岁到到这个这个60岁好不好,22岁到60岁啊,所以在这样的一个区间内,那他那你告诉我说吧,邵师二十二十二岁到60岁,不就这么几个曲师吗,你每个取值当一个分叉不就好了吗,可是可以。
但是我总觉得有点怪怪的啊,其实我们实际在做决策的时候,好像不是因为一个岁数而去对吧,我是因为一段岁数,他好像是在这个小哥哥是在24岁到这个呃,比如说28岁之间诶,我觉得挺好的,OK啊。
或者说24岁到30岁之间,我觉得挺好的,那可能大于30岁,我觉得说哦不OK了,所以好像不是单个的年龄吧,好像是一个对吧,这个就尴尬了,所以怎么办呢啊大家听清楚怎么办啊,年龄是一个字段。
首先啊听清楚年龄是一个属性,是一个字段啊,先明确一下啊,年龄是一个属性,一个字段好,先明确这样一个东西,哎我把所有小哥哥找过来,我把所有小哥哥找过来,我把所有小哥哥从年龄从小到大排列。
OK这是一号小哥哥,他年龄只有21岁,就是2号小哥哥,他的年龄有这个23岁啊,这是3号小哥哥和4号小哥哥,5号小哥哥,他们年龄分别是20,都是26岁,OK我在这上面呢,就我就把这个年龄列到一条数轴上。
然后怎么办呢,哎,呃你只能处理离散值对吧,你刚才告诉我说你只能处理离散值对吧,OK那我就我就用同样的方式来处理一下了,所以我在21~23之间取一个值好不好,我在这里取一个值,我我另一个另一个栏杆在这。
我在这个地方再取一个值,我在这里取个值,我在另一个栏杆,我在另一方再取一个值,我再立一个栏杆好,每两个点之间我们取一个值,我去另一个另一个这个泥巴,另一个这个柱子立在这,然后我怎么办呢,哎可以这样哦。
这个时候小于啊,比如说这个地方是22,小于22,是一个分支,大于22,是一个分支哦,哎所以这个地方有一个字段,叫做是否小于22,这个时候是不是一个类别的属性,大家告诉我是否小于22。
是不是一个类别的属性,告诉我是否小于22,是不是一个类别性的属性,哎他就两个结果哎,要不就小压杀,要不就大压杀了,是不是一个类别性,是不是一个离散的属性,哎这个这个是不是小于24或者小于25。
是一个分支,大于25是一个分支,别着急啊,我在讲着呢,怎么去分段,我在讲啊,OK我刚才给大家强调了一个问题,我说我说age它是一个属性,听清楚啊,age是一个属性,但是我这个处理把拉成了很多个属性。
听清楚啊,第一个属性叫做是否小于22,第二个属性叫做是否小于25,第三个24啊,是是否小小于24啊,第三个属性叫做是否小于,比如说啊27,所以我把年龄由一个连续值的属性,分拆成了若干个二值属性。
有问题吗,这个分之二值属性的值我怎么得到的,我是不是任取两个连续值的点在中间,在这个数轴的中间去取到一个东西,所以请大家把你现在的想法变一变,你不是拿着年龄这样一个属性去做选择啦。
你是拿了一堆和年龄相关的,这样的离散的属性去做选择啦,所以这个时候是不是变成我要从这个属性,这个属性,这个属性当中去挑出来最可靠的属性啊,是不是回到了刚才那个问题啊,告诉我你们听懂了吗,我说明白了吗。
我把一个连续值的年龄变成了很多个零散的,零散的这样的二分的属性,二只属性,然后我对这一堆的二只属性用同样的方式去选,我把每一个都当做不同的属性去做选择,明白了吗,好呃还有个问题啊。
我知道我知道有些同学没问题,说老师老师哎,你刚才还说24岁到28岁呢,你这个地方只能小于28,大于28,哪来的24~28呀,哪还当是死的是吧,诶你这棵树要长着,你这棵树现在长了左分支。
你说是小于28岁的,小于28岁的,你确定他后面不会再长出来一个分支,是大于啊那个24岁吗,你确定他不会再长出来一个分支,是大于24岁吗,这就是年龄段就出现了,听明白我的意思了吗。
这些属性是可以重复被选择的,他在下一轮的时候,他还是会扫描这些属性,所以这个年龄段是怎么来的,年龄段是这样来的,你先判断来说小于28这个最有用,然后到小于28以后,你又扫了一遍,发现说乐趣大于24岁。
这个东西也有用,所以你就把它长出来了,所以这条分支就变成了小于大于24,小于28,听明白了吗,你要的段就出现了,所以我说明白了吗,好诶有个问题啊,同学有同学说,老师老师我听明白了,我听明白了。
但是那个呃那个那个感觉计算量好大呀,感觉计算量好大呀,哎但是那个你知道这些属性之间的选择,它是不相关的吧,我可以并行去做计算的吧,所以明白我的意思了吗,唉我干嘛要去等另外一个算完,我再算呢。
我另外有16个和我同时跑着呗,OK好,所以所以大概这么个意思啊,我我我就说到这儿,然后那个咱们休息5分钟,我们休息5分钟,一会回来,我给大家讲后面的部分,好吧好,呃我来回答几个问题啊,大家听好了。
大家大家先不要先不要刷屏,挺好,我给大家解释一下问题,第一位同学问到说,是不是只有在做决策树回归的时候,才会将连续值这样做,不是你今天去不去相亲,你就不看年龄了吗,年龄就是一个连续值。
做分类的时候一样要用数值型的属性好,我们就问第二个问题,刚才有同学说老师老师你没有讲怎么去掉,确定这个分界啊,哎22~60是不是要取38个属性啊,NO不是听懂听清楚啊,我一开始就给大家说,我列一条数轴。
为什么要列数轴,我要去看一看我有哪些取值,如果今天你的数据集当中只有22岁,23,26岁和60岁三种取值,我we啊,或者说可以更多一点啊,就是不是每隔一岁都有取值的话,为什么要取这38个属性啊。
所以他正确的做法是什么样的,我给大家说一遍啊,我放慢语速说一遍,我希望大家能听明白,我把我整个数据集取过来,我拉了一条数轴,我把我整个数据集上出现过的年龄,从小到大排在这条数轴上。
所以我把我出现过的年龄从小到大排到数轴上,我在任意两个相邻的年龄之间取得它的均值,去作为向它的中间这个均值去作为它的分界点,听明白了吗,大家对于分段对于这个地方的切分的阈值,切分的这个值还有疑问吗。
不一定是38个候选点啊,因为你22岁到60岁之间,并不一定每个年龄都会有取值,所以我拉了一条数轴,把有年龄的值标在上面,在任意的两个连续的对中间,取它的均值作为切分点,还有问题吗,这是分界值的取法。
说明白吗,好嗯其他的问题回头再说。
我们先往下走好了,大家心心念念的回归出来了,呃,决策树这么这么牛逼的模型只能做分类,整个分类太可惜了吧,那不如用它来做一下回归了,所以回归怎么做呢,回归是这样的,呃,这个地方有个例子,在这个例子当中呢。
我要根据一个运动员的从业年限和表现,去问一下这货值多少钱对吧,你知道很多球员踢俱乐部,那他比如说转会或者什么样,他值多少钱,你肯定要根据他的这个呃这个年龄啊,或者是他的这个表现状况啊,去判断一下。
比如说那个C罗啊,大家看他年龄其实已经超过了,大家一般情况下认为最佳的这个年龄了对吧,T嗯最佳的这个踢球踢足球的这个年龄了,但是他表现依旧很好对吧,所以这个时候呢。
我假设我要通过那个从业年限和表现两个维度,去预估他的工资的高低,我把它列到这个上面,然后在这个上面呢大家可以看到有两种不同,有不同的颜色啊,这个地方的那个深色表示说这个地方的深色。
表示说这个这个地方的深色,或者说暖色调表示说很高的收入,冷色调表示说很低的收入,所以大家看到的是诶从业年限比较低,同时表现也不太好的钱就很少啊,从业年限不错,然后表现很好的这些啊。
这些暖色调他实际上他的工资就很高对吧,就是红色和黄色就表示高收入啊,然后蓝色和绿色就表示低收入啊。
这样哎先别管它怎么来的,大家先别管它怎么来的嗯,我们假设有这样的一棵树,这棵树是这样的年龄,从业的年限小于45,四点5年的时候,小于四点5年的时候,全都预估成5。11,大于45年呢,我要再做个判断。
判断一下他的表现,如果他的某一个积分小于117。5,我认为他的工资应该是这样的,如果他的年龄,他的他的表现或他积分是大于117。5,我认为是这样的,决策树最妙的地方就在于说,如果大家去看一看。
这个地方的这样的一个卷回归数,你仔细去看一下这样的一颗回归数,你会发现它实际上是在做什么样的事情啊,它实际上是不是在做这样的事情啊,去把整个平面切分成了三个区域,大家看一下三个region。
这是第一个region,这是第二个region,这是第三个region,告诉我你们看得明白这个东西吗,是不是年限小于4。5的都在这一侧有问题吗,数值大于4。5,要看分,看表现,表现好的在这表现不好的。
在这,告诉我有问题吗,所以大家记住一件事情,大家记住一件事情呃,决策树这种模型啊,它有它自己很独特的地方,还有他自己很独特的地方,这种很独特的地方就在于说,如果说如果说逻辑回归是产出一条决策边界。
去完成分类,回决策树做什么,不管是回归数还是分类数啊,听清楚,不管是回归数还是分类数,就是你拿起一把刀垂直于坐标轴去砍一刀,再垂直于坐标轴再砍一刀,把整个空间砍成一堆的小矩形,能理解我说的意思吗。
回想一下刚才小于30岁和大于30岁,是不是在年龄这个字段上,拿起那把刀,沿着30那个轴砍下去的那一刀,明白我说的意思吗,所以决策树是一种很妙的模型,他做的事情是他不断的对这个空间去做细分。
他拿起那把刀垂直于坐标轴砍这么一刀,觉得不够砍的再去补一刀,垂直于另外一个坐标轴,或者再垂直于某个坐标轴再砍一刀好,你先知道这个东西如何去做预估,以及它的物理含义是什么,我们再往下看。
有人就会说老师老师我知道这个东西长这样了,告诉我吧,怎么长,告诉我这个这棵树怎么长出来的吧。
OK好呃,这是一个回归类的问题,所以回归类的问题呢,预测结果一定是一个连续值,特征向量是这样的,我有很多个维度,X1这个维度X2这个维度X3,这个维度一直到XP这样一个维度对吧。
所以回归数的两个步骤是什么呢,回归数的两个步骤是说,我把整个空间切成这个没有重叠的区域,我拿起那把刀咔咔咔一顿砍,就只能垂直于坐标轴砍,不能斜着砍,呃,我们认为这个地方的决策树啊。
我们常常讲到的决策树是不可以斜着砍的,它一定是垂直于坐标轴一刀一刀的砍,所以改完了以后会生成N个区域。
哎你说N个区域里头会有不同的取值对吧,哎这个区域里面有不好的取值呢,我我怎么去做预估啊,我问大家,我问大家,我问大家一个很有意思的问题啊,就是哎我现在我现在有ABCDEFG,巴拉巴拉巴拉这样一堆的数。
我我要去找到一个数,这个数据和这一堆数的啊,这个均方误差这样的和是最小的,我取我取多少啊,哎你学过不等式吗,我要去找到一个X让X减A的平方,再加上X减B的平方,再加上X减C的平方。
再加上布拉布拉布拉一直往下加,哎我希望这个东西最小我取多少,哎学过均值不等式吗,什么时候去,什么时候取到,什么时候取到最小值,唉说志新的这个同学不错,啊有同学问到说为什么只能垂直于坐标轴哎。
Come on,小于4。5和大于等于4。5,是不是小于4。5,是不是这个这个平面的这一侧呀,大于等于4。5,是不是右边这一侧呀,你怎么斜着砍呢,哎那个刚才那位同学听明白了吗,这垂直于坐标轴是你小于4。
5和,大于等于4。5,是不是只能是垂直的呀,你还能斜着,你还能斜着跑,呃我不知道那个同学有没有听到过这个解释啊,所以那个那个尾号是什么384的同学啊,OK那我就假定你听到了啊,OK好。
然后刚才我问了个问题啊,那个问的问题有同学答出来,答出来了啊,说老师老师,我知道高中所有的不等式,都告诉我们一件事情啊,如果今天这道选择题做不出来。
我就猜答案,不等式的题目,我一定猜他们的均值对了,这个时候呢为了让我和所有的样本点,我的y predict和我的Y啊之间的这个差距最小,我在每个区域里头取什么,我在每个区域里头就取所有预估值的均值。
我就去取所有预估值的均值,哎但是这个东西还是没有告诉我怎么长啊,老师你你你你这个我等了半天,你告诉我怎么找你,告诉我说我划分成这个区域以后,我怎么去,我怎么去给这个预估的结果值,你长在哪儿呢。
别着急别着急,先再想一个问题,这个地方有一个东西叫RSS,这个东西衡量了我预估的结果的一个好坏,告诉我能看看明白吗,第一层CDMA是什么意思,我要遍历整个这个空间,我要遍历整个这个块儿,明白吗。
我要去遍历整个这个块,每个块里头我去求它的误差,是不是这样去计算呢,啊这个公式大家能看明白吗,能看明白,这个东西求出来的是一个总体的误差吗,左边那个sigma是对每一个你划分,你用刀砍出来的小块。
右边那个西格玛是每个小块当中的误差加一起,是不是所有的误差全体的误差有问题吗,我是不是我的回归我的回归我的问题,我想让它尽量的小,我是不是要让这个地方的RS尽量的小。
我是不是要让这个地方的rs尽量的小啊,怎么做怎么做。
马上来了,首先这是一种自顶向下的贪婪式的递归方案,听清楚啊,就是这个问题是没有,你是没有办法用穷尽的方式去拿到最优解的,对,你是没有办法通过穷尽的方式去拿到最优解的,你肯定做不了啊。
这个因为它是它的切分方式,是无穷无尽种的,无穷无无尽种,所以这个时候呢,我们只能用一些启发式的方式去做,所以启发式的方式,这个实际上启发式的方式是一个自顶向下的,贪婪式的递归方案。
所谓的自顶向上是什么意思,自顶向下什么意思呢,是说我从当前的位置开始往那一刀砍下去,只能把已经有的这个区域已经生成出来的区域,再砍成两个区域,听清楚我意思了吗,就是今天如果有这样一个方块。
你第一刀砍了这么一刀,不好意思,第二刀你只能在这个区域,或者这个区域去砍刀了,当然你可以这样砍,也可以这样砍啊,这是随意,你也可以砍在这啊,你砍在哪是随你随意,但是你只能在我新的区域里头去砍。
你不能再回头了啊,你不能说我之前那刀砍的不算,我重新砍诶,这个没有重新砍的,就这样一回事,你砍下去了就砍下去了,你下一步你就是想着呃,你就想着你打这副扑克牌,你牌已经拿到手上了,你就不要想着去换牌了。
你就想着说我现在有这副牌,我怎么打好这副牌,明白了,所以这个就是自顶向下的意思,就是说你一刀砍下去了,你下一刀只能砍在,你只能砍在生成的那个新的小区域里头啊,你别再想把之前的刀再怎么磨掉。
或者怎么样做不了,然后贪婪的意思就是每一次划分,我只我只考虑当前最优,我只考虑当前作用啊,这个没有没有太大意义啊,我只是告诉大家是这样做的,最关键的点在哪,最关键的点在哪,在这个位置,这是最关键的点啊。
这是最关键的点,对有同学提到动态规划,因为这是一个NP问题啊,你你没有办法,你没有办法穷尽了,所以它确实是启发式的方式,诶我问大家一个问题啊,我现在有这样一个区域,我这个区域呢这条轴上有一些取值。
就是我连续值嘛,但跟刚才一样连续值嘛,我画一下树桩,连续值,我画一些树桩,OK那个我有我有多少种不同的砍刀方式啊,这个大家谁告诉我说,如果我选定这个地方这条轴,如果我选定这条轴。
我现在有多少种不同的砍刀方式啊,诶我是不是我是不是可以卡在这,我是不是可以砍在砍在砍在这都可以砍的,啊甚至你在左右也可以砍对吧,哎左右其实没有意义了,因为你砍下去都没有样本了啊,所以左右我先把它忽略掉。
是不是中间每个位置都可以砍呢,哎所以你以为这个算法,你以为这个算法很牛逼吗,这个算法就是一个很常规的算法,它就是把这个地方每一个分裂点,哪一个切分点啊,看清楚啊,这个地方能切的所有的都能落下去的。
所有点啊,每个点都去算一个rs,每个点都去算一个,每个点切下去了之后,他都去算一个rs,这个东西,算的是切出来的左区区域或者是上区域,这个切出来的右区域或者下区域有问题吗,想象一下吧。
拿着刀砍下去了以后不就变成两块了吗,它的误差不是左右两块的误差之和吗,有问题吗,就砍你,你砍下一刀不是左右或者上下吗,不是两块之合吗,现在这个地方的sigma不就是对左对两不同。
对这个砍刀这一刀落下去的两块分别去求吗,没问题吧。
好那我再解释一下什么叫做我,什么叫做递归的砍刀哦,递归的这个这个这个砍这些刀哦,递归的意思是什么,递归的意思是像这样的,这是二分的递归的方式,这个不是递归啊,这个你看不出来啊,这你看不出来。
你不要把一个砍哦,对你不能歪着砍了,所以你只能说唉我砍这一刀,然后我下一次怎么办,下次砍这一刀,我再下次怎么办,我砍这一刀,我再下次怎么办,砍这一刀,这个叫做这个叫做二分的递归切分。
OK那个有同学问到这个问题,说老师,老师这个地方是针对一个特征进行切分的,对吧对,是针对一个特征,我刚才已经告诉大家说,如果我就针对水平的那一位做切分,听清楚啊,我就针对我水平的那一位去做切分。
所以大家看到这个地方确实是,就是他的这个方式很粗暴,听清楚啊,他还会把所有水平上能切分的点全都试一遍,再把数值垂直的这个方向上能切分的,所有的点全试一遍,全试一遍,听清楚了,全是一遍。
Y的值怎么去确定呢,我刚才刚说完的,我说给定理一个区域,这个区域里头的Y怎么去预测啊,我说这个区域里头有一堆的数,ABCDEFG巴拉巴拉巴拉,这个区域里头有一堆不同的数,我怎么去预估一个值。
你所有这些数的平方和最小啊,对吧,我说的是均值,对不对,所以你告诉我,你把所有能砍刀的方式全都试一遍,你是不是可以挑出来那个最好的砍刀的方式了,而且最小的那个方式有问题吗,我这么说,大家有问题吗。
啊有同学说老师老师这个计算量好大的呃,你从人的角度上来说,这个计算量当然很大了,但对计算机而言还好啊,就是计算机而言还好,同时又考虑到这个地方的问题,实际上是可以并行的对。
所以大家先不要纠结这样的问题啊,就是不要去纠结这样的问题,你以为你以为逻辑回归计算量就不大了吗,你输入的维度高的时候,逻辑回归一样,计算量很大,所以那个计算量呢它主要是这个算法,他也没有。
他没有太多可以去做,更非常非常非常牛逼的优化的这样的操作,所以它总是会有一些计算量的,你为了去找到这个比较优的这个结果,还是要付出一些代价。
OK好诶,这个地方还有一个问题,就是有同学提到说老师老师诶,你你这个你你这个数一直往下长就完蛋了,那那那我,我今天我想去预估班上的每个同学的得分,我想去预测预估每个同学的得分,我诶那我岂不是可以。
每每一个,我最后这个数可以生长在每个同学,都在我的叶子节点上对吧,这有什么意义啊,每个同学都在我的叶子节点上,这个有什么意义啊,这里有什么意义啊,所以他可能会过你喝啊。
一会儿我们再说混拟合怎么去处理,我先回到刚才这个问题,有同学问了一个很好的问题,说老师你每切一次,都要对全部的样本去计算一次对吗,诶我问大家一个问题啊,你诶你在这样的情况下,你想一想啊。
你已经切了这一刀,你下次切这一刀唯一变化的是不是这个区域啊,是不是说只需要去管一管这个区域,原来的rs是多少,现在切完这一刀以后,新的rs是多少,RS1S二S二是多少,我是不是算一下这个东西的一个增量。
就可以了呀,我感觉这个地方也是,我只需要算左边这个区域的增量就可以了,我需要把全部都算一遍吗,我这么说能明白我的意思吗,我只关心我砍的那个小区域,我没有砍到的地方,我不管它,它没有动。
所以我只关注我砍下去的那个小区那一刀,他有没有变小,变小了多少,有问题吗,不是不是全部算一遍了,他只他只算我,我砍那一刀的那个区域哦,OK好吧好。
所以我希望我说明白了呃,下一页图中间的那个图也是二分吗,中间这个图就是二分吗,中间这个图就叫做二分递归啊,不是二分啊,二分递归,所以什么叫做递归,递归的意思是我先砍这一刀,我再看这一刀。
我再去看这一刀和这一招,这叫做递归,就是不断的去把区域切成两个区域,这个叫做递归,这叫做递归,OK所以它是它是二分递归,没错。
OK我回到这个地方啊,我刚才说了一个很很可怕的一个问题,叫做过拟合,哎,这棵树可牛逼了,你知道你在这个区域里头有好多散的点对吧,有好多散的点,它都有取值,然后这棵树如果真的牛逼,他可以牛逼到什么程度。
我这些刀你反让我砍呗,我砍的足够多的刀的时候,诶,我今天可不可以把每个样本点,卡在一个小格子里啊,我把每个样本点都砍到一个小格子里对吧,我每个小格子里头就一个就一个样本。
好无比的取均值就是自己误差就是零,好开心的,分分钟就全拟合出来了,哎这有用吗,这有用吗,这有点可怕吧,每个样本都是在一个小格子里,这个对我新样本的预估有什么用啊,这就过拟合了,你就把答案记下来。
你就告诉他说这个是加分点,就在这个小格子里,它取值就是这个没用的,所以怎么办,别让他切这么多刀,谁让你一直切一直切的,所以我们之前在逻辑回归以后,我告诉大家说,我们控制过拟合用什么,我控制过拟合用什么。
用正则化,我们加一个正则化,像我们去惩罚他,我们说哎不能切哦,你这你你你不不是不能弃啊,不能用那个甩甩棍,那么厉害的方式去拟合样本点了,你再甩你再甩,我要我要跟你那个扣分了啊。
所以所以他就他就他就不敢甩对吧,好,这个地方也一样,这个地方我要加一个惩罚项,我加什么惩罚项呃,大家告诉我一个问题,我这棵树刀切的越多,我刀切的越多,是不是越积累越多,我刀切的越多。
我是不是叶子节点越多,我那一刀一刀砍下去,我刀切的越多,是不是叶子节点会越多,所以我把这个叶子节点的数量,以某一个超超参数夹到尾巴上,意思就是我想让rs尽量的小,但是你不能让这个地方尽量的把。
如果这个鬼东西,这个叶子节点太多了,不好意思啊,你这个东西不合格,你回去重做,你这个刀砍太多了,所以所以这个地方的损失,实际上这个地方的误差或者说损失,它实际上在这种情况下。
它在RSS的基础上加入了乘法项,这个乘法项是什么,对叶子节点的数量,乘以阿尔法,你可以学,你可以砍刀,要不要砍太多刀,看多了重做不合格,好,所以这个地方呢大家知道,知道一下它的形式就好了。
哎这里头可能会有一些你没有听过的名词啊,比如说交叉验证,这个我们在后面会给大家讲到,所以大家先不用先听一下就好了啊,不用着急,好那个回归数我就给大家讲到这好吧,所以回归数是一种启发式,它会一直生长。
刚才有同学说千分会穷尽X1和X2的组合吗,它不需要穷尽X1和X组合,它只需要穷尽所有X1的划分点,和所有X2的划分点啊,不是组合不需要组合啊,他每次只砍一刀,只能垂直于某一个坐标轴砍一刀。
所以它只尝试一条轴的所有情况,和另外一条轴的所有情况,但不是一个pair,不是一个组合。
下面介绍一个很牛逼的思想,叫做begin,然后这一页写了一大坨啊,我决定给他个tap,这一页,我今天给大家跳舞这一页。
为什么呢,因为我马上要告诉大家,什么是在我们的机器学习当中,什么是bg bi是一个缩写啊,BEI这个缩写叫做boots trap like rigating,Aggregating。
所以就用了一个叫做boost chapter的一个思想,他他长了这样一件事情,叫做人多力量大,然后呢,这个事情是这样的,如果你要去构建一个模型,这个模型可能是不太准的,OK啊抱歉,这个地方呢写笔误啊。
大家听到这个课的时候呢,你要知道这个地方是T啊,这个地方是T不是M,所以他想了一件这样的事情,诶诶刚才我很很很很害怕一个东西啊,很害怕那个东西叫做过拟合,所以过拟合产生的本质是什么。
过拟合产生的本质是会有一些noise,会有一些噪声点,这些噪声点你怎么你怎么着啊,噪声点你以为他是你,你买了一本课外练习题回来,你以为课外练习题所有答案都是对的,唉拜托他印刷错了,这道题错了。
但是你不知道你把它学下来了,下次你再考到这道题写错了,所以这就是过拟合学太贵了,你们太适合这本参考书了,拿出那本5年高考3年模拟,说我去我把它做完,分分钟上上清北复交,然后那本书里就提错了啊。
然后你就写错了,所以这个地方过敏和相机的原因,实际上很多时候是,因为我们这个地方会有很多的噪声,我们会有一些错误的题,我们有些答案错了的题,但是我不知道,我并不知道这个东西是错的,所以我就拼命的学我。
我我就拼命的学,然后你把你你也不管答案对不对,我觉得这个答案印刷是这样,他肯定是对的,我拼命的去记这个东西,我是按照他的思路去理解,错误的思路去理解,然后将来你去做高考的时候就就很可惜,对吧好。
所以怎么去防止这样一个问题呢,哎你要你要是没有看到这道错题,你不就不会学这道错题了吗,那你看不到这道错题说明什么,说明你要把这道错题,这个这个呃你你你你这一次就不要看到它,所以在这个时候呢。
我们有一个思想是这样的,我们总共会有1000道题,我们总共会有1000道题,我们在这1000道题的基础上,我们把它切成,我们每次从1000道题当中去抽取出来,其中的800道题,每次都取800道题。
当然每次800道题可能不一样啊,就是那个无放回的随机去抽抽800道题,我抽出来以后,我每次都在800道题上去学习出来一个模型,比如说用决策树去学习出来一个决策树的模型。
然后我再对最后的这个结果去做什么呢,如果它是分类问题,我去做投票,少数服从多数,如果他是一个回归问题呢,对回归问题我就求平均,啊大家理解了这个思想吗,begin就是从总的样本当中。
每次抽取出来一部分样本,从总的样本当中每次抽取出来一部分样本,去构建学习器,然后再把这些学习器拿过来去做投票,或者是求平均,因为我只抽800道题,我很可能看不到那道错的题哦。
所以我可能学不到这道错的题啊,所以很有可能会有一些学习期学的是不错的哦,所以比我一个人瞎学可能需要好的,所以这个叫做白点好。
所以这是bedroom对吧,好BGIN的话有另外一个非常牛逼的模型,叫做random forest,叫做随机森林,第二个随机森林啊,随机森林做什么样的事情呢,随机森林做什么事,是做什么样的事情呢。
随机森林是一种基于数模型改进的begin的版本,刚才我只对刚才我只对数据去做采样,听清楚了,我刚才只对我的1000道题当中去抽800道题,数据去做采样,现在在随机分明里面,每一个模型还需要对这个地方的。
还需要对这个地方的特征或者属性去做采样,就是原本可能会有时有有100列,我每次自己取出来,其中的70列,明白吗,就是有些列我也不用,我也不知道哪一列是不是都有用,所以我在构建每一个子模型的时候。
只取了一部分的样本,一部分的样本数据我也只取了一部分的特征,一部分的属性,听明白了吗,其他的东西和刚才的白点是一样的,我说清楚了吗,能理解这个地方的意思,写了一堆文字啊,就是我说的意思。
就是我只每个模型在构建的时候,我只取了其中的一部分样本,同时呢我也只取了其中的一部分特征,就是我没有所有的属性全取,我每次只能挡住一部分属性,我只当你从剩下的属性里头去选,我为了增加它的随机性。
不让它受噪声去干扰。
好,所以你们已经学会了最牛逼的random forest,这个模型,所以这个地方呢给大家看到这个,OK这就是单科决策树,单科决策树啊,单棵决策树在这个场景里面,大家看到单棵决策树很有可能会过拟合。
他会因为这个地方有两个小的样本点,会拉出来一个板,一个区块给他,也因为这个地方的两个样本点,两个样本点去拉出来,这个地方的一个区区块给他,但你看当你用五颗决策树,25棵决策树。
100棵决策树去构建随机森林的时候,它的边缘会变得非常的平滑,他不会那么容易受到noise噪声的干扰,他不会那么容易受到噪声的干扰,这个叫random forest,诶,我来回答几个问题。
有同学说老师呃,那个之前听说有人用了100多个模型去做集成,是这个方法吗,呃他集集成方法有很多种方法,有很多种方式,bin只是其中的一种,它还有一些其他的ending。
那些waiting那些呃stacking都有啊,这个我我后面会给大家讲,这个我后面会给大家讲,然后有同学问到说是有放回还是无放回的,对是有放回的,是有放回的,OK就是在对样本采样的时候是有放回的。
有同学说老师老师没有案例吗,我又没有说要下课着急吗,马上来了案例等我一下,对有些样本没有抽到,有些样本没有抽到,这个同学问到的问题是说到的问题是对的。
啊选择多少个,选择多少个学习器,诶我回答不了你哦,因为如果我能告诉你这个东西的话,诶你还调什么参数啊,你这个模型可牛逼了,你直接往上一怼,比其他模型效果都好,这是一个要调节的参数。
后面我会给大家讲到调参的方法好吧,所以我回答不了你这个问题,选多少个学习期,最好,也没有任何一个数学公式可以回答你这个问题,好吗啊,没有任何一个那个呃。
没有,没有任何任何一个数学公式可以回答这个问题,有同学问到说,老师begin或者集成方法在工业界有用吗,作用很大吗啊有用,但是作用的大小不确定啊,就是有些地方它会用模型去做集成,我们个人的经验是。
像神经网络这样的模型和数模型,数模型包括随机森林,包括一些树的串行模型,他们去做集成效果是很好的啊,这是BEGGIN对,对这样的数模型和神经网络,这样的计算模型去做一个融合,一般效果会很好,嗯嗯好。
我来讲一下案例,无非就是分类和回归呗。
走一遍咯,决策树完成分类的问题,把需要的工具库import进来好。
Import pas s p d,这个是一个数据处理和分析的工具库啊,我给大家,我给大家去那个列了这个说明,哎我发现大家好像很爱问这种参数的问题啊,因为有同学问了一个问题。
说随机森林里抽取的样本数和特征数,怎么定定不了,没有数学公式,这是超参数,有多少个学习器乘多少,样本乘多少,特征都是超参数,一般情况下,根据经验,根据各位我们的经验,取0。0。6到0。8之间的值。
应该会有比较好的结果,就百分比60%到80%,但具体取多少,你要做实验啊,这个经验值也不一定准,它只是一个经验值而已,提供给你参考啊,所以啊我看看是同样一位同学吗,啊不是同一个同学。
那个你问的这个问题没问题啊,说明你在思考,但是这种问题没有明确的数学公式解,这个意思啊,就是如果他有的话,我肯定会告诉大家对,所以这个就是要我们需要我们去调节的,这个参数或者叫超参数啊,这个意思好吧。
那我就继续说我这个案例咯,我这个案例里头所有的地方已经给大家写上了,写上了注释,所以那个我相信大家是能看得懂的,对吧啊,代码我下课再上传啊,我现在在讲课,那我不能停下我的课去给你上传一下代码。
你也不着急,几分钟啊,几分钟以后你就会看到这个案例好不好,先听我把它讲完好吗,不要着急,OK啊,所以把需要的工具库import进来,这个pandas适用于数据工具,适用于数据处理的工具库。
从sk learn cn里头去import一下PROPOSSESSION,我需要对数据做一些预处理,然后我去import一下决策树,决策树在处理里头,OK我用pandas去把数据读进来。
我这个地方有个decision tree点,CSV有一个这样的文件。
我可以用pandas这个工具库去读进来,这个工具非常牛逼,它读进来的数据就会变成行行列列的数据,所以大家看到的就是行行列列的数据,这是一个什么样的问题呢,这是一个很经典的问题。
这个问题的标签或者说你需要去完成的分类,是去判断一个美国的一个一个居民,他的收入是不是比50比5万美元要低,就是比5万美元要低还是要高,这是一个分类问题啊,就是yes or NO。
就是比5万美元到底是要低还是要高,然后我可以去基于这个地方的啊,参考的一些因素是什么呢,或者说基于你可以去做判断的一些因素,包括哪些呢,包括诶大家看到这个地方对,包括大家看到这个地方的这个呃。
第一个第一个这个列叫做world class啊,它到底是一个这个这个给国家干活的公务员呢,还是一个市里面的一个国家公务员,还是市公务员,还是这个私企的员工,还是等等等等这样的因素对吧。
所以大家看到这个地方有什么所谓的这个state,government对吧,有private等等等等啊,啊OK还有一些那个那个什么失业的人群,OK这些都有啊。
然后第二个叫做education education,大家想一想就知道啊,education就是教育程度对吧,所以这个地方呢包括这个呃学士FEATCHA,包括这个可能会有一些高中生毕业啊。
因为在美国其实干这种蓝领啊,这种活实际上也收入也还是可能还是不错的,所以这方面education包括说有学士,有这个硕士,可能会有一些这个高中生可能都会有啊,各种各样的。
然后第三列呢叫做他结婚的这个状态,可以是呃没有结婚啊,未婚过对,然后有这种已婚,也有这种已婚又离异的对吧,哎离婚的,OK然后下面这些东西啊,还有一些其他的因素就是relationship对吧啊。
是那个是是没有结婚的人,就是不在一个家庭当中,然后结了婚的人可能是一个哈曼,是一个丈夫或者是一个一个妻子,OK然后他的种族他是个白人还是黑人,还是黄种人对吧,然后他的性别是男性还是女性啊。
然后他的国家到底是古巴还是这个地方的美国,还是另外的某个国家,OK然后我来看一下这个地方有一些函数啊。
就是info函数就告诉我一些信息,所以他可以把这个地方所有的列告诉你,说它有多少行,它有3万2561行。
OK每一行都是一个类别型的一个变量,然后这个地方消耗了两兆多的内存啊。
就还是比较比较小的内存。
然后我的这个地方的成年人这个数据它的形状,它的形状表示它是多少多少行多少列,所以他有373万多行,3万2561行。
它有九列,OK然后我的列包括哪些列,包括world class education,一些结婚状态,巴拉巴拉巴拉巴拉一堆啊,到最后我我的特征是什么。
我的特征是不是前面这些东西,我的特征是不是前面这样一些东西,我特征是前面这样一些东西对吧,我的是我最后需要去判别的标签是什么,我判断标判别的标签是这个地方的income,是这个地方的收入。
所以我把这个地方写下来,我的特征是前面这么多列,我这个地方的标,我的标签我的Y是这一列。
然后我去把我要的特征和我要的label取出来,所以我根据我列的名字就取出来我要的特征,我再根据我列的名字取出来我要的标签。
然后我给大家看一下,这个时候呢对我就啊拿到了这样的特征。
这就是特征嘛对吧,车身就包括说诶他是哪个什么样的工作类型,什么样的教育程度啊,什么样的一个结婚状态啊。
哪个国家的等等,那他的VIVO呢它的标签呢标签就两种,要么就是小于50K,小于5万美金,然后要么就是大于5万美金,这样啊。
OK然后下面这个地方呢有一点小小的特征,工程特征处理这个大家不用管这个呢。
就是那个我们会在后面的特征工程部分,会给大家重点讲到,你要知道的东西,就是计算机,它很傻,计算机它傻到什么程度呢,你丢给他一个文本型或者字符串型的东西,他是读不懂的,你给他一个类别的东西。
你说我今天买了一件很好看的衣服,是件蓝色衣服,它对于蓝色这个东西是毫无概念的,所以怎么办呢,对你要用一个数字去表示,我给大家举个例子,你你今天星期几,星期几这个东西计算机是读不懂的。
星期几计算机是读不懂的,啊我知道有些同学,你们的基础比另外一些同学要好一点,但是不用着急好吧,就是那个大家也那个啊,各位陈独秀同学稍微收敛一下,不要先先不用不用就说,我给大家先简单解释一下啊。
因为这个这些知识,我们在后面讲到特征工程的时候,大家都会都会懂,所以那个大家嗯先听一下啊,听着我跟着我的节奏来来听一下,对是确实是读了向量编码,但是我要丢出来这样的东西,就有点有点内容太多了。
可能有些同学就会蒙,嗯其实我就想说一件事情,就是计算机呢对于这种类别性的东西,是读不懂的,所以你告诉他说今天星期一啊,今天星期天他毛线都不懂,那怎么办呢,他就想了个办法,他说不如我就把一天切成七天。
我就开七个位置在这,如果是星期一,我就是第一个位置取一,后面的位置全都取零啊,这几个数字了,1234567对吧,如果是第二天啊,如果是星期二,星期二我就变成零一,这样对吧,星期三星期三我就变成这样。
能明白这个意思吗,对这就是刚才啊这位同学说到的这位同独秀,陈独秀同学说到的这个独乐向量编码,OK好吧,然后独立向量编码,意思就是我把类别哎,又占一个位置的形式去告诉他,如果这个位置取一。
就说明是这样一类,如果这个位置取零,它就不是这样一类,所以这个地方有一个处理,叫做叫做这个特征工程的处理。
这样啊,所以这个地方呢,我们用get dis去拿到一个特征工程的处理啊,这个不用管这个,如果大家那个看不懂的话,你先看一眼,因为我们后面会给大家讲到。
好吧,后面我会给大家讲到,所以大概的意思就是说哎呀计算机太傻了。
他读不懂这些类别,他懂不懂这些类别。
所以那个请帮我把它转成一个数字的表达形式,我还能看懂,就这个意思啊。
你就可以认为这个地方做的,就是这样一个事情啊,就这样一个事情好。
所以下面我就开始构建模型了啊,这个事情真的是很简单。
所以构建这个模型呢,我就只需要去构建一个分类器啊,我这次我就不手写了啊,我昨天在把手写蒙蒙了一群同学,就是大家大家看蒙看蒙了一群同学,所以我就决定今天用一下工具库啊。
所以我就搞了一个decision处理的一个分类器啊,Decision to class file,然后告诉他说我要用商去作为我的信息熵,信息增益就作为我的评估的这个准则,然后我最大的数深深度啊。
我限制了一下最大的数深深度是四,然后我就拟合一下我的数据,拟合一下我的特征,拟合一下我的X和Y。
然后下面就拿到了一个分类器,诶,下面这个东西大家照着抄就好了。
这是一个可视化,这棵树是可以可视化的,老师可以告诉你说我为什么去做这样一个决定。
我沿着每个分支走,它会它会是哪个哪什么样的一个决定。
大家看到最底下这个class,大家见到最底下这个class这幅图当中啊,每个框框最底下的class就是它的类别。
那class就两种,小于等于50K对吧,大于50K对吧。
小于等于50K,大于等于大于50K,所以这就是一幅可视化可视化的一幅图。
就告诉大家这些决策树长出来的,决策树长什么样。
那个这个代码我不想给大家多说,这就是个模板,就是个模板,你就把你的那个分类期望有一怼就可以了,结果就出来了,唯一要改的是这个地方啊,就是你的分类的名字不一样吗,对啊,分类的名字。
我这个地方是小于5万美刀和大于5万美刀啊,就我写成这样,如果你现在的这个分类是说,比如说会不会买件衣服。
那就是买和不买嘛,OK所以这就是一个案例啊。
再看另外一个案例是一个随机森林,随机森林,然后这个案例呢反正也挺简单的对,所以随机森林那个那个我刚才给大家讲分类数,我没有说呃,我没有说怎么去控制过拟合是吧,分类数控制过拟合有一些方式啊,比如说减脂。
但是这样的工这样的那个方式呢,在工业界用的不多,工业界就会直接去做一些限制,比如说限制数的深度,对限制数的一些这个呃,每个叶子节点的一些样本数等等,他会做一些这样的限制,所以这个地方我们做一些限制。
因为不做限制,那棵树太大了,它可能会过拟合,所以我就限制了一下,说我允许你的最大的数升就是四,你要涨到四了还往下长,不好意思,不让你涨了,太平了,这个意思明白吧,所以这是一个超参数啊。
就数升是一个超三超参数,我自己手敲了一个超参数是四,它不一定是四啊,它可以是那个其他的一些结果,所以大家理解一下是个意思哈。
好然后这几个地方呢,我们我们在构建这个随机森林啊,去完成一个回归的问题,一个regression,所以随机森林完成回归呢,就是说我建了很多个数,然后我做了一个每棵树都做了一个预估。
我再把预估的结果只去求了个平均啊,就这个意思好了。
然后这个地方呢我就不解释这个工具库了啊,工具库无非就是import pandas,import一下数据的预处理,然后我从on sunday里头去import一下,随机森林的回归器啊。
Random forest regression,然后我用了一个自带的数据库,叫自带的数据集,叫做load boston,Load boston。
哎呦大家知道我现在解释一下啊。
树的深度是树的层次1234。
这是树的深度。
只能用到四个数字段吗,谁告诉你只能用到四个字段的。
这里头有多少个分支啊,这有多少个分支啊,哎你四层四层你就垂垂直往下长啊。
你的数不涨两个分支的,所以所以啊,大家大家大家去那个看一下这个东西。
就明白了啊,就是四层最多涨涨四层,好属性不止四个啊,因为我这里头每每一层都会展开两个分叉,每一层都会展开两个分叉啊,颜色大家不用管颜色,就是为了好看而已,你你可以你可以理解成暖色调和冷色调。
它做一些区分,但是这个地方其实在颜色的深浅,并没有大家想象的那个,你可以认为颜色越深,他越肯定你可以从某种程度上这样去理解啊,呃细节的细节的代码的部分,大家下去以后再问好吧。
那个我如果上课给你每个点都讲了,就会很碎,这个课你回头去听起来,所以我建议大家阅读代码的方式,是不是逐行的去阅读,而是我去了解每一个块在做什么样的事情,我再进到每个块里头,去了解它是怎么实现这个东西的。
而不是一行一行读,一行一行读,很容易蒙的,这个地方代码还短,代码长了你就蒙了,OK所以values是什么意思,values是把那个pandas,data frame当中的南派数组取出来,对啊这个意思。
然后如果我刚才说的话,里头有些名词你听不懂呃,没关系,因为后面我们还会再用到,所以慢慢你就懂了好。
然后加载数据很简单,加载数据加进来了,直接我就可以把贝把X取出来,把Y取帅啊,所以贝塔就是X。
他给的就是Y啊,贝塔就是X,他给的是Y,然后这个地方呢,反正就是一堆的这个房子信息呗。
我去做房子价格预估啊,我要搞告诉他说这个区域的一个犯罪率有多高,然后巴拉巴拉巴拉吧,然后这个这个地方的那个那个居民的这个,比如说啊居民的人均的这个呃人均的这个站,就是说自己住宅。
住宅的这个面积有多大啊对吧,然后啊这个地方会有一些其他的啊,不拉巴拉巴拉巴拉。
反正有一些信息,我用于这个这个地方的这个回归问题的解决,然后呢把数据读出来,大家看一下,这个就是一个一个的样本,这是一个样本,这是第二个样本,这是第三个样本,这是第四个样本啊,这是第四个样本的特征。
大家听清楚啊,第四个样本的特征。
我只取了我只取了五个样本。
我把五个样本的特征全都打给大家看啊,这是用科学计数法,然后我把所有的这些样本的标签。
达到的价格是多少万美刀,OK240000美刀还是21。6万美刀,还是34。7万美刀啊,还是说是一般有贵的50万美刀啊,这样然后所以这个东西就是Y这个东西就是X。
我就把X和Y送到这个地方的random forest。
regressive当中去学习,我先告诉他说我要取15棵树去做预估,我的NAUTHATTERS,就是我那个随机森林取的多少棵树,我要取15棵树去做学习,我用这15棵树的这样的regression。
去fate一下我的X和Y好,很简单,secular用起来很简单,secular是所有的secular,所有的监督学习的model全都是feat,这就表示拟合拟合一下XY他就开始学习了。
然后我们就可以拿到一个这样的回归器。
我们就可以用这个回归器去预估一下,我现在波士顿的这个features。
我们去看一下他预估的结果,下面这个东西就是他预估的结果,这就是他预估的结果。
OK然后下面这个地方呢,你你可以去用这个regression,这个是默认的,刚才我给了15棵树,它默认的应该是十棵树吧,如果没记错的话。
对这个random service regressor它是有些参数的。
然后它这个地方的参数,比如说我们看一下,默认默认的树的棵树是十棵树,对默认的ns litters值是等于十,K是等于十的啊,然后我刚才是给了15嘛对吧。
如果我给参数,它就会以参数去初始化了,所以我我刚才这个地方啊,我在下面我是给了15嘛对吧,我是给了15吗。
好啊,下面这个地方呢我又重新跑了一遍,这个时候没有给没有给就是十嘛,就是十棵树嘛啊具体多少棵树最好,这个我们后面再学好吧,嗯这个我们后面再学,对每棵树就是一种样本和属性的采样,没错你说的很对。
我们都是用决策树,我们都是用决策树,我们只是15棵树,用了不同的样本和不同的属性好,有同学说设置了15棵树后,模型的内部做了什么模型,内部拆除了15颗,准备好了15个模型,去15个决策树的模型去拟合。
现在这个数据OK明白了吗,然后再对结果预估的结果去做一个平求平均,因为现在是回归求平均,所以啊我说明白了吗,所以当你设定N等于N等于15的时候,他就准备好了15棵树等着去学,OK这个意思。
设置属性的个数在哪,刚才我设过来,这不在这吗,这是属属性的个数啊。
sorry属性的个数在这,matt features属性的个数在这。
你可以取,比如说啊0。6他就取60%的属性,60%的全部特征的60%的特征。
比如说这个地方还会有一些其他的啊,这个地方是max feature。
你还可以选max,你可以取simple啊,就是关于这个样本样本去做采样啊,样本做采样都可以在这里去选,OK好吧。
每棵树随机采取采样多少不同的样本,看读它的APIAPI不是在这吗。
max feature读它的default是什么,default是default。
是它默认的值,它会有一个默认的值的,它会有个默认的值啊,对这个参数大家看文档就好了,没错,它是呃对不同的数据集哦,它是对相同的数据做采样以后,得到不同的数据集,去构建了15棵树去求平均好不好。
那个我希望大家在学习这些,你们可以提问题,没问题,我觉得好的问题我会回答,有些问题的话呃,就是我不太建议给大家的方式是一直喂饭,就你看我不会给大家列一个文档,我不练这种东西。
因为列文档这个东西的话就没意义了,我希望大家在上完这个课以后,这个这个书关上你能记得一些核心的点,你能记得老师说最重要的点在哪,这些东西是最重要的,他们可以散开来,我要解决这个问题的话。
我查API谁都会查,有一个说明文档谁都会用,然后你需要记住的东西是,这个算法的核心是什么,哪些东西会影响我现在的学习啊,这个这个是比较重要的,CELINE当中必须是二叉树吗。
对CELINE当中没有实现id3和C4。5,它实现的是cut啊,对就是一般工业界的工具库实现的都是CD,所以都是二叉树啊,都是二叉树,模型内部构建15个数的方法都一样,只是样本不同对吧,样本样本不同。
特征也不一样,样本不同,它的每一次生长的时候选取的特征也不一样,对属性也不一样,没错,工业业做机器学习,是不是大部分时间都花在数据处理,数据处理中啊,数据处理确实会花掉一大部分的时间。
但是模型我们也会去做研究啊,模型我们也会做研究好,那个今天我就给大家讲到这儿好吗,大家有更多的问题可以在QQ群里再交流,我会下课,马上把这个地方的两个案例和数据,打包发到群里,好不好。
我希望今天的课大家听完对决策树这种模型啊,或者是随机生成量的模型,回归数会都有一些认识,大家记住我说的最重要的核心点,这个核心点非常的重要,对所以我希望大家能够回看到这个课的时候。
或者回顾这个算法的时候,能记住最核心的这样一些点,这就够了,好的你们有问题,你们在QQ群里再和我去啊,交流好吧好谢谢大家。