提高机器学习模型性能的五个关键方法

2023-10-27

如何提高机器学习模型性能, 可从五个关键方面入手。

1. 数据预处理

2. 特征工程

3. 机器学习算法

4. 模型集成与融合

5. 数据增强

以下是各个方面的具体分析和方法:

[ 说明:1、这里主要是各个关键方法的知识汇总梳理,便于集中学习,具体的实际应用内容后续单独写。 2、参考整理了很多大拿的文章和资料,但忘了记录来处,如有不适当转载的,请留言,我看到后第一时间删除。 ]

第一部分:数据预处理

         机器学习里有一句名言:数据和特征决定了机器学习的上限,而模型和算法的应用只是让我们逼近这个上限。这个说法形象且深刻的提出前期数据处理和特征分析的重要性。这一点从我们往往用整个数据挖掘全流程60%以上的时间和精力去做建模前期的数据处理和特征分析也能看出。那么疑问来了,这超过60%时间和精力我们都用在哪了?本文基于以往的知识储备以及实际的项目经验,我做一个总结。 主要包括三点,一是获取数据、数据抽样,二是数据探索,三是数据预处理与清洗

一、 获取数据,数据抽样:如何保证取样数据的质量?是否在足够范围内有代表性?数据样本取多少合适?如何分类(训练集、测试集、验证集)等等。当要处理或者要分析的数据量比较大,而我们的计算机或者平台不支持开展全量数据分析时,利用抽样技术进行样本分析往往是一个好的主意,其中抽样技术有:

1.简单随机抽样(simple random sampling):将所有调查总体编号,再用抽签法或随机数字表随机抽取部分观察数据组成样本。

优点:操作简单,均数、率及相应的标准误计算简单。

缺点:总体较大时,难以一一编号。

2.系统抽样(systematic sampling):又称机械抽样、等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k号观察单位,依次用相等间距从每一部分各抽取一个观察单位组成样本。

优点:易于理解、简便易行。

缺点:总体有周期或增减趋势时,易产生偏性。

3.整群抽样(cluster sampling):先将总体依照一种或几种特征分为几个子总体(类.群),每一个子总体称为一层,然后从每一层中随机抽取一个子样本,将它们合在一起,即为总体的样本,称为分层样本

优点:便于组织、节省经费。

缺点:抽样误差大于单纯随机抽样。

4.分层抽样(stratified sampling):将总体样本按其属性特征分成若干类型或层,然后在类型或层中随机抽取样本单位,合起来组成样本。有按比例分配和最优分配(过度抽样是否就是最优分配方法?)两种方案。

优点:样本代表性好,抽样误差减少。

缺点:由于通过划类分层,增大了各类型中单位间的共同性,容易抽出具有代表性的调查样本。该方法适用于总体情况复杂,各类别之间差异较大(比如金融客户风险/非风险样本的差异),类别较多的情况。

其中我们经常用到的是分层抽样和简单随机抽样,有两种抽取模式,有放回和无放回,以及两种抽取方式,按照比例抽样和按照规模抽样,其中:

有放回抽样:每次抽取的样品在下次抽样前要放回总体,也就是说,每次都是从总体中抽取数据,每次抽到各个样本的概率是相等的;

无放回抽样:每次抽取后样本总体都会减少一,所以每次抽取后,下一次抽取样本的时候,抽样概率就会改变;

按照比例抽样:按照总体的百分比多少抽取样本数据;

按照规模抽样:即按照个数抽取,抽取的样本规模是多少,规模不大于总体规模

二、 数据探索(数据质量稽核和特征分析):根据观测、调查收集到初步的样本数据集后,接下来要考虑的问题是:样本数据集的数量和质量是否满足模型构建的要求?有没有出现从未设想过的数据状态?其中有没有什么明显的规律和趋势?各因素之间有什么样的关联性?数据探索就是通过检验数据集的数据质量、绘制图表、计算某些特征量等手段,对样本数据集的结构和规律进行分析的过程。

数据探索可以从数据质量分析和数据特征分析等两个角度进行展开:

1  数据质量分析:是数据挖掘中数据准备过程中的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础。数据质量分析的主要任务是检查原始数据中是否存在脏数据,脏数据一般是指不符合要求,以及不能直接进行相应分析的数据。在数据挖掘中,脏数据包括:

1) 缺失值

2)异常值

3)不一致的值

4)重复数据及含有特殊符号的数据

1.1     缺失值分析:数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失,两者都会造成分析结果的不准确。通过使用简单的统计分析,可以得到含有缺失值的属性的个数,以及每个属性的未缺失数、缺失数与缺失率等。

1.1.1缺失值产生的原因:

1)有些信息是被遗漏的。可能是因为输入时认为不重要、忘记填写或对数据理解错误等一些人为因素而遗漏的

2)属性值不存在。

3)有些信息暂时无法获取,或者获取的代价比较大。

1.1.2缺失值的影响:

1)数据挖掘建模将丢失大量的有用信息

2)数据挖掘模型所表现出的不确定性更加显著,模型中蕴含的规律更难把握

3)包含空值的数据会使建模过程陷入混乱,导致不可靠的输出

1.2   异常值分析:异常值分析是检验数据是否有录入错误以及含有不合常理的数据。忽视异常值的存在是十分危险的,不加剔除地把异常值包括进数据的计算分析过程中,会给结果带来不良影响。异常值是指样本中的个别值,其数据明显偏离其余的观测值。异常值也称为离群点,异常值的分析也称为离群点分析。异常值分析可以通过以下3种方法来探索。

1)简单统计量分析:可以先对变量做一个描述性统计,进而查看哪些数据是不合理的。最常用的统计量是最大值和最小值。

2)3原则:如果数据服从于正态分布,在3原则下,异常值被定义为一组测定值与平均值的偏差值超过3倍标准差的值,即|x-u| >3。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。

3)箱型图分析:箱型图提供了识别异常值的一个标准:异常值通常被定义为小于QL -1.5IQR或大于QU +1.5IQR的值。

1.3   一致性分析:数据不一致性是指数据的矛盾性、不相容性。直接对不一致性的数据进行挖掘,可能会产生与实际相违背的挖掘结果。在数据挖掘过程中,不一致数据的产生主要发生在数据集成的过程中,可能是由于被挖掘数据来自于不同的数据源、对于重复存放的数据未能进行一致性更新造成的。

2  数据特征分析:对数据进行质量分析以后,可以通过绘制图表、计算某些特征量等手段进行数据的特征分析。主要通过分布分析、对比分析、统计量分析、周期性分析、贡献度分析、相关性分析等角度进行展开。

2.1  分布分析:分布分析能揭示数据的分布特征和分布类型。对于定性数据,可用饼形图和条形图直观的现实分布情况。

2.2  对比分析:对比分析是指把两个相互联系的指标进行比较,从数据量上展开和说明研究对象规模的大小,水平的高低,速度的快慢。在对比分析中,选择合适的对比标准是十分关键的步骤。

2.3  统计量分析:用统计指标对定量数据进行统计描述,常从集中趋势和离中趋势两个方面进行分析。

2.4  周期性分析:周期性分析是探索某个变量是否随着时间变化而呈现出某种周期变化趋势。时间尺度相对较长的周期性趋势有年度周期性趋势、季节性周期性趋势,相对较短的有月度周期性趋势、周度周期性趋势,甚至更短的天、小时周期性趋势。

2.5  贡献度分析:贡献度分析又称帕累托分析,它的原理是帕累托法则又称2/8定律。

