X1s算法里的计算参数怎么设置,具体每个数值对应输出文件的哪里?

  • 二、随机森林的优势与特征重要性指标
  • 1.3硬投票和软投票效果对比
  • 八、OOB袋外数据的作用
  • 九、特征重要性可视化展示
  • 十、AdaBoost算法决策边界展示

在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

集成算法(Ensemble learning):顾名思义就是集合了多种算法的结果从而使模型的预测效果表现地更好(以量取胜,基本上都是使用树模型)

如何产生“好而不同”的个体学习器,并准确性和多样性上做出最好的选择,正是集成学习的核心

假设现在用5个个体学习器做集成,最终结果用投票法产生,即少数服从多数。当个体学习器差异性不足的话,考虑一个极端例子,5个个体学习器都是由同一个学习器,复制而来,那么,5个学习器的预测结果和一个学习器预测结果完全相同,就达不到集成学习的目的了。因此,个体学习器应该“好而不同”,既要保证个体学习器的“准确性”,还要保证不同学习器之间的“多样性”。然而,准确性和多样性是冲突,在准确性和多样性上如何选择,才是集成学习需要解决的问题。

那么涉及到多棵树(多种算法),自然也就有了多种不同的使用方式,结合初中物理的电路知识,对比电阻的放置情况,就有了串联和并联和串并联等。集成算法模型目前常用的三种分别是Bagging、Boosting、Stacking,将其和电路进行类比方便我们理解,如下表

首先是Bagging模型,其全称为:bootstrap aggregation,说大白话就是并行(并行:就是各玩各的,互不影响)训练了一堆分类器,其中最典型的代表就是随机森林。

关于随机森林的认识,单从字面上的意思进行理解即可,分为两块。

一个是随机,即是数据采样随机,特征选择随机;
一个是森林,即是把很多很多的决策树并行放在一起;

最后进行计算,如果是 分类 任务就是实行 众数取值 ,如果是 回归 就是进行 平均取值 ,以三棵树为例,对应如下
关于随机森林的理解,首先理解一下森林,就是将多个决策树进行组合放在一起,这个是没有太大的问题,那么为啥要随机呢?不随机会有什么现象呢,这里就假设用了100个树创建模型,输入的都是同一个数据,特征也选择的一样,那么经过训练后自然对应每一棵树中的节点都是相同的,最后分类或者回归的结果都是一致的,那么在计算最后的结果时候还是和一棵树的结果是一样的,也就没有必要再进行100棵树的组合了。

所以就有了随机的要求,为了尽可能的保证模型的效果好,采用的是随机数据样本和随机特征,这里假设有100条数据,每次创建一棵树都随机取80%的数据,然后在每个数据中取60%的特征,这样进行训练模型,必然最后的结果会有所不同,也就可以实现数据的分类与回归,图解如下:(为了绘图方便,这里以创建2个树为例),由于存在着两重随机性,基本上可以使得每棵树都不会一样,最终的结果也就会不一样
决策树的数量问题:是不是给的树越多,最后的模型效果越好呢?下图是创建模型后使用不同树的数量进行绘制的图形
理论上越多的树效果会越好,由上图中可以看出,实际上基本超过一定数量就差不多上下浮动了,树越多模型运行的时间越长,然而模型的效果也不是一定会很好,因此为了合理的选择决策树的数量,只能说差不多就行了。

  • 能够处理很高维度(feature很多)的数据,并且不用做特征选择
  • 在训练完后,能够给出那些feature比较重要
  • 容易做成并行化方法,速度比较快
  • 可以进行可视化展示,便于分析

首先举个例子,一组数据中有ABCD,其中A代表age年龄特征,模型训练完之后就想知道A特征有多重要。那么怎么评估 A的重要性?

首先是假设A中有五条数据分别为:21,23,25,37,46,51,那么第一次建立模型运行,计算错误率假设为err1 ,要看一个特征重要的程度。之后破坏(改变数据顺序或者加入噪音)A中的特征(比如开除一个员工,是否给公司带来的损失变大了,如果变大了,就说明A的重要性。如果没有太大变化,该员工可有可无,则该员工不重要,A的特征也不重要)。

