目录
1.决策树(随机森林)
2.线性和Softmax回归
3.SGD(不是算法模型,但很重要,单独列出来)
4.神经网络
4.1 多层感知机(线性回归升级版)
4.2卷积神经网络CNN(多层感知机升级)(解决包含空间信息的东西,图片、视频)
4.3循环神经网络RNN(多层感知机升级)(解决包含时序信息的东西,语言处理问题、文本问题)
4.4变形金刚Transformer(基于注意力机制)(既可以解决包含空间信息的东西,也可以解决包含时序信息的东西)
5.模型评估
5.1评估指标
5.2过拟合和欠拟合
5.3模型验证
6.集成学习
6.1偏差和方差
6.2bagging
6.3boosting
6.4stacking
6.5多层stacking
6.6总结
参考文献
1.决策树(随机森林)
可解决问题:分类,回归
应用:工业界应用最多,因为简单,没有太多参数需要调,而且一般来说结果不错,即使结果没有深度学习的结果好,但因为不需要调参,所以也不容易出错,还有一个优势在解决新问题时喜欢先用树模型,因为容易实现,而且只要能实现,说明该问题就可以用机器学习解决,这个时候树模型就进退有余,如果不想换模型,可以从数据入手,改善数据样本,如果想换模型可以尝试其他模型,如果都不想干,而树模型的精度尚可,就直接用就行了。
优点:可解释性
缺点:不稳定,容易受数据噪声影响
解决:
随机森林(升级):训练多个决策树,就成了森林,而每棵树随机产生,就成了随机森林,对于分类问题,假设一半以上的树认为结果是1,就输出1,对于回归问题就是每棵树取个平均值,缺点是,比如有十颗树,那么你的训练成本,相对一颗决策树,就是10倍,预测成本同理。
补充(随机森林):随机是因为所有的树是随机产生的,这样才能保证树群的稳定性 。
实现(随机森林bagging):比方说有[1 2 3 4 5]个数据样本,随机采样,假设第一次采样结果为[1 2 2 3 5],以次结果训练第一颗树,第二次采样结果为[ 1 1 2 2 3],以此结果训练第二课树,同理操作,最终训练出十颗树,组成一个随机森林,具体来说,就是在总样本不变的前提下,随机抽取不同的样本(有些样本会被重复抽到),来训练不同的树,在实现随机的同时,又保证所训练的树都是本土的,避免了外来户树的干扰。这是数据的随机采样,然后进行特征的随机采样,同样的采样道理,保证每棵树的特征有所区别。
实现(随机森林boosting,基于梯度):从实现过程理解,把每个树看成一个函数,(初始化)现在森林空无一树,那么输出就是0,真实值是a,这时残差数据就是a-0,根据残差数据训练出第一颗树(函数),这颗树输出是a1,这时残差数据就是a-a1,根据新的残差数据,训练第二颗树,那么输出就是a1+a2(boosting的输出是相加的,注意bagging输出是投票决定,或者取均值),这时残差数据就是a-a1-a2,根据新的数据再次训练出第三课树,直至整个森林的叠加输出值和真实值的误差为0或在可接受范围内终止训练。
2.线性和Softmax回归
原理:将输入进行线性加权得到输出(预测)
可解决问题(线性回归):分类,回归
损失函数(线性回归):均方差
可解决问题(Softmax回归):(多)分类,回归
损失函数(Softmax回归):交叉熵
实现:对每个类做一个预测,这个值在正负无穷之间,不好直观评价这个结果,通常人们喜欢用概率评价分类问题,所以用Softmax,可以这样理解(假设所有预测值为正),将所有类预测值加起来作为分母,单个类预测值作为分子,就得到了0-1的概率分布。
3.SGD(不是算法模型,但很重要,单独列出来)
应用:(随机)梯度下降,可以用来求解除了树模型以外所有学习模型。
解释:通常来讲,对于模型求解,就是对其目标函数求极大或者极小值问题,梯度下降法就是解决如何求极值问题(机器学习必备知识),随机梯度下降是解决如何更好的求极值问题。通过判断极值的改变,确定更新的权重系数是否合理。
实现: 从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了,这里的随机是指每次迭代过程中,样本都要被随机打乱。
区别(梯度下降法):对于权值的更新不再通过遍历全部的数据集,而是选择其中的一个样本即可。一般来说其步长的选择比梯度下降法的步长要小一点,因为梯度下降法使用的是准确梯度,所以它可以朝着全局最优解(当问题为凸问题时)较大幅度的迭代下去,但是随机梯度法不行,因为它使用的是 近似梯度,或者对于全局来说有时候它走的也许根本不是梯度下降的方向,故而它走的比较缓,同样这样带来的好处就是相比于梯度下降法,它不是那么容易陷入到局部最优解中去。
常用:SGD、Batch-SGD、Mini-Batch SGD
4.神经网络
神经网络分类(简述):多层感知机,卷积神经网络(图片处理),循环神经网络(语音,问本),变形金刚(基于注意力机制)。
4.1 多层感知机(线性回归升级版)
单层感知机解释:由全连接层组成,而全连接层可以用线性回归公式y=wx+b表示,就是x个输入分别乘以w最后加上b得到 一个输出。
多层感知机解释:单层感知机本质上是解决线性问题,而如果单纯将多个单层感知机叠加,解决的还是线性问题。所以需要引入非线性概念,加入了激活函数,常用的是sigmoid,Relu函数,这两个是非线性函数,线性函数和非线性函数结合得到的是非线性函数(这句话不确定对不对哈,好像高中的时候讲过)。
神经网络应用概念解释:神经网络用于分类问题时的特点,其他模型需要人工利用先验知识进行特征提取(通常是进行语义分割,用一些特征工程方法标定一些特征),神经网络 可以自己学习进行特征提取,神经网络提取的特征,一般会更有利于像线性回归,Softmax回归方法解决分类问题。缺点是,因为没有先验知识,相对于人工提取特征方法,神经网络需要花费大量时间进行训练。
4.2卷积神经网络CNN(多层感知机升级)(解决包含空间信息的东西,图片、视频)
解释:举个例子对一个300×300的图片,只用一个隐藏层提取特征,假设隐藏层有10000个神经元,输出为1000个类,因为是全连接层,那么训练权重高达90000×10000,这个训练量十分可怕,而且会带来数据存储等一系列问题,而卷积神经网络,使用一些卷积核的概念,卷积核一般为1×1,3×3大小,这个时候 权重的多少却决于卷积核的大小,用卷积核进行特征提取大大减少了所要训练的参数。
注意:卷积神经网络用卷积层提取特征,可以看作是一个特殊的全连接层,但它也属于线性概念,所以也要加入激活函数。
4.3循环神经网络RNN(多层感知机升级)(解决包含时序信息的东西,语言处理问题、文本问题)
应用:预测下一个单词,比方说,有一个hello,预测下一个单词是world,有了hello world预测下一个字符是感叹号。
解释:从时序上把过去的信息用一个全连接层加到现在,等于在网络上加了一个边,形成了一个循环。
4.4变形金刚(基于注意力机制)(既可以解决包含空间信息的东西,也可以解决包含时序信息的东西)
定义:神经网络中的注意力机制(Attention Mechanism)是在计算能力有限的情况下,将计算资源分配给更重要的任务,同时解决信息超载问题的一种资源分配方案。
补充:在神经网络学习中,一般而言模型的参数越多则模型的表达能力越强,模型所存储的信息量也越大,但这会带来信息过载的问题。那么通过引入注意力机制,在众多的输入信息中聚焦于对当前任务更为关键的信息,降低对其他信息的关注度,甚至过滤掉无关信息,就可以解决信息过载问题,并提高任务处理的效率和准确性。
解释:这就类似于人类的视觉注意力机制,通过扫描全局图像,获取需要重点关注的目标区域,而后对这一区域投入更多的注意力资源,获取更多与目标有关的细节信息,而忽视其他无关信息。通过这种机制可以利用有限的注意力资源从大量信息中快速筛选出高价值的信息。
transformer(变形金刚):Transformer是一个利用注意力机制来提高模型训练速度的模型。trasnformer可以说是完全基于自注意力机制的一个深度学习模型,因为它适用于并行化计算,和它本身模型的复杂程度导致它在精度和性能上都要高于之前流行的RNN循环神经网络。
5.模型评估
5.1评估指标
评估指标(语义分割):PA(像素准确率),CPA(类别像素准确率),mPA(类别平均像素准确率),IOU(交并比),MIOU(平均交并比)
评估指标(目标检测):mPA
含义:分别计算每个类被正确分类像素数的比例,即:CPA,然后累加求平均
混淆矩阵计算:每个类别像素准确率为:
Pi(计算:对角线值 / 对应列的像素总数)
MPA = sum(Pi) / 类别数
评估指标1(分类):Accuracy(准确率),Precision(精确率),Recall(召回率),Balance precision and recall (调和平均率)
评估指标2(分类):
ROC:既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。在面对正负样本数量不均衡的场景下,相对于调和平均率,ROC曲线(AUC的值)会是一个更加稳定能反映模型好坏的指标。
AUC:被定义为ROC曲线下的面积,取值范围一般在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果好。
结合下图简单解释ROC和AUC:TN是负类,TP是正类,右侧的曲线就是ROC曲线,AUC取值范围为0-1。
①当AUC=1时,ROC曲线如图右侧所示,表示的含义如图左侧所示,一根灰色直线可以完美把正类和父类区分开。
②当AUC=0.7时,正类和负类有一部分交叉,这部分叫做假正类(负类结果被预测为正),假负类(正类结果被预测为负),说明存在一定误差。
③当AUC=0.5时,效果最差,正类和负类完全耦合,说明模型完全没有能力区分正类和负类。
④当AUC=0时,这是一个很有意思的区分,正类和负类完全区分饭,把所有正类预测成负类,把所有负类预测成正类,也说明模型完全有能力区分正类和负类,最后求结果的时候载求个反就能用了。
图片来自李沐大神的视频
5.2过拟合和欠拟合
训练误差:在训练集上的犯错率
测试误差:在测试集上的犯错率
泛化误差:在应用中(模型没见过的数据上)的犯错率
复杂模型:(也可以用能拟合多少函数评价)
①.可学习的参数或者层数更多。
②.可学习参数的取值范围为更大,比方说正负无穷比-10-10的取值范围更大。
复杂数据集:
①样本更多,每个样本里面的元素更多,比方说1000×1000的图片,比20×20的图片要更为复杂。
②包含在数据里面的结构也能评判数据集复杂程度,比方说图面里面包含的空间结构信息,股票里面包含的时序信息的复杂程度。
③样本种类的多样性也可以评判数据集的复杂程度,比方说要分类1000种动物,会比10种动物更为复杂。
过拟合:
是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下模型可能只是记住了训练集数据,而不是学习到了数据特征。
解释:正则化就是通过减少模型复杂程度来解决过拟合问题
方法(正则化,模型):神经网络可以通过减少网络层数、神经元个数(如Dropout、BN、池化等),决策树可以通过剪枝、降低深度、减少节点数等。
补充:另外也可以采取集成学习方法(比如Bagging、Boosting、Stacking三大类集成学习方法),把多个模型集成在一起来降低单一模型过拟合的风险。
方法(改善数据):
①可以获取更多的训练数据来训练模型,因为更多的样本会让模型学到更全面更有效的特征,从而减少噪声的影响,可以说这是缓解模型过拟合最有效的方法。
②如果很难再获取到更多训练数据,那么可以对已有训练数据进行合理扩充,增加数据的多样性,比如图像数据可以通过图像平移、旋转、缩放、裁剪等手段进行扩充。
方法(添加正则项):在损失函数之后附加上正则项,通常使用的正则项有两种:L1正则化和L2正则化。
欠拟合:
模型描述能力太弱,以至于不能很好地学习到数据中的规律。产生欠拟合的原因通常是模型过于简单。
方法(数据):可以通过特征工程,例如上下文特征、组合特征等,因为造成欠拟合的因素主要是特征不足或者特征与目标的相关性不强;
方法(模型):增加模型的复杂度来增加模型的拟合能力,例如增加神经元、网络层数、高阶项等;
方法(减少正则项):正则项是为了防止过拟合的,当出现欠拟合现象时,可以减少正则化系数。
用下图简述为什么会出现过拟合和欠拟合:Data complexity为数据复杂度,Model complexity为模型复杂度:
①.如果Dara complexity为High,Model complexity为Low,就是数据集过于复杂,模型过于简单,就会出现图右侧Underfitting的现象,一条直线拟合一些看着像曲线的数据点,显然是不能拟合的。
②.如果Dara complexity为Low,Model complexity为High,就是数据集过于简单,模型过于复杂,就会出现图右侧Overfitting的现象,对于这些看着像曲线的数据点,想用一个简单的光滑曲线拟合,结果把每个点都拟合了,显然不是我们想要的结果。
图片来自李沐大佬的视频,图截的不太美丽,抱歉抱歉
用下图简述为什么要用神经网络模型:
名词解释:Data capacity是数据容量,Generalization error是泛化误差,Simple model是简单模型,Complex model是复杂模型
详解:从图中我们可以看出,在数据集小的时侯,简单模型的效果会比复杂模型好,但随着数据集的增加,复杂模型的效果逐渐超过简单模型,简单定义一下,复杂模型就是神经网络,简单模型就是神经网络以外的机器学习模型,举个例子,在做图像分类时,10w的数据集,SVM比神经网路效果好,100w的数据集,神经网络比SVM效果好。最后也要注意到当数据达到一定量级,继续增加模型复杂程度也不会再有优化的迹象。
图片来自李沐大佬的视频,特意截了一张大佬精神饱满的照片
总结:模型的选择要和数据的大小相匹配,才能得到最好的结果。
模型选择:先选择模型类别,比方说决策树或者神经网络,再选择合适的超参数,比方说决策树,选多少颗树,每棵树多高(多少层),对于神经网络,选择什么架构,多少层,要不要加一些正则项,限制可学习参数的范围。
5.3模型验证
定义:模型验证就是选择合适的方法找到验证集,利用模型评估的方法,计算模型的泛化误差
方法1:Sequential按照顺序将数据集分为训练集和验证集,Random随机将数据集分为训练集和验证集。
用下图简述两种方法:
假设:以下数据集是卖房的数据信息,Sequential就是按照时间顺序将数据集一半分为训练集,一半分为验证集,Random就是随机将数据集一半分为训练集,一半分为验证集。
图片解释:下图黄色为验证集,蓝色为训练集,假设训练模型是决策树,下图意思是,图左侧用Sequential对数据集分类(比方说,6个月的数据,前3个月是训练集,后3个月是验证集),当森林里有6棵树时,训练集泛化误差最好。图右侧用Random对数据集分类(从6个月数据中随机抽数组成训练集和验证集),当森林有13棵树时,训练集泛化误差最好。如果用神经网络举例,6和13代表的就是层数。
结论:从图右侧可以看出,用Random得到的数据训练集和验证集得到的误差都合理,而Sequential得到的数据,验证集的误差离谱,那么实际应用时可能也会很离谱,原因可能在于前3个月的数据和后3个月数据差异较大,比方说今年韩国放假大跌,用跌之前的数据训练,跌之后的数据验证,那不是很离谱。
图片依然来自李沐大佬的视频,薅的有点狠了,哈哈
方法2:k折交叉验证(适合数据量不大的情况)
用下图简述该方法:如图右侧所示,数据分为三块,每一块分别在每一折里做验证集,所有折验证误差的平均值。k取3意味着,每次验证集数据大概为33%,一般取5(20%)或10(10%)。
继续薅图...
常见错误:大部分时候模型训练结果好,可能是因为训练集和验证集有重叠导致的。导致这种情况的原因,不一定是你的代码写错了,因为有时候数据在原始数据里面会重复存在,在随机分往训练集和验证集的时候,同样的数据会出现在两个数据集中。另一个原因是数据融合,大家喜欢将训练的模型在Image Net上进行验证,但存在一个问题,Image Net上的很多数据,可能和你自己做训练集里的数据有重复,所以严格意义上难以得到一个公正的结果。
6.集成学习
6.1偏差和方差
用下图简述二者概念:bias为偏差,variance为方差,+号表示最优解,黄圈表示可接受解的范围。
①左侧第一副图,是低偏差所以五个解都在可接受范围内,低方差所以五个解距离都比较近。
②左侧第二幅图,是高偏差所以五个解都偏离可接受范围,低方差,即使五个解偏离可接受范围,但依然距离很近。
③左侧第三幅图,低偏差,高方差,所以五个解虽然基本在可接受范围内,但分布很散。
④左侧第四副图,高偏差,高方差,五个解基本不在可接受范围内,分布的也很散。
泛化误差:可以理解为偏差,方差和噪声的和。
还在薅图...
用下图理解模型复杂程度对偏差和方差的影响:从下图左侧开始模型比较简单时,是欠拟合状态,偏差较大不能很好的找到最优解,随着模型复杂程度的上升,偏差开始减小,但同时方差开始增大,从上图左侧第二幅图理解,说明五个解正在向最优解靠近,但同时他们直接的距离开始变大,到最后变成上图左侧第三幅图的状态,虽然接近了最优解,但解之间距离很远,而我们想要的是下图中蓝色的点(蓝线表示泛化误差),这个点可以对应上图左侧第一幅图,低偏差,低方差,是我们想要的最优解。再看一下右侧小图,随着模型的复杂程度上升,训练误差减小,泛化误差增大,这是因为训练误差更多的和偏差相关,偏差越小,模型越能和数据拟合(方差是数据的噪声引起的,模型越复杂,噪声引起的问题越大),所以随着模型复杂程度上升,训练误差减小,但泛化误差更多受到方差影响,所以泛化误差在增大,两者在最右侧的差距,也更多受到方差的影响。
薅图中...
分析1(模型):偏差大,说明模型复杂程度不够。
解决:
①可以增加层数或者神经元。
②boosting,stacking
分析2(模型):方差大,说明模型过于复杂(放大了噪声)。
解决:
①简化模型,或者L1,L2正则化限制模型参数学习范围。
②bagging,stacking
分析3(数据):通过改善数据,减少噪声,说明了数据的重要性。
承上启下总结句:针对偏差和方差问题,用集成学习解决。
6.2bagging
作用:降低方差,因为bagging是取均值作为输出,所以对方差影响大。
注意:bagging方法喜欢使用不稳定的基学习器,比方说,决策树,这样对方差的影响更大。像线性回归比较稳定不适合做基学习器。
解释:随机森林就是这种方式,对于回归问题,训练多个树取均值作为输出,对于分类问题,训练多个树投票输出分类结果。
实现:表现在用bootstrap采样(也叫随机重复采样),比方说有m=5个样本[ 1 2 3 4 5],第一次采样m=5个样本[1 2 2 3 5],训练一个base learner(基学习器),第二次采样m=5样本[1 3 4 1 1],训练第二个base learner,以此类推训练多个base learner,每次测样得到的总样本大概有27%是重复的,所以原始数据有27%没有被采样,可以作为训练集。
用下图简述bagging:下图是一个随机森林的例子,从下图可以看出,森林中树越多,训练误差和验证误差都在减小,有趣的是,不管你训练多少棵树,误差不会上升,可以理解为因为方差对泛化误差影响最大,而bagging作用是是为了减小方差。
薅薅薅...
6.3boosting
作用:降低偏差,将多个偏差大的模型组合在一起,变成偏差比较小的模型。
区别(bagging):bagging各个基学习器是独立训练,boosting各个基学习器是按照顺序训练,简单说就是先训练一个简单模型,再用一个模型关注前一个模型训练错的数据,以此递推。
Gradient Boosting:就是根据前面的模型预测值和实际值的误差得到残差数据,然后基于残差数据继续训练基学习器,直到残差为0或者在可接受范围内,停止继续训练基学习器。可以理解为等价于梯度下降。
Gradient Boosting Decision Tree:选择决策树作为弱(基)学习器(决策树并不是一个弱模型,但可以减少树的数量弱化模型,将其变为弱模型,而强模型因为拟合效果号,容易出现过拟合,所以不用)。
用下图简述bagging和boosting:下图左侧为boosting的结果,用较少的树(四五个,弱模型)得到的结果,图右侧是bagging的结果,正常使用树的数量(可能十几棵)得到的结果,从最终结果看,在训练集得到的误差结果相差不大,训练集上的表现bagging会更好。但在训练上,bagging可以并行训练,而boosting需要按顺序一棵一棵训练数据集比较大时比较吃亏,一些改进boosting就是在提高训练速度上入手。
薅麻了...
6.4stacking
作用:和bagging一样也是为了降低方差(竞赛常用方法,每个人做一个不同模型,最后搞在一起,容易得到好的名次)
区别(bagging):
①bagging只能用同类模型作为基学习器,比方说选了决策树,就不能再用MLP。而stacking则可以选用不同模型作为基学习器,比方说同时选用决策树和MLP以及其他任何模型。
②不需要用bootstrap采样,因为每种模型训练方法不同。
③从输出上讲bagging是选择投票或者取均值,stacking在回归上是让每个学习器输出一个标量,组合成一个向量,再做一个线性组合(全连接层)作为输出。
6.5多层stacking
定义:多个stacking叠加,每一层的基学习器可以一样,也可以不一样,但一般为了方便,都设置一样
作用:解决偏差和方差问题
缺点:容易过拟合
解决:比方说,两层stacking,将数据集分为a,b两块,将第一层训练的模型对b做预测,将预测的结果加到b身上,再对第二层做训练。
解决(进阶):在上个解决办法基础上,在第一层引入k折交叉和概念,训练k个模型,每个模型会流出一个验证集,再用相应模型对验证集预测的结果加上验证集,构成k个验证集,重新组合成一个训练集,供下一层训练,要注意本身第一层已经有n个模型,再用k折交叉法,每个样本上再训练出一个模型,总共有n×k个小模型。
6.6总结
总结:四种方法效果如下图,Bias和Variance写反了。最后的n×l×k代表,n个模型,l层,k折。