2.6  相关性分析:分析连续变量之间线性相关程度的强弱,并用适当的统计指标表示出来的过程称为相关分析,

1) 判断两个变量是否具有线性相关关系的最直观的方法是直接绘制散点图;

2)需要同时考察多个变量间的相关关系时,可利用散点图矩阵同时绘制各变量间的散点图,从而快速发现多个变量间的主要相关性;

计算相关系数:为了更加准确的描述变量之间的线性相关程度,可以通过计算相关系数来进行相关分析。在二元变量的相关分析过程中比较常用的有Pearson相关系数、Spearman秩相关系数和判定系数。

1)Pearson相关系数:一般用于分析两个连续性变量之间的关系;

2)Spearman秩相关系数:一般用来处理不服从正态分布的变量、分类或等级变量之间的关联性,也称等级相关系数。

3)判定系数:判定系数是相关系数的平方,用r^2表示:用来衡量回归方程对y的解释程度。

三、 数据预处理和清洗(data preprocessing):是指在主要的处理以前对数据进行的一些处理,现实世界中数据大体上都是不完整,不一致的脏数据,无法直接进行数据挖掘,或挖掘结果差强人意。为了提高数据挖掘的质量产生了数据预处理技术。数据预处理有多种方法:数据清理,数据集成,数据变换,数据归约等。这些数据处理技术在数据挖掘之前使用,大大提高了数据挖掘模式的质量,降低实际挖掘所需要的时间。

1、 数据清理:通过填写缺失的值、光滑噪声数据、识别或删除离群点并解决不一致性来“清理”数据。主要是达到如下目标:格式标准化,异常数据清除,错误纠正,重复数据的清除。

1)处理缺失值方法:

a.忽略元祖,挖掘任务涉及分类任务中如果缺少类标号时通常这样做

b.人工填写缺失值,量大时行不通

c.使用一个全局常量填充缺失值,简单但不可靠

d.使用属性的均值填充缺失值

e.使用与给定元组属同一类的所有样本的属性均值

f.使用最有可能的值填充缺失值,可以用回归,使用贝叶斯形式化的基于推理的工具或决策树归纳确定,是流行的做法。

2)数据光滑技术:噪声是被测量的变量的随机误差或方差

a.分箱,分箱方法通过考察数据的“近邻”(即周围的值)来光滑有序数据的值,有序值分布到一些“桶”或箱中。由于分箱方法考察近邻的值,因此进行局部光滑。几种分箱技术:用箱均值光滑、用箱边界光滑、用箱中位数光滑。

b.回归:可以用一个函数(如回归函数)拟合数据来光滑数据。线性回归涉及找出拟合两个属性(或变量)的“最佳”线,是的一个属性可以用来预测另一个。多元线性回归是线性回归的扩展,其中涉及的属性多于两个,并且数据拟合到一个多维曲面。

c.聚类:通过聚类检测离群点

2、 数据集成:将多个数据源中的数据结合起来并统一存储,建立数据仓库的过程实际上就是数据集成,具体来讲就是将分散在不同来源的数据有机地整合到一起的一步,例如宽表整合。明确哪些数据源可用?哪些数据与当前挖掘目标相关?。其中要考虑三个问题:实体识别、数据冗余和数据值冲突检测与处理。

数据分析任务多半涉及数据集成。数据集成合并多个数据源中的数据,存放在一个一致的数据存储(如数据仓库)中。这些数据源可能包括多个数据库、数据立方体或一般文件。数据集成有三个主要问题:

a.模式集成和对象匹配,实体识别问题:来自多个信息源的现实世界的等价实体如何才能匹配?元数据可以帮助避免模式集成的错误。

b.冗余:有些冗余可以被相关分析检测到。通过计算属性A,B的相关系数(皮尔逊积矩系数)来判断是否冗余;对于离散数据,可通过卡方检验来判断两个属性A和B之间的相关联系。

c.数据值冲突的检测与处理

3、 数据变换:通过平滑聚集,数据概化,规范化等方式将数据转换成适用于数据挖掘的形式。其中平滑可以用分箱、聚类和回归来实现。数据泛化过程即概念分层,将低层次的数据提炼到更高一级的概念层次中。规范化又有最大最小规范化、0-值规范化和小数定标规范化。此外还可以构造新的属性来使数据集成。

a.光滑:去掉数据的噪声,包括分箱,回归和聚类

b.聚集:对数据进行汇总或聚集。这一步通常用来为多粒度数据分析构造数据立方体

c.数据泛化:使用概念分层,用高层概念替换底层或“原始”数据。

d.规范化:又称为归一化,feature scaling特征缩放。将属性数据按比例缩放,使之落入一个小的特定区间。规范化方法:

1.最小-最大规范化:v'=[(v-min)/(max-min)]*(new_max-new_min)+new_min

2.z-score规范化(或零均值规范化):v'=(v-属性A的均值E)/属性A的标准差∽

3.小数定标规范化:v'=v/10的j次方,j是使Max(|v'|)<1的最小整数

e.属性构造(或特征构造):可以构造新的属性并添加到属性集中,以帮助挖掘过程。

4、 数据归约:数据挖掘时往往数据量非常大,在少量数据上进行挖掘分析需要很长的时间,数据归约技术可以用来得到数据集的归约表示,它小得多,但仍然接近于保持原数据的完整性,并结果与归约前结果相同或几乎相同。此类技术主要有如下几类:

a、 数据方聚集、

b、 维规约(检测并删除不相关、弱相关或冗余的属性或维)

c、 数据压缩(小波或傅立叶变换以及主成份分析)

d、 数值规约(用替代的、较小的数据表示替换或估计数据):主要有回归、直方图、聚类、选样等操作

e、 还有概念分层。

第二部分:特征工程

特征是数据中抽取出来的对结果预测有用的信息,可以是文本或者数据。特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。过程包含了特征提取、特征构建、特征选择等模块

这里写图片描述

一、特征构造:就是从原始的数据中构造特征集,原始数据可能是时间戳、文本、图片、音频等。我们需要从这些数据中构建特征集。下面介绍主要的特征构建方法。

1,对数值型数据: 
(1)无量纲化:在对于非tree base 的模型,对数据的规格要求其实是很高的,这就需要无量纲化各个维度的数据。常用方法:归一化(StandardScaler类,本文所用到方法全是sklearn中的)、最大最小区间缩放(MinMaxScaler类)、正则归一化(Normalizer类) 
(2)统计值:包括max, min, mean, std等。对数据计算的统计值也可以作为特征,只要与问题有关。 
(3)离散化: 也就是分箱/分区操作,把连续值转成非线性数据,比如成绩可以分为A、B、C三等,也可以理解为把数据分成类别。常用对定量特征二值化(Binarizer类)。

2,对类别型数据: 对于类别型数据不能用数值表示。(比如颜色{红、绿、蓝},数字1、2、3可以表示,但是颜色本身没有数学关系,这会误导我们的数学模型)。常用的方法是热编码-(one-hot方法)(OneHotEncoder类)

3,对时间戳数据: 很多任务与时间维度有关系,比如用电量等,此时要将时间戳数据转换为时间特征。常见的转换有: 
(1)day of weak(一周的星期几)、day of month、day of year、week of year、month of year、hour of day、minute of day 、哪个季度。 
(2)t_m24(前一天的数值)、t_m48(前两天的数值)等。 
(3)tdif(与亲一天的数值的差值)等。