然后就是随机森林采用的是树模型,其中节点的选择就是按照特征分类的重要性来设置的,因此通过每次分裂的节点就可以知道哪些特征比较重要,在训练模型完成之后也可以绘制特征重要性的条状图,方便可视化展示,这里给出的图示,后面会有代码实现。

还是以一个例子开始入手,假设预测用户花费label:1000,那么使用随机森林模型,假定给出三棵树,分别得到的结果为0,最后随机森林预测的结果就为(0)/3 = 1100,对比电路模型,就是属于并联,取多个树的结果然后再计算均值(这个例子是回归任务)

那么使用提升算法Boosting该如何实现呢?,还是对比电路模型,它是首先有第一棵树,如果不行的话再加第二棵树,依次往后。比如首先创建第一棵树,预测的值为950,那么创建的第二棵树就要将之前的预测结果进行加强,也就是提升,所以针对的是第一棵树还有多少没有完成的量(弥补残差)进行预测,这里就是预测剩余的50,假使第二棵树预测值为30,然后就是将第一棵树和第二棵树看做一个整体,那么第三棵树的预测就是50-30=20,弥补前面所有的残差,假使第三棵树预测值为18,故最终的预测结果就是998
结合Boosting算法的公式理解:前面红色框的就是前一轮的预测结果,后面蓝色的是当前这一轮的,但是这一轮预测值往里加是有一个前提的,要求加进来的树是要让模型比原来的强为准,体现在损失上就是加入这棵树后损失是下降的。

其中的 Xgboost 就可以通过上面那个998的案例进行理解,而 AdaBoost 会根据前一次的分类效果调整数据权重,如果某一个数据在这次分错了,那么在下一次我就会给它更大的权重,最终每个分类器根据自身的准确性来确定各自的权重,再合体,完成结果,如下,后面也会详细的通过代码进行介绍

Stacking模型,就是进行堆叠,很暴力,拿来一堆直接上(各种分类器都来了),对比串并联电路,可以有不止一个串联电阻和并联电阻,反正套上就行(叠各种各样的分类器KNN,SVM,RF等等),为了刷结果,不择手段,多用于比赛刷分中,堆叠在一起确实能使得准确率提升,但是速度是个问题

特征:分阶段进行,举个例子(使用线性回归LR,决策树DT,随机森林RF进行堆叠),使用三个分类器进行三分类任务,进入第一阶段分别使用三个分类器进行预测,结果为[1,0,0],[1,0,0],[0,1,0],那么接下来不是直接取这个预测结果的众数或者均值,而是将第一阶段的预测结果作为输入,然后选择分类器进入第二阶段(假设选择的是LR),图示如下

硬投票:就是只拿最后的结果就事论事,如下,一组数据经过各个预测器后给出的结果分别是1,1,2,1,那么最后的预测结果就是1(少数服从多数)
软投票:就是考虑到各个分类器中的概率值进行加权平均。最终看的是概率值

1.3硬投票和软投票效果对比

投票策略:软投票与硬投票

  • 硬投票:直接用类别值,少数服从多数
  • 软投票:各自分类器的概率值进行加权平均

数据的获取参考上面的代码

接下来就是进行软投票的代码实现,需要该改动的就是voting=‘soft’,另外由于软投票针对的是概率值,SVC分类器中的参数probability默认是False,因此需要设置为True

软投票会比硬投票好一点

  • 首先对训练数据集进行多次采样,保证每次得到的采样数据都是不同的
  • 分别训练多个模型,例如树模型
  • 预测时需得到所有模型结果再进行集成

可以得出使用Bagging策略比单独使用树模型得到是结果要好

比如查看一下集成与传统方法的对比,关于绘制决策边界的代码,封装成函数,这里就不再详述了,可以网上找到很多,直接修改里面一些参数即可出图

输出的结果为:(可以看出经过bagging策略后决策的边界要比普通的决策树要平滑的多,也可以看到在左侧的一些数据边界是直接垂下来了,这部分数据分开的难度太大了,都几乎融合在一块了,所以最后模型只能是尽量的进行划分多的数据)

