支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
在实际应用中,需要归一化的模型:
1.基于距离计算的模型:KNN SVM。
2.通过梯度下降法求解的模型:线性回归、逻辑回归、支持向量机、神经网络。
但树形模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、随机森林(Random Forest)。
因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。
按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。而且,树模型是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化。
归一化的方法有哪些?为啥要对数值特征做归一化?
归一化的方法主要有(1)Min-Max归一化将结果映射到[0,1],进行等比缩放
标准化
(2)零均值归一化将数据映射到均值为0标准差为1的分布上
通过归一化,梯度下降能够更快的找到最优解。常见的需要归一化的模型有(线性回归、逻辑回归、支持向量机、神经网络等),决策树不需要,以c4.5为例,节点分裂主要依靠特征的信息增益比,与是否归一化无关。
什么时候用归一化?什么时候用标准化?
(1)如果对输出结果范围有要求,用归一化。
(2)如果数据较为稳定,不存在极端的最大最小值,用归一化。
(3)如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。
1 抽象成数学问题
明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。
这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。
2 获取数据
数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。
数据要有代表性,否则必然会过拟合。
而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。
3 特征预处理与特征选择
良好的数据要能够提取出良好的特征才能真正发挥效力。
特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。
筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。
4 训练模型与调优
直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。
5 模型诊断
如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。
过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。
误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……
诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。
6 模型融合
一般来说,模型融合后都能使得效果有一定提升。而且效果很好。
工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。
7 上线运行
这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。
这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。
增加数据,图像平移、旋转、缩放,生成式对抗网络,和成训练数据。
降低模型复杂度,神经网络中减少网络层数、神经元个数,树模型中降低树深度、进行剪枝 Early Stoping Drop OUT
正则化 L1、L2
集成学习 Bagging降低对某一单模型依赖
——————————————————
增加新特征,组合特征,因子分解机等
增加模型复杂度
减小正则化系数
经常在机器学习中的优化问题中看到一个算法,即梯度下降法,那到底什么是梯度下降法呢?
维基百科给出的定义是梯度下降法(Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程则被称为梯度上升法。
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
判别方法:由数据直接学习决策函数 Y = f(X),或者由条件分布概率 P(Y|X)作为预测模型,即判别模型。
生成方法:由数据学习联合概率密度分布函数 P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型。
过拟合的原因是算法的学习能力过强;一些假设条件(如样本独立同分布)可能是不成立的;训练样本过少不能对整个空间进行分布估计。
处理方法:
1 早停止:如在训练中多次迭代后发现模型性能没有显著提高就停止训练
2 数据集扩增:原有数据增加、原有数据加随机噪声、重采样
3 正则化,正则化可以限制模型的复杂度
4 交叉验证
5 特征选择/特征降维
6 创建一个验证集是最基本的防止过拟合的方法。我们最终训练得到的模型目标是要在验证集上面有好的表现,而不训练集。
随机森林是由很多个决策树组成的,首先要建立Bootstrap数据集,即从原始的数据中有放回地随机选取一些,作为新的数据集,新数据集中会存在重复的数据,然后对每个数据集构造一个决策树,但是不是直接用所有的特征来建造决策树,而是对于每一步,都从中随机的选择一些特征,来构造决策树,这样我们就构建了多个决策树,组成随机森林,把数据输入各个决策树中,看一看每个决策树的判断结果,统计一下所有决策树的预测结果,Bagging整合结果,得到最终输出。
randomForest包里,有两种补全缺失值的方法。
方法一(na.roughfix)简单粗暴,对于训练集,同一个class下的数据,如果是分类变量缺失,用众数补上,如果是连续型变量缺失,用中位数补。
方法二(rfImpute)根据随机森林创建和训练的特点,随机森林对缺失值的处理还是比较特殊的。
首先,给缺失值预设一些估计值,比如数值型特征,选择其余数据的中位数或众数作为当前的估计值,然后,根据估计的数值,建立随机森林,把所有的数据放进随机森林里面跑一遍。记录每一组数据在决策树中一步一步分类的路径,然后来判断哪组数据和缺失数据路径最相似,引入一个相似度矩阵,来记录数据之间的相似度,比如有N组数据,相似度矩阵大小就是N*N,如果缺失值是类别变量,通过权重投票得到新估计值,如果是数值型变量,通过加权平均得到新的估计值,如此迭代,直到得到稳定的估计值。
衡量变量重要性的方法有两种,Decrease GINI 和 Decrease Accuracy:
对于分类问题(将某个样本划分到某一类),也就是离散变量问题,CART使用Gini值作为评判标准。定义为Gini=1-∑(P(i)*P(i)),P(i)为当前节点上数据集中第i类样本的比例。例如:分为2类,当前节点上有100个样本,属于第一类的样本有70个,属于第二类的样本有30个,则Gini=1-0.7×07-0.3×03=0.42,可以看出,类别分布越平均,Gini值越大,类分布越不均匀,Gini值越小。在寻找最佳的分类特征和阈值时,评判标准为:argmax(Gini-GiniLeft-GiniRight),即寻找最佳的特征f和阈值th,使得当前节点的Gini值减去左子节点的Gini和右子节点的Gini值最大。
对于回归问题,相对更加简单,直接使用argmax(Var-VarLeft-VarRight)作为评判标准,即当前节点训练集的方差Var减去减去左子节点的方差VarLeft和右子节点的方差VarRight值最大。
对于一棵树Tb(x),我们用OOB样本可以得到测试误差1;然后随机改变OOB样本的第j列:保持其他列不变,对第j列进行随机的上下置换,得到误差2。至此,我们可以用误差1-误差2来刻画变量j的重要性。基本思想就是,如果一个变量j足够重要,那么改变它会极大的增加测试误差;反之,如果改变它测试误差没有增大,则说明该变量不是那么的重要。
解析一
k-means:在大数据的条件下,会耗费大量的时间和内存。
优化k-means的建议:
1、减少聚类的数目K。因为,每个样本都要跟类中心计算距离。
2、减少样本的特征维度。比如说,通过PCA等进行降维。
3、考察其他的聚类算法,通过选取toy数据,去测试不同聚类算法的性能。
4、hadoop集群,K-means算法是很容易进行并行计算的。
任取一对(正,负)样本,正样本score 大于负样本score 的概率
这主要是由于数据分布不平衡造成的。解决方法如下:
线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分。
从每个batch的数据来区分
梯度下降:每次使用全部数据集进行训练
优点:得到的是最优解
缺点:运行速度慢,内存可能不够
随机梯度下降:每次使用一个数据进行训练
优点:训练速度快,无内存问题
缺点:容易震荡,可能达不到最优解
Mini-batch梯度下降
优点:训练速度快,无内存问题,震荡较少
缺点:可能达不到最优解
解析:
1)相同点:都是由多棵树组成,最终的结果都是由多棵树一起决定。
2)不同点:
a 组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成;
b 组成随机森林的树可以并行生成,而GBDT是串行生成
c 随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和
d 随机森林对异常值不敏感,而GBDT对异常值比较敏感
e 随机森林是减少模型的方差,而GBDT是减少模型的偏差
f GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树)
(1) Bagging之随机森林
随机森林改变了决策树容易过拟合的问题,这主要是由两个操作所优化的:
1)Boostrap从袋内有放回的抽取样本值
2)每次随机抽取一定数量的特征(通常为sqr(n))。
分类问题:采用Bagging投票的方式选择类别频次最高的
回归问题:直接取每颗树结果的平均值。
(2)Boosting之AdaBoost
Boosting的本质实际上是一个加法模型,通过改变训练样本权重学习多个分类器并进行一些线性组合。而Adaboost就是加法模型+指数损失函数+前项分布算法。Adaboost就是从弱分类器出发反复训练,在其中不断调整数据权重或者是概率分布,同时提高前一轮被弱分类器误分的样本的权值。最后用分类器进行投票表决(但是分类器的重要性不同)。
(3)Boosting之GBDT
将基分类器变成二叉树。和上面的Adaboost相比,回归树的损失函数为平方损失,同样可以用指数损失函数定义分类问题。但是对于一般损失函数怎么计算呢?GBDT(梯度提升决策树)是为了解决一般损失函数的优化问题,方法是用损失函数的负梯度在当前模型的值来模拟回归问题中残差的近似值。
注:由于GBDT很容易出现过拟合的问题,所以推荐的GBDT深度不要超过6,而随机森林可以在15以上。
(4)Boosting之Xgboost
这个工具主要有以下几个特点:
支持线性分类器
可以自定义损失函数,并且可以用二阶偏导
加入了正则化项:叶节点数、每个叶节点输出score的L2-norm
支持特征抽样
在一定情况下支持并行,只有在建树的阶段才会用到,每个节点可以并行的寻找分裂特征。
解析:
一方面,缺失值较多.直接将该特征舍弃掉,否则可能反倒会带入较大的noise,对结果造成不良影响。
另一方面缺失值较少,其余的特征缺失值都在10%以内,我们可以采取很多的方式来处理:
基于划分的聚类:K-means,k-medoids,CLARANS。
基于层次的聚类:AGNES(自底向上),DIANA(自上向下),BIRCH(CF-Tree),。
基于密度的聚类:DBSACN,OPTICS,CURE。
基于网格的方法:STING,WaveCluster。
基于模型的聚类:EM,SOM,COBWEB。
泛化误差可以分解成偏差的平方加上方差加上噪声。偏差度量了学习算法的期望预测和真实结果的偏离程度,刻画了学习算法本身的拟合能力,方差度量了同样大小的训练集的变动所导致的学习性能的变化,刻画了数据扰动所造成的影响,噪声表达了当前任务上任何学习算法所能达到的期望泛化误差下界,刻画了问题本身的难度。偏差和方差一般称为bias和variance,一般训练程度越强,偏差越小,方差越大,泛化误差一般在中间有一个最小值,如果偏差较大,方差较小,此时一般称为欠拟合,而偏差较小,方差较大称为过拟合。
High bias解决方案:Boosting、复杂模型(非线性模型、增加神经网络中的层)、更多特征
High Variance解决方案:bagging、简化模型、降维
具体而言:
高偏差, 可以用boosting模型, 对预测残差进行优化, 直接降低了偏差. 也可以用高模型容量的复杂模型(比如非线性模型, 深度神经网络), 更多的特征, 来增加对样本的拟合度.
高方差, 一般使用平均值法, 比如bagging, 或者模型简化/降维方法, 来降低方差。
bagging方法中Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中,当然也就没有参加决策树的建立,把这1/3的数据称为袋外数据oob(out of bag),它可以用于取代测试集误差估计方法。
3.为了降低维度,我们可以把数值变量和分类变量分开,同时删掉相关联的变量。对于数值变量,我们将使用相关性分析。对于分类变量,我们可以用卡方检验。
4.另外,我们还可以使用PCA(主成分分析),并挑选可以解释在数据集中有最大偏差的成分。
2.我们可以随机采样数据集。这意味着,我们可以创建一个较小的数据集,比如有1000个变量和30万行,然后做计算。
这主要是由于数据分布不平衡造成的。解决方法如下:
Bagging 此外还可以使用正则化技术,降低模型的复杂度
要检查多重共线性,我们可以创建一个相关矩阵,用以识别和除去那些具有75%以上相关性(决定阈值是主观的)的变量。此外,我们可以计算VIF(方差膨胀因子)来检查多重共线性的存在。
VIF值<= 4表明没有多重共线性,而值> = 10意味着严重的多重共线性。
● Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。Chi-squared test(卡方检验)Information gain(信息增益)Correlation coefficient scores(相关系数)方差 互信息 等等
● Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
● Embedded:(1)主要思想是:在模型既定的情况下学习出对提高模型准确性最好的特征。也就是在确定模型的过程中,挑选出那些对模型的训练有重要意义的特征。
(2)简单易学的机器学习算法–岭回归(Ridge Regression),就是线性回归过程加入了L2正则项。
(3)基于树的特征选择
1.把缺失值分成单独的一类,这些缺失值说不定会包含一些趋势信息。
2.我们可以毫无顾忌地删除它们。
3.可能值插补缺失值
欠拟合(underfiting / high bias)
训练误差和验证误差都很大,这种情况称为欠拟合。出现欠拟合的原因是模型尚未学习到数据的真实结构。因此,模拟在训练集和验证集上的性能都很差。
解决办法
1 做特征工程,添加跟多的特征项。如果欠拟合是由于特征项不够,没有足够的信息支持模型做判断。
2 增加模型复杂度。如果模型太简单,不能够应对复杂的任务。可以使用更复杂的模型,减小正则化系数。比如说可以使用SVM的核函数,增加了模型复杂度,把低维不可分的数据映射到高维空间,就可以线性可分,减小欠拟合。还可以使用一些集成学习方法。
3 集成学习方法boosting(如GBDT)能有效解决high bias
过拟合(overfiting / high variance)
模型在训练集上表现很好,但是在验证集上却不能保持准确,也就是模型泛化能力很差。这种情况很可能是模型过拟合。
造成原因主要有以下几种:
1 训练数据集样本单一,样本不足。如果训练样本只有负样本,然后那生成的模型去预测正样本,这肯定预测不准。所以训练样本要尽可能的全面,覆盖所有的数据类型。
2 训练数据中噪声干扰过大。噪声指训练数据中的干扰数据。过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系。
3 模型过于复杂。模型太复杂,已经能够死记硬背记录下了训练数据的信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的模型都有稳定的输出。模型太复杂是过拟合的重要因素。
针对过拟合的上述原因,对应的预防和解决办法如下:
1 在训练和建立模型的时候,从相对简单的模型开始,不要一开始就把特征做的非常多,模型参数跳的非常复杂。
2 增加样本,要覆盖全部的数据类型。数据经过清洗之后再进行模型训练,防止噪声数据干扰模型。
3 正则化。在模型算法中添加惩罚函数来防止过拟合。常见的有L1,L2正则化。
4 集成学习方法bagging(如随机森林)能有效防止过拟合
5 减少特征个数(不是太推荐)
注意:降维不推荐用来解决过拟合。具体原因可以看:https://www.zhihu.com/question/47121788
XGBOOST
https://www.julyedu.com/question/big/kp_id/23/ques_id/2590
简单介绍SVM(详细原理):从分类平面,到求两类间的最大间隔,到转化为求间隔分之一,等优化问题,然后就是优化问题的解决办法,首先是用拉格拉日乘子把约束优化转化为无约束优化,对各个变量求导令其为零,得到的式子带入拉格朗日式子从而转化为对偶问题, 最后再利用SMO(序列最小优化)来解决这个对偶问题。
首先由平面点到距离公式推广到N维空间, 点到面的距离大于等于d则求到约束条件。由点到支撑向量的距离|WTXi+b|/|w|= d最大化此间隔, 且|WTxi+b|是一个常数,那么原始可以化为min0.5||w||的平方,且带约束条件,进而转化为用朗格朗日不等式解决。转化为拉格朗日不等式后仍然不好求,原因是minwbmaxa 先对a求导再转而求wb下的拉氏函数最小。不好求,转化为对偶问题。先对wb求导,带入原式并加入约束。转化为求a的最小。进而用SMO来求解这个问题。
C的作用?
这里的参数C代表的是在线性不可分的情况下,对分类错误的惩罚程度。
C值越大,分类器就越不愿意允许分类错误(“离群点”)。如果C值太大,分类器就会竭尽全力地在训练数据上少犯错误,而实际上这是不可能/没有意义的,于是就造成过拟合。
而C值过小时,分类器就会过于“不在乎”分类错误,于是分类性能就会较差。
什么是支持向量?
支撑向量本bai质是向量,而du这些向量却起着很zhi重要的作dao用,如果做分类,他们就是离分界线最近的向量。也就是说分界面是靠这些向量确定的,他们支撑着分类面。名字就是这么来的
什么是核函数?
核函数的作用就是隐含着一个从低维空间到高维空间的映射,而这个映射可以把低维空间中线性不可分的两类点变成线性可分的 ,核函数只是用来计算映射到高维空间之后的内积的一种简便方法
如何选择核函数?
* 线性核函数,经过线性核函数转换的样本,特征空间与 输入空间重合,相当于并没有将样本映射到更高维度的空间里去,这是最简单的核函数,实际训练、使用 SVM 的时候,在不知道用什么核的情况下,可以先 试试线性核的效果。
* 多项式核函数,这是一个不平稳的核,适用于数据做了归一化的情况,3个参数
* RBF 核又名高斯核 (Gaussian Kernel),是一个核函数家族。它会将输入空间的样本以非线性的 方式映射到更高维度的空间(特征空间)里去,因此它可以处理类标签和样本属性之间是非线性关 系的状况。不过相对于多项式核的3个参数,RBF 核只有一个参数需要调,还是相对简单的。 当线性核效果不是很好时,可以用 RBF 试试。或者,很多情况下可以直接使用 RBF。 在具体应用核函数时,最好针对具体问题参照前人的经验
为什么要引入拉格朗日乘子法?
决绝带约束的优化问题转化为无优化问题
SVM 损失函数解释?
SVM与LR最大区别?
(1)损失函数不同,LR回归是对数损失,SVM是hinge损失。(2)SVM只考虑支持向量,LR考虑全局变量
为什么要把原问题转换为对偶问题?
因为原问题是凸二次规划问题,转换为对偶问题更加高效。为什么求解对偶问题更加高效?因为只用求解alpha系数,而alpha系数只有支持向量才非0,其他全部为0 . alpha系数有多少个?样本点的个数
如何解决多分类问题?项目中采用LinearSVC的one VS rest,采用CalibratedClassifierCV进行概率校准,当概率小于0.35的时候判定为其他类
SVM 优缺点?
优点:
1、可以有效解决高维特征的分类和回归问题
2、无需依赖全体样本,只依赖支持向量
3、有大量的核技巧可以使用,从而可以应对线性不可分
4、样本量中等偏小照样有较好的效果
缺点:
1、如果特征维度远大于样本个数,SVM表现一般
2、SVM在样本巨大且使用核函数时计算量很大
3、非线性数据的核函数选择依旧没有标准
4、SVM对缺失数据敏感
5、特征的多样性导致很少使用svm,因为 svm 本质上是属于一个几何模型,这个模型需要去定义 instance 之间的 kernel 或者 similarity(线性svm中的内积),而我们无法预先设定一个很好的similarity。这样的数学模型使得 svm 更适合去处理 “同性质”的特征
LR可以用核么?可以怎么用?加哪个可以用核(加l2正则项,和svm类似,加l2正则项可以用核方便处理)
l1和l2正则项是啥?lr加l1还是l2好?
L1 正则是在损失函数后加上各权重绝对值的累加再乘以一个系数,L2正则是在损失函数后加上各权重的平方累加和再乘以一个系数。
L1:计算绝对值之和,用以产生稀疏性,因为它是L0范式的一个最优凸近似,容易优化求解
L2:计算平方和再开根号,L2范数更多是防止过拟合,并且让优化求解变得稳定很快速(这是因为加入了L2范式之后,满足了强凸)。
为什么LR需要归一化或者取对数,为什么LR把特征离散化后效果更好,为什么把特征组合之后还能提升,反正这些基本都是增强了特征的表达能力,或者说更容易线性可分吧
可以提高收敛速度,提高收敛的精度
逻辑回归属于广义线性模型,表达能力受限;
在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:
逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。
离散特征的增加和减少都很容易,易于模型的快速迭代;
稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
为什么逻辑回归需要归一化?
算法如果本身受量纲影响较大,或者相关优化函数受量纲影响大,则需要进行特征归一化。
逻辑回归本身不受量纲影响,但是其使用梯度下降法求解参数受量纲影响大,如果不进行特征归一化,可能由于变量不同量纲导致参数迭代求解缓慢,影响算法速率。
逻辑回归的缺点?
深度学习如何防止过拟合?
机器学习中使用「正则化来防止过拟合」到底是一个什么原理?为什么正则化项就可以防止过拟合?
什么是正则项,L1范式,L2范式区别是什么
L1正则为什么能让系数变为0?L1正则怎么处理0点不可导的情形?(近端梯度下降)
损失函数等值线和 L1正则相交的地方就是最优解,而L1正则有很多突出的角,这些角与损失函数相交的几率远远大于其他部位,在这些角上会有很多权值等于0。
如何提高模型的泛化能力
如何克服过拟合,欠拟合
欠拟合是由于学习不足,可以考虑添加特征,从数据中挖掘出更多的特征,有时候还需要对特征进行变换,使用组合特征和高次特征。
模型简单也会导致欠拟合,例如线性模型只能拟合一次函数的数据。尝试使用更高级的模型有助于解决欠拟合,如使用SVM,神经网络等。
正则化参数是用来防止过拟合的,出现欠拟合的情况就要考虑减少正则化参数。
RF 与 GBDT的区别?
1)相同点:都是由多棵树组成,最终的结果都是由多棵树一起决定。
2)不同点:
随机森林采用bagging,而GBDT采用boosting
组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成
组成随机森林的树可以并行生成,而GBDT是串行生成
随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和
随机森林对异常值不敏感,而GBDT对异常值比较敏感
随机森林是减少模型的方差,而GBDT是减少模型的偏差
随机森林对基分类器一视同仁,GBDT是基于权值的弱分类器的集成
GBDT 与 XGB的区别?
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
介绍几种决策树算法?
ID3 信息增益
C4.5 信息增益比 C4.5是Ross Quinlan在1993年在ID3的基础上改进而提出的。.ID3采用的信息增益度量存在一个缺点,它一般会优先选择有较多属性值的Feature,因为属性值多的Feature会有相对较大的信息增益 并且可以支持离散