4,对文本数据: 
(1)词袋:本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。Python中用CountVectorizer处理词袋。 也就是考虑某个词在当前训练样本中出现的频率。 
(2)使用TF-IDF特征:TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF(t) = (词t在当前文中出现次数) / (t在全部文档中出现次数),IDF(t) = ln(总文档数/ 含t的文档数),TF-IDF权重 = TF(t) * IDF(t)。自然语言处理中经常会用到。(考虑到了这个词语是不是在大部分文件都出现了,即包含这个词语的文本条数的倒数,这种词语一般没有什么作用,排除掉常用词语的干扰)

5,计算统计特征: 很多时候统计特征对问题很有帮助,统计的内容包括加减平均、分位线、次序型、比例类等。

6,组合特征: 
(1)拼接型:简单的组合特征。就是把多个特征组合成一个(男人喜欢打篮球:就是把男人,喜欢打篮球和在一起了) 
  - user_id&&category: 10001&&女裙 10002&&男士牛仔 
  - user_id&&style: 10001&&蕾丝 10002&&全棉   
(2) 模型特征组合: 
  - 用GBDT产出特征组合路径 
  - 组合特征和原始特征一起放进LR训练

7,缺失特征处理: 对于缺失特征可以修改成新的特征,也可以删除,常用有: 
(1)删除:最简单的方法是删除,删除属性或者删除样本。如果大部分样本该属性都缺失,这个属性能提供的信息有限,可以选择放弃使用该维属性;如果一个样本大部分属性缺失,可以选择放弃该样本。虽然这种方法简单,但只适用于数据集中缺失较少的情况。 
(2) 统计填充:对于缺失值的属性,尤其是数值类型的属性,根据所有样本关于这维属性的统计值对其进行填充,如使用平均数、中位数、众数、最大值、最小值等,具体选择哪种统计值需要具体问题具体分析。另外,如果有可用类别信息,还可以进行类内统计,比如身高,男性和女性的统计填充应该是不同的。 
(3) 统一填充:对于含缺失值的属性,把所有缺失值统一填充为自定义值,如何选择自定义值也需要具体问题具体分析。当然,如果有可用类别信息,也可以为不同类别分别进行统一填充。常用的统一填充值有:“空”、“0”、“正无穷”、“负无穷”等。 
(4) 预测填充:我们可以通过预测模型利用不存在缺失值的属性来预测缺失值,也就是先用预测模型把数据填充后再做进一步的工作,如统计、学习等。虽然这种方法比较复杂,但是最后得到的结果比较好。

8,特征转换: 对已有的特征做变换,产生新的特征。常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。4个特征,度为2的多项式转换公式如下: 
这里写图片描述

二、特征选择: 
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。原始的特征可能有冗余(两个特征说的是一个问题,相关性太强)、噪声(会影响问题的效果)。通常来说,从两个方面考虑来选择特征:

特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。 
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

1,filter(过滤法)方法:评估单个特征和结果值之间的相关程度, 排序留下Top相关的特征部分。 评价方式: Pearson相关系数, 互信息, 距离相关度。 缺点:只评估了单个特征对结果的影响,没有考虑到特征之间的关联作用, 可能把有用的关联特征误踢掉。因此工业界使用比较少。

(1)方差选择:计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类。 
(2)相关系数法:计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择。 
(卡方检验是检验定性自变量对定性因变量的相关性,互信息是评价定性自变量对定性因变量的相关性,可以用这两个值和SelectKBest类来选择)

2,wrapper(包裹法): 方法:把特征选择看做一个特征子集搜索问题, 筛选各种特 征子集, 用模型评估子集特征的效果。 典型算法:“递归特征删除算法”,应用在逻辑回归的过程: 
a.用全量特征跑一个模型; 
b.根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化; 
c.逐步进行, 直至准确率/auc出现大的下滑停止。 
(python中是RFE类)

3,嵌入法: 方法:根据模型来分析特征的重要性,最常见的方式为用正则化方式来做特征选择。(这种方式在工业界很常用) 
(1)基于惩罚项的方法:就是用L1,L2正则化来做特征选择。L1正则有截断效应:不重要的特征的参数权重为0,L1正则方法具有稀疏解的特性,因此天然具备特征选择的特性,但是要注意,L1没有选到的特征不代表不重要,原因是两个具有高相关性的特征可能只保留了一个,如果要确定哪个特征重要应再通过L2正则方法交叉检验;;L2正则有缩放效应:拿到手的特征都比较小。SelectFromModel类来解决。

(2)基于树模型的特征选择法:树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型。

三、特征降维: 当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样: PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。(这在python都有相应的方法) 
(降维是进行特征的变换和映射产生了不同的维度更小的特征,二特征选择是在原始的特征中选择有意义的特征,并没有产生新的特征)

备注: 
1,特征处理完后,就应该进行模型训练和模型选择,模型的训练可以用sklearn或者很多其他机器学习的包做,模型的选择可以参考: 
sklearn超参数选择: 
http://blog.csdn.net/u014248127/article/details/78938561 
sklearn中的交叉验证与参数选择: 
http://blog.csdn.net/u014248127/article/details/78899195

2,本篇文章中的代码实现可以参考:使用sklearn做单机特征工程 
http://www.cnblogs.com/jasonfreak/p/5448385.html

第三部分:机器学习算法

  从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。但从实践的意义上来说,机器学习是一种通过利用数据,训练出模型,然后使用模型预测的一种方法。

  机器学习无疑是当前数据分析领域的一个热点内容。很多人在平时的工作中都或多或少会用到机器学习的算法。从范围上来说,机器学习跟模式识别,统计学习,数据挖掘是类似的,同时,机器学习与其他领域的处理技术的结合,形成了计算机视觉、语音识别、自然语言处理等交叉学科。因此,一般说数据挖掘时,可以等同于说机器学习。同时,我们平常所说的机器学习应用,应该是通用的,不仅仅局限在结构化数据,还有图像,音频等应用。

  机器学习的算法很多。很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的。这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的类似性。

一、机器学习方式

  根据数据类型的不同,对一个问题的建模有不同的方式。在机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得最好的结果。

1.1 监督学习

这里写图片描述

  在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1“,”2“,”3“,”4“等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类问题和回归问题。常见算法有逻辑回归(Logistic Regression)和反向传递神经网络(Back Propagation Neural Network)

1.2 无监督学习

这里写图片描述

  在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。常见的应用场景包括关联规则的学习以及聚类等。常见算法包括Apriori算法以及k-Means算法。

1.3 半监督学习

这里写图片描述

  在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。如图论推理算法(Graph Inference)或者拉普拉斯支持向量机(Laplacian SVM.)等。

1.4 强化学习

这里写图片描述

  在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻作出调整。常见的应用场景包括动态系统以及机器人控制等。常见算法包括Q-Learning以及时间差学习(Temporal difference learning)

二、机器学习常用算法

  根据算法的功能和形式的类似性,我们可以把算法分类,比如说基于树的算法,基于神经网络的算法等等。当然,机器学习的范围非常庞大,有些算法很难明确归类到某一类。而对于有些分类来说,同一分类的算法可以针对不同类型的问题。这里,我们尽量把常用的算法按照最容易理解的方式进行分类。

2.1 回归算法(有监督学习)