Bug,这个外是针对于bagging这个袋子而言的,bagging采取的随机抽样的方式去建立树模型(可以参考一下随机森林算法原理的图示),那么那些未被抽取到的样本集,也就是未参与建立树模型的数据集就是袋外数据集,我们就可以用这部分数据集去验证模型效果,默认值为False,如果改变为True,就可以直接使用这部分数据进行检测模型的可靠性,就不用再额外的做一些交叉验证的操作了

输出的结果为:0.3333

而如果采用sklearn中封装好的accuracy_score方法进行评估,代码如下:

关于特征重要性前面已经提及到,可以通过打乱或者破坏某个特征从而查看某个特征的重要性,在集成学习中使用的几乎都是树模型,本身节点就代表着重要程度的大小,那么具体要量化判断的话,在sklearn中是看每个特征的平均深度,也就是节点越往上,那么这个特征就越重要,反之就越不重要。这里的数据首先使用鸢尾花数据集(数据较少,特征也简单),看一下输出的特征重要性是什么样的,代码如下

输出的结果为:(后面的数值就代表这平均深度的取值,说明花瓣的长度和宽度对模型的分类很重要)

前面简单的提到了AdaBoost算法,类别于串联电路,功能是一步步进行累加的。举个例子进行理解,就是初高中时候做题或者考试的时候,会有一个错题本,每次将里面的难题或者易错的题收集起来,多看多练习,下次在遇到的时候就不会做错了。Adaboost算法就是一样的道理,在创建每一个模型的时候就会想一想上一次训练的时候哪一些样本没有做好,那么这次就得额外重视一下还没有做好的样本数据。

在AdaBoost中有一个 样本的权重项 ,因此之后在往模型中输入数据的时候就不会都是同样的权重了,如下图示,最初的时候是相同的权重,模型训练后出现问题后,进行权重的调整,如果还出现问题,继续进行权重的调整(没有问题的数据权重调的小一些,有问题的数据权重调的大一些),这样每次调整之后就会有一个准确率,最后的结果就是加权平均,假如下图的上面三个结果(ABC)分别有90%、80%、50%的准确度,那么最终的结果就是0.9A+0.8B+0.5C。
以SVM分类器为例来演示AdaBoost的基本策略(这里就是展示AdaBoost是怎么一步步实现的)


输出结果为:(最后的标记数值,就可以显示AdaBoost每次调整的结果,以上代码是属于手写代码进行AdaBoost的基本策略的演示,实际上可以直接使用sklearn封装好的模块进行模型创建)

输出的结果为:(直接将最终的结果展示出来)

也就是之前举得998示例,基于此算法共有三个版本,最初的GBDT,后来发展到了XGBoost和最新的LightGBM,这里就介绍一下最初的GBDT提升算法的基本流程,后面两个算法也是基于同一原理,会 在之后的实际案例中会进行展示。

首先指定一下数据,然后就是依次传入数据,创建模型并训练模型,最后是进行整体模型的预测

完整代码及其数据,请移步小编的GitHub

  下面我们用一个实例学习SVM RBF分类调参(此例子是刘建平老师的博客内容,链接在文后)。

  首先,我们生成一些随机数据,为了让数据难一点,我们加入了一些噪音,代码如下:

10,SVM调参实例3(非线性支持向量机)

  非线性的话,我们一方面可以利用核函数构造出非线性,一方面我们可以自己构造非线性。下面首先学习自己构造非线性。



上一节我学习了SVM的推导过程,下面学习如何实现SVM,具体的参考链接都在第一篇文章中,SVM四篇笔记链接为:

对SVM的概念理清楚后,下面我们对其使用sklearn进行实现。

1,Sklearn支持向量机库概述

我们知道SVM相对感知器而言,它可以解决线性不可分的问题,那么它是如何解决的呢?其思想很简单就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。

下面我们用一个实例学习SVM RBF分类调参(此例子是刘建平老师的博客内容,链接在文后)。

首先,我们生成一些随机数据,为了让数据难一点,我们加入了一些噪音,代码如下:

10,SVM调参实例3(非线性支持向量机)

非线性的话,我们一方面可以利用核函数构造出非线性,一方面我们可以自己构造非线性。下面首先学习自己构造非线性。



完整代码及其数据,请移步小编的GitHub

我要回帖

更多关于 表达式10mod3的值多少 的文章

 

随机推荐