这里写图片描述

  在大部分机器学习课程中,回归算法都是介绍的第一个算法。原因有两个:一.回归算法比较简单,介绍它可以让人平滑地从统计学迁移到机器学习中。二.回归算法是后面若干强大算法的基石,如果不理解回归算法,无法学习那些强大的算法。回归算法有两个重要的子类:即线性回归和逻辑回归。

  回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法。回归算法是统计机器学习的利器。在机器学习领域,人们说起回归,有时候是指一类问题,有时候是指一类算法,这一点常常会使初学者有所困惑。常见的回归算法包括:最小二乘法(Ordinary Least Square),逻辑回归(Logistic Regression),逐步式回归(Stepwise Regression),多元自适应回归样条(Multivariate Adaptive Regression Splines)以及本地散点平滑估计(Locally Estimated Scatterplot Smoothing)

  • 线性回归就是如何拟合出一条直线最佳匹配我所有的数据?一般使用“最小二乘法”来求解。“最小二乘法”的思想是这样的,假设我们拟合出的直线代表数据的真实值,而观测到的数据代表拥有误差的值。为了尽可能减小误差的影响,需要求解一条直线使所有误差的平方和最小。最小二乘法将最优问题转化为求函数极值问题。函数极值在数学上我们一般会采用求导数为0的方法。但这种做法并不适合计算机,可能求解不出来,也可能计算量太大。

  • 逻辑回归是一种与线性回归非常类似的算法,但是,从本质上讲,线型回归处理的问题类型与逻辑回归不一致。线性回归处理的是数值问题,也就是最后预测出的结果是数字,例如房价。而逻辑回归属于分类算法,也就是说,逻辑回归预测结果是离散的分类,例如判断这封邮件是否是垃圾邮件,以及用户是否会点击此广告等等。

    实现方面的话,逻辑回归只是对对线性回归的计算结果加上了一个Sigmoid函数,将数值结果转化为了0到1之间的概率(Sigmoid函数的图像一般来说并不直观,你只需要理解对数值越大,函数越逼近1,数值越小,函数越逼近0),接着我们根据这个概率可以做预测,例如概率大于0.5,则这封邮件就是垃圾邮件,或者肿瘤是否是恶性的等等。从直观上来说,逻辑回归是画出了一条分类线,逻辑回归算法划出的分类线基本都是线性的(也有划出非线性分类线的逻辑回归,不过那样的模型在处理数据量较大的时候效率会很低)。

2.2 正则化方法

这里写图片描述

  正则化方法是其他算法(通常是回归算法)的延伸,根据算法的复杂度对算法进行调整。正则化方法通常对简单模型予以奖励而对复杂算法予以惩罚。常见的算法包括:Ridge Regression, Least Absolute Shrinkage and Selection Operator(LASSO),以及弹性网络(Elastic Net)。

2.3 基于实例的算法

这里写图片描述

  基于实例的算法常常用来对决策问题建立模型,这样的模型常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。因此,基于实例的算法常常也被称为“赢家通吃”学习或者“基于记忆的学习”。常见的算法包括 k-Nearest Neighbor(KNN), 学习矢量量化(Learning Vector Quantization, LVQ),以及自组织映射算法(Self-Organizing Map , SOM)

2.4 决策树算法

  决策树算法根据数据的属性采用树状结构建立决策模型, 决策树模型常常用来解决分类和回归问题。常见的算法包括:分类及回归树(Classification And Regression Tree, CART), ID3 (Iterative Dichotomiser 3), C4.5, Chi-squared Automatic Interaction Detection(CHAID), Decision Stump, 随机森林(Random Forest), 多元自适应回归样条(MARS)以及梯度推进机(Gradient Boosting Machine, GBM)

  一般的机器学习模型至少考虑两个量:一个是因变量,也就是我们希望预测的结果,在这个例子里就是小Y迟到与否的判断。另一个是自变量,也就是用来预测小Y是否迟到的量。假设我把时间作为自变量,譬如我发现小Y所有迟到的日子基本都是星期五,而在非星期五情况下他基本不迟到。于是我可以建立一个模型,来模拟小Y迟到与否跟日子是否是星期五的概率。就是一个最简单的机器学习模型,称之为决策树。

  当我们考虑的自变量只有一个时,情况较为简单。如果把我们的自变量再增加一个。例如小Y迟到的部分情况时是在他开车过来的时候(你可以理解为他开车水平较臭,或者路较堵)。于是我可以关联考虑这些信息。建立一个更复杂的模型,这个模型包含两个自变量与一个因变量。再更复杂一点,小Y的迟到跟天气也有一定的原因,例如下雨的时候,这时候我需要考虑三个自变量。

  如果我希望能够预测小Y迟到的具体时间,我可以把他每次迟到的时间跟雨量的大小以及前面考虑的自变量统一建立一个模型。于是我的模型可以预测值,例如他大概会迟到几分钟。这样可以帮助我更好的规划我出门的时间。在这样的情况下,决策树就无法很好地支撑了,因为决策树只能预测离散值。我们可以用线型回归方法建立这个模型。

  如果我把这些建立模型的过程交给电脑。比如把所有的自变量和因变量输入,然后让计算机帮我生成一个模型,同时让计算机根据我当前的情况,给出我是否需要迟出门,需要迟几分钟的建议。那么计算机执行这些辅助决策的过程就是机器学习的过程。

2.5 贝叶斯方法

这里写图片描述

  贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题。常见算法包括:朴素贝叶斯算法,平均单依赖估计(Averaged One-Dependence Estimators, AODE),以及Bayesian Belief Network(BBN)。

2.6 基于核的算法(有监督学习)

这里写图片描述

  基于核的算法中最著名的莫过于支持向量机(SVM)了。 基于核的算法把输入数据映射到一个高阶的向量空间, 在这些高阶向量空间里, 有些分类或者回归问题能够更容易的解决。 常见的基于核的算法包括:支持向量机(Support Vector Machine, SVM), 径向基函数(Radial Basis Function ,RBF), 以及线性判别分析(Linear Discriminate Analysis ,LDA)等。接下来将重点介绍一下SVM

· 支持向量机 SVM

  支持向量机算法是诞生于统计学习界,同时在机器学习界大放光彩的经典算法。

  支持向量机算法从某种意义上来说是逻辑回归算法的强化:通过给予逻辑回归算法更严格的优化条件,支持向量机算法可以获得比逻辑回归更好的分类界线。但是如果没有某类函数技术,则支持向量机算法最多算是一种更好的线性分类技术。

  但是,通过跟高斯“核”的结合,支持向量机可以表达出非常复杂的分类界线,从而达成很好的的分类效果。“核”事实上就是一种特殊的函数,最典型的特征就是可以将低维的空间映射到高维的空间。

  SVM方法是通过一个非线性映射p,把样本空间映射到一个高维乃至无穷维的特征空间中(Hilber空间),使得在原来的样本空间中非线性可分的问题转化为在特征空间中的线性可分的问题。升维,就是把样本向高维空间做映射,一般情况下这会增加计算的复杂性,甚至会引起“维数灾难”,因而人们很少问津。但是作为分类、回归等问题来说,很可能在低维样本空间无法线性处理的样本集,在高维特征空间中却可以通过一个线性超平面实现线性划分(或回归)。一般的升维都会带来计算的复杂化,SVM方法巧妙地解决了这个难题:应用核函数的展开定理,就不需要知道非线性映射的显式表达式;由于是在高维特征 空间中建立线性学习机,所以与线性模型相比,不但几乎不增加计算的复杂性,而且在某种程度上避免了“维数灾难”.这一切要归功于核函数的展开和计算理论。

  选择不同的核函数,可以生成不同的SVM,常用的核函数有以下4种: 
  - 性核函数K(x,y)=x·y 
  - 多项式核函数K(x,y)=[(x·y)+1]d 
  - 向基函数K(x,y)=exp(-|x-y|^2/d^2) 
  - 层神经网络核函数K(x,y)=tanh(a(x·y)+b)

  如下图所示,我们如何在二维平面划分出一个圆形的分类界线?在二维平面可能会很困难,但是通过“核”可以将二维空间映射到三维空间,然后使用一个线性平面就可以达成类似效果。也就是说,二维平面划分出的非线性分类界线可以等价于三维平面的线性分类界线。于是,我们可以通过在三维空间中进行简单的线性划分就可以达到在二维平面中的非线性划分效果。

待分类数据

已分类数据

  支持向量机是一种数学成分很浓的机器学习算法(相对的,神经网络则有生物科学成分)。在算法的核心步骤中,有一步证明,即将数据从低维映射到高维不会带来最后计算复杂性的提升。于是,通过支持向量机算法,既可以保持计算效率,又可以获得非常好的分类效果。因此支持向量机在90年代后期一直占据着机器学习中最核心的地位,基本取代了神经网络算法。直到现在神经网络借着深度学习重新兴起,两者之间才又发生了微妙的平衡转变。

2.7 聚类算法(无监督学习)

这里写图片描述

  聚类,就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。简单来说,聚类算法就是计算种群中的距离,根据距离的远近将数据划分为多个族群,所以的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类。常见的聚类算法包括 k-Means算法以及期望最大化算法(Expectation Maximization, EM)。

2.8 关联规则学习

这里写图片描述

  关联规则学习通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则。常见算法包括 Apriori算法和Eclat算法等。

2.9 人工神经网络 ANN(有监督学习)

  神经网络(也称之为人工神经网络,ANN)算法是80年代机器学习界非常流行的算法,不过在90年代中途衰落。现在,携着“深度学习”之势,神经网络重装归来,重新成为最强大的机器学习算法之一。

  神经网络的诞生起源于对大脑工作机理的研究。早期生物界学者们使用神经网络来模拟大脑。机器学习的学者们使用神经网络进行机器学习的实验,发现在视觉与语音的识别上效果都相当好。在BP算法(加速神经网络训练过程的数值算法)诞生以后,神经网络的发展进入了一个热潮。BP算法的发明人之一是前面介绍的机器学习大牛Geoffrey Hinton。

  人工神经网络是机器学习的一个庞大的分支,有几百种不同的算法,通常用于解决分类和回归问题。(其中深度学习就是其中的一类算法,我们会单独讨论),重要的人工神经网络算法包括:感知器神经网络(Perceptron Neural Network), 反向传递(Back Propagation),Hopfield网络,自组织映射(Self-Organizing Map, SOM)。学习矢量量化(Learning Vector Quantization, LVQ)

  具体说来,神经网络的学习机理是什么?简单来说,就是分解与整合。在著名的Hubel-Wiesel试验中,学者们研究猫的视觉分析机理是这样的。

这里写图片描述

  比方说,一个正方形,分解为四个折线进入视觉处理的下一层中。四个神经元分别处理一个折线。每个折线再继续被分解为两条直线,每条直线再被分解为黑白两个面。于是,一个复杂的图像变成了大量的细节进入神经元,神经元处理以后再进行整合,最后得出了看到的是正方形的结论。这就是大脑视觉识别的机理,也是神经网络工作的机理。

  让我们看一个简单的神经网络的逻辑架构。在这个网络中,分成输入层,隐藏层,和输出层。输入层负责接收信号,隐藏层负责对数据的分解与处理,最后的结果被整合到输出层。每层中的一个圆代表一个处理单元,可以认为是模拟了一个神经元,若干个处理单元组成了一个层,若干个层再组成了一个网络,也就是”神经网络”。

这里写图片描述

  上图描述的是一个目前研究最为成熟Shallow 结构的神经网络(只含有单层隐藏层神经元的结构)。第一层为输入层 (input layer ),第二层称为隐藏层 ( hidden layer ),最后一层为输出层( output layer )。神经元之间都是由低层出发,终止于高层神经元的一条有向边进行连接,每条边都有自己的权重。每个神经元都是一个计算单元,如在Feed-forward neural network 中,除输入层神经元外,每个神经元为一个计算单元,可以通过一个计算函数 f() 来表示,函数的具体形式可以自己定义,现在用的较多的是 感知器计算神经元,如果你对感知器有所了解的话,理解起来会容易很多。 可以计算此时神经元所具有的能量值,当该值超过一定阀值的时候神经元的状态就会发生改变,神经元只有两种状态,激活或未激活。在实际的人工神经网络中,一般是用一种概率的方式去表示神经元是否处于激活状态,可以用 h(f) 来表示,f 代表神经元的能量值,h(f) 代表该能量值使得神经元的状态发生改变的概率有多大,能量值越大,处于激活状态的概率就越高。到这部分你已经接触到了关于神经网络的几个基本术语,下面用更加规范的符号来表示,神经元的激活值(activations) f() ,表示计算神经元的能量值, 神经元的激活状态 h(f) ,h 表示激活函数。


在神经网络中,每个处理单元事实上就是一个逻辑回归模型,逻辑回归模型接收上层的输入,把模型的预测结果作为输出传输到下一个层次。通过这样的过程,神经网络可以完成非常复杂的非线性分类。

  下图会演示神经网络在图像识别领域的一个著名应用,这个程序叫做LeNet,是一个基于多个隐层构建的神经网络。通过LeNet可以识别多种手写数字,并且达到很高的识别精度与拥有较好的鲁棒性。

这里写图片描述

  右下方的方形中显示的是输入计算机的图像,方形上方的红色字样“answer”后面显示的是计算机的输出。左边的三条竖直的图像列显示的是神经网络中三个隐藏层的输出,可以看出,随着层次的不断深入,越深的层次处理的细节越低,例如层3基本处理的都已经是线的细节了。LeNet的发明人就是前文介绍过的机器学习的大牛Yann LeCun。

  大约二三十年前,Neural Network曾经是ML领域特别火热的一个方向,但是后来确慢慢淡出了,进入90年代,神经网络的发展进入了一个瓶颈期。其主要原因是尽管有BP算法的加速,神经网络的训练过程仍然很困难。因此90年代后期支持向量机(SVM)算法取代了神经网络的地位。 
   
  原因包括以下几个方面: 
  1. 比较容易过训练,参数比较难确定; 
  2. 训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;

  所以中间有大约20多年的时间,神经网络被关注很少,这段时间基本上由SVM和Boosting算法主导。但是,Hinton坚持下来并最终(和Bengio、Yann.lecun等)提成了一个实际可行的Deep Learning框架。

2.10 深度学习

这里写图片描述

  虽然深度学习这四字听起来颇为高大上,但其理念却非常简单,就是传统的神经网络发展到了多隐藏层的情况。

  在上文介绍过,自从90年代以后,神经网络已经消寂了一段时间。但是BP算法的发明人Geoffrey Hinton一直没有放弃对神经网络的研究。由于神经网络在隐藏层扩大到两个以上,其训练速度就会非常慢,因此实用性一直低于支持向量机。2006年,Geoffrey Hinton在科学杂志《Science》上发表了一篇文章,论证了两个观点:

  1.多隐层的神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类; 
  2.深度神经网络在训练上的难度,可以通过“逐层初始化” 来有效克服。

  通过这样的发现,不仅解决了神经网络在计算上的难度,同时也说明了深层神经网络在学习上的优异性。从此,神经网络重新成为了机器学习界中的主流强大学习技术。同时,具有多个隐藏层的神经网络被称为深度神经网络,基于深度神经网络的学习研究称之为深度学习。

  由于深度学习的重要性质,在各方面都取得极大的关注,按照时间轴排序,有以下四个标志性事件值得一说:

  1. 2012年6月,《纽约时报》披露了Google Brain项目,这个项目是由Andrew Ng和Map-Reduce发明人Jeff Dean共同主导,用16000个CPU Core的并行计算平台训练一种称为“深层神经网络”的机器学习模型,在语音识别和图像识别等领域获得了巨大的成功。Andrew Ng就是文章开始所介绍的机器学习的大牛。 
  2. 2012年11月,微软在中国天津的一次活动上公开演示了一个全自动的同声传译系统,讲演者用英文演讲,后台的计算机一气呵成自动完成语音识别、英中机器翻译,以及中文语音合成,效果非常流畅,其中支撑的关键技术是深度学习; 
  3. 2013年1月,在百度的年会上,创始人兼CEO李彦宏高调宣布要成立百度研究院,其中第一个重点方向就是深度学习,并为此而成立深度学习研究院(IDL)。 
  4. 2013年4月,《麻省理工学院技术评论》杂志将深度学习列为2013年十大突破性技术(Breakthrough Technology)之首。

  神经网络研究领域领军者Hinton在2006年提出了神经网络Deep Learning算法,使神经网络的能力大大提高,向支持向量机发出挑战。Deep Learning假设神经网络是多层的,首先用RestrictedBoltzmann Machine(非监督学习)学习网络的结构,然后再通过Back Propagation(监督学习)学习网络的权值。

  深度学习算法是对人工神经网络的发展。 在近期赢得了很多关注, 深度学习试图建立大得多也复杂得多的神经网络。很多深度学习的算法是半监督式学习算法,用来处理存在少量未标识数据的大数据集。常见的深度学习算法包括:受限波尔兹曼机(Restricted Boltzmann Machine, RBN), Deep Belief Networks(DBN),卷积网络(Convolutional Network), 堆栈式自动编码器(Stacked Auto-encoders)。

  总之,deep learning能够得到更好地表示数据的feature,同时由于模型的层次、参数很多,capacity足够,因此,模型有能力表示大规模数据,所以对于图像、语音这种特征不明显(需要手工设计且很多没有直观物理含义)的问题,能够在大规模训练数据上取得更好的效果。此外,从模式识别特征和分类器的角 度,deep learning框架将feature和分类器结合到一个框架中,用数据去学习feature,在使用中减少了手工设计feature的巨大工作量(这是目前工业界工程师付出努力最多的方面),因此,不仅仅效果可以更好,而且,使用起来也有很多方便之处。


Deep Learning与传统的神经网络异同:

  • 相同点: Deep Learning采用了神经网络相似的分层结构,系统由包括输入层、隐层(多层)、输出层组成的多层网络,只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个Logistic Regression模型;这种分层结构,是比较接近人类大脑的结构的。

  • 不同点:而为了克服神经网络训练中的问题,DL采用了与神经网络很不同的训练机制。传统神经网络中,采用的是Back Propagation的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和label之间的 差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。而DeepLearning整体上是一个Layer-Wise的训练机制。这样做的原因是因为,如果采用Back Propagation的机制,对于一个Deep Network(7层以上),残差传播到最前面的层已经变得太小,出现所谓的Gradient Diffusion。

2.11 降低维度算法(无监督学习)

这里写图片描述

  像聚类算法一样,降低维度算法试图分析数据的内在结构,不过降低维度算法是以非监督学习的方式试图利用较少的信息来归纳或者解释数据。这类算法可以用于高维数据的可视化或者用来简化数据以便监督式学习使用。常见的算法包括:主成份分析(Principle Component Analysis, PCA),偏最小二乘回归(Partial Least Square Regression,PLS), Sammon映射,多维尺度(Multi-Dimensional Scaling, MDS), 投影追踪(Projection Pursuit)等。

  其主要特征是将数据从高维降低到低维层次。在这里,维度其实表示的是数据的特征量的大小,例如,房价包含房子的长、宽、面积与房间数量四个特征,也就是维度为4维的数据。可以看出来,长与宽事实上与面积表示的信息重叠了,例如面积=长 × 宽。通过降维算法我们就可以去除冗余信息,将特征减少为面积与房间数量两个特征,即从4维的数据压缩到2维。于是我们将数据从高维降低到低维,不仅利于表示,同时在计算上也能带来加速。

  刚才说的降维过程中减少的维度属于肉眼可视的层次,同时压缩也不会带来信息的损失(因为信息冗余了)。如果肉眼不可视,或者没有冗余的特征,降维算法也能工作,不过这样会带来一些信息的损失。但是,降维算法可以从数学上证明,从高维压缩到的低维中最大程度地保留了数据的信息。因此,使用降维算法仍然有很多的好处。

  降维算法的主要作用是压缩数据与提升机器学习其他算法的效率。通过降维算法,可以将具有几千个特征的数据压缩至若干个特征。另外,降维算法的另一个好处是数据的可视化,例如将5维的数据压缩至2维,然后可以用二维平面来可视。降维算法的主要代表是PCA算法(即主成分分析算法)。

2.12 集成算法

这里写图片描述

  集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。这是一类非常强大的算法,同时也非常流行。常见的算法包括:Boosting, Bootstrapped Aggregation(Bagging), AdaBoost,堆叠泛化(Stacked Generalization, Blending),梯度推进机(Gradient Boosting Machine, GBM),随机森林(Random Forest)。

第四部分:模型集成与融合

在机器学习训练完模型之后我们要考虑模型的效率问题,常用的模型效率分析手段有:

  • 研究模型学习曲线,判断模型是否过拟合或者欠拟合,并做出相应的调整;
  • 对于模型权重参数进行分析,对于权重绝对值高/低的特征,可以对特征进行更细化的工作,也可以进行特征组合;
  • 进行bad-case分析,对错误的例子分析是否还有什么可以修改挖掘
  • 模型融合:模型融合就是训练多个模型,然后按照一定的方法集成过个模型,应为它容易理解、实现也简单,同时效果也很好,在工业界的很多应用,在天池、kaggle比赛中也经常拿来做模型集成。

这篇文章主要机器学习中的模型融合,包括bagging,Boosting两种思想的方法。

一、模型融合的认识、分析: 
1,模型融合的概念: 下图介绍了模型融合的一般结构:先产生一组”个体学习器 ,再用某种策略将它们结合起来,加强模型效果。 
这里写图片描述

2,模型融合应用广发的原因: 可以通过数学证明模型,随着集成中个体分类器数目T 的增大,集成的错误率将指数级下降,最终趋向于零。具体证明在周志华和李航老师的书中都有。

3,模型融合的条件:个体学习器准确性越高、多样性越大,则融合越好。(这里写图片描述,E代表融合后的误差加权均值,这里写图片描述代表个体学习器的误差加权均值,这里写图片描述代表模型的多样性,也就是各个模型之间的分歧值)

Base Model 之间的相关性要尽可能的小。这就是为什么非 Tree-based Model 往往表现不是最好但还是要将它们包括在 Ensemble 里面的原因。Ensemble 的 Diversity 越大,最终 Model 的 Bias 就越低。 
Base Model 之间的性能表现不能差距太大。这其实是一个 Trade-off,在实际中很有可能表现相近的 Model 只有寥寥几个而且它们之间相关性还不低。但是实践告诉我们即使在这种情况下 Ensemble 还是能大幅提高成绩。

4,模型融合的分类: 按照个体学习器的关系可以分为两类:

  • 个体学习器问存在强依赖关系、必须串行生成的序列化方法,代表Boosting方法;
  • 个体学习器间不存在强依赖关系、可同时生成的并行化方法,代表是Bagging 和”随机森林” 。

二、个体学习器依赖的融合-boosting: 
1,boosting方法的思想: 
Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2;如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。 
这里写图片描述

2,Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。

AdaBoost算法:是加法模型、损失函数为指数函数、学习算法为前向分布算法时的二分类算法。

提升树:是加法模型、学习算法为前向分布算法时的算法。不过它限定基本学习器为决策树。对于二分类问题,损失函数为指数函数,就是把AdaBoost算法中的基本学习器限定为二叉决策树就可以了;对于回归问题,损失函数为平方误差,此时,拟合的是当前模型的残差。

梯度提升树:是对提升树算法的改进,提升树算法只适合误差函数为指数函数和平方误差,对于一般的损失函数,梯度提升树算法利用损失函数的负梯度在当前模型的值,作为残差的近似值。(GBDT算法有两种描述思路,一个是基于残差的版本(当损失函数是均方差损失时,因为对均方差求导后就是2(y-y_hat) 就是真实值和预测值得残差方向,一个是基于梯度gradient的版本(当损失函数是其它损失函数时,例如交叉熵损失)。说白了都是基于梯度的,只不过均方差求导后变成残差了)

三、个体学习器不依赖依赖的融合-bagging: 
1,bagging方法的思想: bagging算法的思想是通过对样本采样的方式,使我们的基本学习器存在较大的差异。 
这里写图片描述

2,bagging系类算法 常见有bagging算法和随机深林算法

bagging算法:采用的是自助采样法(Bootstap sampling),即对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回,也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集,由于是随机采样,这样每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的弱学习器。

随机森林: 是对bagging算法的改进。改进一:基本学习器限定为决策树,改进二:除了bagging的在样本上加上扰动,同时在属性上也加上扰动,即是在决策树学习的过程中引入了随机属性选择,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。

四、模型融合的结合策略: 基本学习器学习完后,需要将各个模型进行融合,常见的策略有:

1,平均法: 平均法有一般的评价和加权平均,这个好理解。对于平均法来说一般用于回归预测模型中,在Boosting系列融合模型中,一般采用的是加权平均融合。

2,投票法:有绝对多数投票(得票超过一半),相对多数投票(得票最多),加权投票。这个也好理解,一般用于分类模型。在bagging模型中使用。

3,学习法:一种更为强大的结合策略是使用”学习法”,即通过另一个学习器来进行结合,把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器。常见的有Stacking和Blending两种 
(1)Stacking方法: Stacking 先从初始数据集训练出初级学习器,然后”生成”一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。 
stacking一般使用交叉验证的方式,初始训练集D 被随机划分为k 个大小相似的集合D1 , D2 , … , Dk,每次用k-1个部分训练T个模型,对另个一个部分产生T个预测值作为特征,遍历每一折后,也就得到了新的特征集合,标记还是源数据的标记,用新的特征集合训练一个集合模型。

这里写图片描述
(2)Blending方法: Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集,例如说10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。

五、多样性增强: 模型的多样性可以改善融合后的效果,增强的手段有:

  • 数据样本的扰动:bagging中提到的给定初始数据集, 可从中产生出不同的数据子集, 再利用不同的数据子集训练出不同的个体学习器。
  • 输入属性的扰动:随机深林提到的使用控制属性的子空间的不同,产生差异较大的模型。
  • 输出表示的扰动:输出表示进行操纵以增强多样性,可对训练样本的类标记稍作变动。
  • 算法参数的扰动:基学习算法一般都有参数需进行设置,例如神经网络的隐层神经元数、初始连接权值等,通过随机设置不同的参数,往往可产生差别较大的个体学习器。

六、bagging、boosting的对比: Bagging主要在优化variance(即模型的鲁棒性),boosting主要在优化bias(即模型的精确性) 
bagging: Bagging 是 Bootstrap Aggregating 的简称,意思就是再取样 (Bootstrap) 然后在每个样本上训练出来的模型取平均,所以是降低模型的 variance。 
由于E[\frac{\sum X_i}{n}]=E[X_i],所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。另一方面,若各子模型独立,则有Var(\frac{\sum X_i}{n})=\frac{Var(X_i)}{n},此时可以显著降低variance。 
Boosting: boosting从优化角度来看,是用forward-stagewise这种贪心法去最小化损失函数(指数函数),boosting是在sequential地最小化损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。

第五部分:数据增强

为什么需要数据增强 :

一般而言,比较成功的神经网络需要大量的参数,许许多多的神经网路的参数都是数以百万计,而使得这些参数可以正确工作则需要大量的数据进行训练,而实际情况中数据并没有我们想象中的那么多

数据增强的作用 :

  1. 增加训练的数据量,提高模型的泛化能力
  2. 增加噪声数据,提升模型的鲁棒性

如何获得大量的数据 :

一种方法是获得新的数据,这种方法比较麻烦,需要大量的成本,而第二种方法则是对数据进行增强,即利用已有的数据比如翻转、平移或旋转,创造出更多的数据,来使得神经网络具有更好的泛化效果。

数据增强的分类 :

数据增强可以分为两类,一类是离线增强,一类是在线增强。

  1. 离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候
  2. 在线增强 : 这种增强的方法用于,获得 batch 数据之后,然后对这个 batch 的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。

常用的数据增强技术 :

首先定义增强因子 : 指的是数据做离线增强之后增长的倍数。

  1. 翻转 :增强因子 2 或 3 
    数据翻转是一种常用的数据增强方法,这种方法不同于旋转 180 这种方法是做一种类似于镜面的翻折。 
    从左到右 :原图 水平翻转 垂直翻转

  2. 旋转 : 增强因子 2 到 4 
    旋转就是顺时针或者逆时针的旋转,注意在旋转的时候, 最好旋转 90 - 180 度否则会出现尺度的问题 
    这里写图片描述

  3. 缩放 :增强因子任意 
    图像可以被放大或缩小。放大时,放大后的图像尺寸会大于原始尺寸。大多数图像处理架构会按照原始尺寸对放大后的图像 进行裁切。我们将在下一章节讨论图像缩小,因为图像缩小会减小图像尺寸,这使我们不得不对图像边界之外的东西做出假设。下面是图像缩放的例子。 
    这里写图片描述

  4. 裁剪 :增强因子任意 
    这种方法更流行的叫法是随机裁剪,我们随机从图像中选择一部分,然后降这部分图像裁剪出来,然后调整为原图像的大小 
    这里写图片描述

  5. 平移 : 增强因子任意 
    平移是将图像沿着 x 或者 y 方向 (或者两个方向) 移动。我们在平移的时候需对背景进行假设,比如说假设为黑色等等,因为平移的时候有一部分图像是空的,由于图片中的物体可能出现在任意的位置,所以说平移增强方法十分有用。 
    这里写图片描述

  6. 添加噪声 :增强因子任意 看噪声的类型 
    过拟合通常发生在神经网络学习高频特征的时候 (因为低频特征神经网络很容易就可以学到,而高频特征只有在最后的时候才可以学到) 而这些特征对于神经网络所做的任务可能没有帮助,而且会对低频特征产生影响,为了消除高频特征我们随机加入噪声数据来消除这些特征。 
    这里写图片描述

图像增强的效果 :

图像增强非常必要,我也有过亲自的实验,特别是有些论文中,如果不进行图片增强,就无法达到论文中提到的效果,下面展现一下图片增强的效果示意图 : 
这里写图片描述

图中 :C10 和 C100 是没有经过图片增强的,C10+ 和 C100+ 是经过了图片增强的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高机器学习模型性能的五个关键方法 的相关文章

  • GT20L16S1Y字库IC驱动

    GT20L16S1Y字库IC驱动 file GT20L16S1Y c date 2020 7 7 author aron566 copyright None brief GD20L16S1Y字库驱动 details version V1 0

随机推荐

  • ctfshow--网络迷踪

    前言 记录一下做题过程 如有不当之处 还望指正 如有疑问 欢迎留言 目录 前言 1 新手上路 2 初学乍练 3 初学又练 4 初学再练 5 现拉现吃 6 初窥门径 7 狗哥去哪 8 国足加油 9 致我超吧 10 山外有山 11 密集恐惧 1
  • C++Primer第五版课后习题答案目录

    本帖用来记录我在看C Primer第五版时课后习题的代码以及书中一些问题的思考 仅供参考 水平有限 如有错误之处 请大家不吝指教 谢谢 目录 第一章 开始 第二章 变量和基本类型 第三章 字符串 向量和数组 第四章 表达式 第五章 语句
  • Linux 命令之 - scp(从远端机器拉取数据)

    scp是secure copy的简写 用于在Linux下进行远程拷贝文件的命令 和它类似的命令有cp 不过cp只是在本机进行拷贝不能跨服务器 而且scp传输是加密的 命令格式 scp 参数 原路径 目标路径 从本地服务器复制到远程服务器 需
  • 网易滑块验证

    之前在写瑞数专题一时就想发一篇关于网易滑块验证的案例 奈何现在的大佬好像比较喜欢瑞数 不管咋样 还是来水一篇网易滑块验证相关的文章 首先是获取图片的部分参数 fp cb callback这三个都是加密而来 图片验证这里的acToken可以不
  • 聊聊分布式任务调度系统

    我看过那么多所谓的教程 大部分都是教 如何使用工具 的 没有多少是教 如何制作工具 的 能教 如何仿制工具 的都已经是凤毛麟角 中国 软件行业 缺的是真正可以 制作工具 的程序员 而绝对不缺那些 使用工具 的程序员 这个业界最不需要的就是
  • 二、三层转发原理(多例详解,图文相结合说明ping过程)

    首先要了解 源主机在发起通信之前 会将自己的IP与目的主机的IP进行比较 如果两者位于同一网段 用网络掩码计算后具有相同的网络号 那么源主机发送arp请求广播报 请求目的主机的mac地址 在收到目的主机的ARP应答后获得对方的物理层 MAC
  • mysql 错误代码1171

    在创建主键id的时候没有取消上图的允许空值 导致报错1171 Error All part of primary key must be not null when installing flag module 转载于 https www
  • 一位股市天才的肺腑独白:一直只用MACD指标来炒股

    在股市投资中 MACD指标作为一种技术分析的手段 得到了投资者的认知 但如何使用MACD指标 才能使投资收益达到最佳境界 却是知者甚微 在股市操作中 MACD指标在保护投资者利益方面 远超过它发现投资机会的功效 如何巧用MACD指标 在股海
  • linux 重启服务器命令

    Linux有如下的关机和重启命令 shutdown reboot halt poweroff 那么它们有什么区别呢 shutdown 建议使用的命令 shutdown是最常用也是最安全的关机和重启命令 它会在关机之前调用fsck检查磁盘 其
  • 计算机系统基础摘记——程序的链接

    目录 1 初探链接 1 1 可执行文件的生成过程 1 2 链接器的由来 1 3 概述链接器的关键作用 1 4 链接带来的好处 2 目标文件 2 1 一些基本概念 2 2 可重定位文件 2 2 1 可重定位文件的格式 2 2 2 ELF头的格
  • 基础算法题——Harder Gcd Problem(数论、思维)

    题目 题目链接 给定一个 n 将 2 n 内的数进行一对一匹配 每个数仅能利用一次 假设 a 与 b 匹配 则 gcd a b 1 现求 2 n 内最大匹配数量 并输出匹配数对 输入 T代表输入组数 下面T行 每一行一个数字n 输出 输出最
  • 数据结构之邻接表及广度优先遍历

    一 邻接表的概念 邻接表是图的一种最主要存储结构 相当于图的压缩存储 用来描述图上的每一个点 图的邻接表存储方法跟树的孩子链表示法相类似 是一种顺序分配和链式分配相结合的存储结构 如这个表头结点所对应的顶点存在相邻顶点 则把相邻顶点依次存放
  • JavaWeb --- CSS

    一 CSS技术介绍 CSS是 层样式表单 是用于 增强 控制网页样式并允许将样式信息与网页内容分离的一种标记性语言 二 CSS语法规则 三 CSS和HTML结合方式 第一种 在标签的style属性上设置key value value 修改标
  • 简单易学的机器学习算法——SVD奇异值分解

    一 SVD奇异值分解的定义 假设是一个的矩阵 如果存在一个分解 其中为的酉矩阵 为的半正定对角矩阵 为的共轭转置矩阵 且为的酉矩阵 这样的分解称为的奇异值分解 对角线上的元素称为奇异值 称为左奇异矩阵 称为右奇异矩阵 二 SVD奇异值分解与
  • 【加载静态资源很慢】解决浏览器加载静态资源阻塞

    开门见山讲方法 增加浏览器的最大并发连接数 避免静态资源的加载请求排队而被其他请求阻塞 仅测试火狐浏览器可用 Chrome据我所知不支持此项配置 IE浏览器需要通过修改组策略 未测试 正文 存在问题 今天调试网页时 网页加载缓慢 一方面主要
  • es基本配置文件详解

    基本概念 近实时 Near Realtime NRT Elasticsearch是一个接近实时的搜索平台 这意味着从索引文档的时间到可搜索的时间之间存在轻微的延迟 通常为一秒 集群 Cluster 集群是一个或多个节点 服务器 的集合 它们
  • FPGA篇(十二)仿真中 `timesclae的用法

    timescale 1ns 1ps 小实验 timescale 1ns 1ps 前面是刻度 小数点之前 后面是精度 小数点之后 一旦超过了精度 就会四舍五入 modelSim仿真 仿真代码如下所示 timescale 1ns 1ps reg
  • 关于Failed to load plugin ‘vue‘ declared in ‘.eslintrc.js‘: createRequire is not a function报错处理

    今天从git上拉了项目代码 install之后就run dev准备跑项目 突然报错TypeError Failed to load plugin vue declared in eslintrc js createRequire is no
  • 免费HTTP代理怎么样

    现在是信息时代 很多互联网场景比如爬虫信息采集 电商效果补量 网上推广等等 都离不开HTTP代理IP 而很多人第一个想到的就是免费HTTP代理 什么是代理服务器 代理服务器是介于浏览器和Web服务器之间的一台服务器 当你通过代理服务器上网浏
  • 提高机器学习模型性能的五个关键方法

    如何提高机器学习模型性能 可从五个关键方面入手 1 数据预处理 2 特征工程 3 机器学习算法 4 模型集成与融合 5 数据增强 以下是各个方面的具体分析和方法 说明 1 这里主要是各个关键方法的知识汇总梳理 便于集中学习 具体的实际应用内