算法工程师面试准备

【1】机器学习解决问题的通用流程

       首先需要收集问题资料,深入理解问题,明确业务,将问题抽象成机器学习可解决的问题,也就是输入是什么,也就是通常所说的特征,输出是什么,也就是预测值,通过分析首先确定这是一个需要预测(分类、回归)还是需要聚类的问题。然后大致分为三个步骤:一是针对特征的,特征是连续还是离散(涉及需不需要离散化),是稀疏还是密集,高维度还是低维度(需不需要降维),是都含有缺失值(缺失值怎么填补)、异常值等;二是针对模型的评价,针对分类、回归还是排序等选择合适的评价指标对模型进行评价;三是模型选择的问题,不同的模型使用场景也不相同,输出的结果也会有所差异,也就说选择什么模型能够更好的从特征中学习到相应的规律,还有就是采用模型融合的方法优化目标。

【2】训练样本数据不均衡问题

       大部分的分类学习方法都存在一个基本的假设,训练集中不同类别的训练样本数目差不多。如果不同类别的样本数目差距很大,比如正类样本有98个,而负类样本只有2个,这种情况下学习出来的分类器只要一直返回正类的预测结果,那很轻易的就能达到百分之九十八的正确率,但实际上这样的模型并没有什么作用。

       可以把问题根据难度从小到大排个序:大数据+分布均衡<大数据+分布不均衡<小数据+数据均衡<小数据+数据不均衡。说明:对于小数据集,机器学习的方法是比较棘手的。对于需要解决的问题,拿到数据后,首先统计可用训练数据有多大,然后再观察数据分布情况。经验表明,训练数据中每个类别有5000个以上样本,其实也要相对于特征而言,来判断样本数目是不是足够,数据量是足够的,正负样本差一个数量级以内是可以接受的,不太需要考虑数据不平衡问题。

(1)采样

        采样方法是通过对训练集进行处理使其从不平衡的数据集变成平衡的数据集,在大部分情况下会对最终的结果带来提升。

        采样分为上采样(Oversampling)和下采样(Undersampling),上采样是把小众类复制多份,下采样是从大众类中剔除一些样本,或者说只从大众类中选取部分样本。

       随机采样最大的优点是简单,但缺点也很明显。上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分。

        上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效。

       因为下采样会丢失信息,如何减少信息的损失呢?第一种方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。第二种方法叫做BalanceCascade,利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。第三种方法是利用KNN试图挑选那些最具代表性的大众样本,叫做NearMiss,这类方法计算量很大。

(2)数据合成方法:利用已有样本生成更多样本,这类方法在小数据场景下有很多成功案例,比如医学图像分析等。

算法工程师面试准备_第1张图片

       SMOTE为每个小众样本合成相同数量的新样本,这带来一些潜在的问题:一方面是增加了类之间重叠的可能性,另一方面是生成一些没有提供有益信息的样本。为了解决这个问题,出现两种方法:Borderline-SMOTE与ADASYN。

       Borderline-SMOTE的解决思路是寻找那些应该为之合成新样本的小众样本。即为每个小众样本计算K近邻,只为那些K近邻中有一半以上大众样本的小众样本生成新样本。直观地讲,只为那些周围大部分是大众样本的小众样本生成新样本,因为这些样本往往是边界样本。确定了为哪些小众样本生成新样本后再利用SMOTE生成新样本。

算法工程师面试准备_第2张图片

       横向是真实分类情况,纵向是预测分类情况,C(i,j)是把真实类别为j的样本预测为i时的损失,我们需要根据实际情况来设定它的值。这种方法的难点在于设置合理的权重,实际应用中一般让各个分类间的加权损失值近似相等。当然这并不是通用法则,还是需要具体问题具体分析。

        权重惩罚,是指对不同的类别样本赋予不同的权重,比如数量较少的类别拥有更大的权重,再进行建模。

(4)一分类/异常点检测

       对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。

       说明:对于正负样本极不均匀的问题,使用异常检测,或者一分类问题,也是一个思路。

经验:

1、在正负样本都非常之少的情况下,应该采用数据合成的方式;

2、在负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法;

3、在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。

4、采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。

5、另外,虽然上采样和下采样都可以使数据集变得平衡,并且在数据足够多的情况下等价,但两者也是有区别的。实际应用中,如果计算资源足够且小众类样本足够多的情况下使用上采样,否则使用下采样,因为上采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合

6、对于下采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。

【3】常用的采样的方法

        1、无放回的简单随机抽样;

        2、有放回的简单随机抽样(自助采样法)

       3、平衡采样:对样本进行重新组合,主要在不平衡分类问题。就是上采样和下采样,上采样方法用ADASYN、SMOTE和BorderLine-SMOTE。

       4、整群采样:将数据集划分为互斥的k个样本子集,选择其中的几个作为训练集,其余作为测试集。

       5、分层采样:按照样本的类别,在每一个类别中选取相同比例的样本组合成训练集,不改变原始数据的比例。

【4】特征工程

        特征工程就是将原始数据空间变换到新的特征空间,在新的特征空间,模型可以更好的学习数据中的规律。首先根据学习的目标和业务的逻辑,从数据库中抽取特征,常用的统计特征有计数特征(浏览次数、下单次数等)、比率特征(点击率、订单成功率等)、统计量特征(价格的均值、标准差、偏度、峰度等)

(1)数值特征:对于数值特征,主要考虑的是它的大小和分布,对于那些目标变量是输入变量的光滑函数模型,比如线性回归、逻辑回归等,其对输入特征的大小很敏感,所以有必要对输入特征进行归一化。而对于那些基于树的模型,例如随机森林、梯度提升树等,其对输入特征的大小不敏感,输入不需要进行归一化。另外,如果模型对输入特征存在一些隐式或者显式的假设,则数据的分布对模型很重要。例如,线性回归中通常使用平方损失函数,其等价于假设预测误差服从高斯分布,但如果输出变量分布在不同尺度上,这个假设就不成立了。处理方法如下:

  • 截断:太多的精度有可能是噪声,对保留小数点位数进行截断;
  • 二值化;                                                                                                                                                                          
  • 分桶:一个特征内跨越多个数量级,均匀分桶([0,9],[10,19]...),幂级分桶([0,9],[10,99]...),分位数分桶,对应桶里面的数据一样多;
  • 缩放标准化缩放(均值为0,方差为1):适用于对输入特征大小很敏感的情况,比如线性回归和逻辑回归;最大最小缩放、最大绝对值缩放;基于某种范数的缩放,使用L1、L2范数将数值向量的范数变为1;平方根缩放或者对数缩放,对数缩放适合处理长尾分量;对于有异常点的数据,可以使用更加强健的缩放,与一般的标准化基于标准差进行缩放不同,健壮的缩放可以使用中位数代替均值,使用分位数代替方差;
  • 缺失值处理:使用均值替换缺失值;对于包含异常值,使用中位数代替缺失值;对缺失值作为一种信息直接喂给模型让其自行学习;
  • 特征交叉:特征交叉可以表现数值特征之间的相互作用,可以通过特征选择的方式选择有用的交叉组合,除了构建交叉特征外,有些模型可以自动进行特征的交叉组合,特征交叉可以在线性特征中引入非线性特征,提升模型的表达能力;
  • 非线性编码:一种是通过核的概念,例如多项式核、高斯核,但是选择合适的核函数并不容易。另外一种方式是将随机森林的叶子结点进行编码喂给线性模型,这样线性模型的特征包含了复杂的非线性信息
  • 行统计量:直接对行统计量进行处理也可以作为一类特征,均值、方差、最大值、最小值、偏度、峰度。

【5】评价指标

(1)分类指标

查准率(precision)和查全率(recall)

真实情况 预测结果
正例 反例
正例 TP FN
反例 FP TN

查准率/精确率(precision):\frac{TP}{TP+FP}

查全率/召回率(recall):\frac{TP}{TP+FN}

P-R曲线:召回率R作为纵坐标,精确率P作为横坐标,综合考虑P、R的指标:

F1——精确率和召回率的调和平均值\frac{2}{F_{1}}=\frac{1}{P}+\frac{1}{R}

F值可泛化为对精确率和召回率赋予不同权重进行加权调和:F_{\alpha }=\frac{\left ( 1+\alpha ^{2} \right )\cdot P\cdot R}{\alpha ^{2}\cdot P+R}

准确率(accuracy)\frac{TP+TN}{ALL},多类:\frac{1}{m}\sum_{i=1}^{m}I\left \{ y^{\left ( i \right )}=f\left ( x^{\left ( i \right )} \right ) \right \}

错误率(error rate)\frac{FP+FN}{ALL}

ROC曲线和AUC( ROC曲线面积为AUC)

         ROC曲线的横坐标是假正例率:FPR=\frac{FP}{FP+TN}

         ROC曲线的横坐标是真正例率:TPR=\frac{TP}{TP+FN}

         AUC的计算主要与排序有关,对排序敏感。

对数损失

          二分类:logloss=-\frac{1}{m}\sum_{i=1}^{m}\left ( y^{\left ( i \right )} \cdot \log p_{i}+\left ( 1-y^{\left ( i \right )} \right )\cdot \log p_{i}\right ),其中p_{i}代表第i个样本预测为1的概率。logloss衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。

(2)回归指标

平均绝对误差MAE : MAE=\frac{1}{m}\sum_{i=1}^{m}\left | y^{\left ( i \right )}-h_{\theta }\left ( x^{\left ( i \right )} \right ) \right |

加权平均绝对误差WMAE : WMAE=\frac{1}{m}\sum_{i=1}^{m}w_{i}\cdot \left | y^{\left ( i \right )}-h_{\theta }\left ( x^{\left ( i \right )} \right ) \right |,对每条样本考虑不同的权重,比如考虑时间因素,离当前时间越久的样本权重越低。

平均绝对百分误差MAPE : WMAE=\frac{100}{m}\sum_{i=1}^{m} \left | \frac{y^{\left ( i \right )}-h_{\theta }\left ( x^{\left ( i \right )} \right )}{y^{\left ( i \right )}} \right |,计算绝对百分误差来表示预测效果,其值越小越好。

均方根误差RMSERMSE=\sqrt{\frac{1}{m}\sum_{i=1}^{m}\left ( y^{\left ( i \right )}-h_{\theta}\left ( x^{i} \right ) \right )^{2}}

均方根对数误差:RMSLE=RMSE=\sqrt{\frac{1}{m}\sum_{i=1}^{m}\left (\log (y^{\left ( i \right )}+1) -\log (h_{\theta}\left ( x^{i} \right )+1)\right )^{2}},RMSE对预测值偏小的样本惩罚比预测值偏大的样本惩罚更大。

   【6】距离和相似性度量    

相似性的度量(可参考:https://my.oschina.net/hunglish/blog/787596)

         a.距离度量:闵可斯基距离

                                                          dist(X,Y)=\left ( \sum_{i=1}^{n}\left ( x_{i}-y_{i} \right )^{p} \right )^{1/p}

                  p=1 => 曼哈顿距离

                  p=2 => 欧式距离

                  p=∞ => 切比雪夫距离:d_{XY}=\underset{i}{max}\left ( \left | x_{i}-y_{i} \right | \right )

               将各个分量的量纲(scale),也就是“单位”相同的看待了,未考虑各个分量的分布(期望,方差等)可能是不同的。

              马氏距离:两个服从同一分布并且其协方差矩阵为Σ的随机变量与的差异程度:

                                 

               如果协方差矩阵为单位矩阵,马氏距离就简化为欧式距离;如果协方差矩阵为对角阵,其也可称为正规化的马氏距离。

                                

               其中σi是xi的标准差。

               使用注意:在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可。

                          马氏距离的计算是不稳定的,不稳定的来源是协方差矩阵,这也是马氏距离与欧式距离的最大差异之处。

              优点:它不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰。

              缺点:它的缺点是夸大了变化微小的变量的作用

                     

   b.相似系数

             余弦相似性:假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:

                                  算法工程师面试准备_第3张图片

            余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性。

           皮尔逊相关系数\rho _{XY}=\frac{cov\left ( X,Y \right )}{\sqrt{D(X)\sqrt{D(Y)}}}=\frac{\sum_{i=1}^{n}\left ( x-\mu _{x} \right )\left ( y-\mu _{y} \right )}{\sqrt{\sum_{i=1}^{n}\left ( x-\mu _{x} \right )^{2}}{\sqrt{\sum_{i=1}^{n}\left ( y-\mu _{y} \right )^{2}}}}

            Jaccard 系数(杰卡德):jaccard相似度的缺点是值适用于二元数据的集合。

                                   

        非对称(注意这里强调非对称)二元属性的相似度:已知有序集合A,B,每个集合都含有n个二元的属性,即每个属性都是0或1,M11表示A和B对应位都是1的属性的数量;M10表示A中为1,B中对应位为0的总数量;M01表示A中为0,B中对应位为1的总数量;M00表示对应位都为0的总数量,有M11+M10+M01+M00=n

       Jaccard 相似度jaccard距离

       jaccard相似度是指交集和并集的比值,这里J的分子为什么只有M11没有M00,这是因为我们求的是非对称二元属性的相似度,这里只有非0值才受关注。

            广义 Jaccard 系数(杰卡德)

         x=(x1,x2,...,xn) y=(y1,y2,...,yn)是两个向量,xi,yi>0的实值,x,y的相似性系数定义为,距离定义为

  1. 过滤相似度很高的新闻,或者网页去重

  2. 考试防作弊系统

  3. 论文查重系统

【7】如何进行特征选择?

原文网址1:http://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html 
原文网址2:http://blog.csdn.net/google19890102/article/details/40019271

(1) 什么是特征选择

特征选择 ( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ) ,或属性选择( Attribute Selection ) ,是指从全部特征中选取一个特征子集,使构造出来的模型更好。

(2) 为什么要做特征选择

特征个数越多,一方面分析特征、训练模型所需的时间就越长,而且容易引起维数灾难,模型复杂度越高。

  • 简化模型,使模型易于理解;
  • 改善性能,节省存储和计算开销;
  • 改善通用性、降低过拟合风险,提高预测准确性。

(3)特征选择和降维 
1、相同点和不同点 
       特征选择和降维有着些许的相似点,这两者达到的效果是一样的,就是试图去减少特征数据集中的属性(或者称为特征)的数目;但是两者所采用的方式方法却不同:降维的方法主要是通过属性间的关系,如组合不同的属性得新的属性,这样就改变了原来的特征空间;而特征选择的方法是从原始特征数据集中选择出子集,是一种包含的关系,没有更改原始的特征空间。 
2、降维的主要方法 
       Principal Component Analysis(主成分分析),详细见“简单易学的机器学习算法——主成分分析(PCA)” 
       Singular Value Decomposition(奇异值分解),详细见“简单易学的机器学习算法——SVD奇异值分解” 
       Sammon’s Mapping(Sammon映射) 
(4)特征选择的方法 
1、Filter方法 
其主要思想是:对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。 

主要的方法有: 

  1. 覆盖率:计算每个特征在训练集中出现的比率,比如一个10000个样本的数据,某个特征只出现了5次,可以考虑剔除。
  2. Chi-squared test(卡方检验) :卡方统计量取值越大,特征相关性越高;
  3. information gain(信息增益),详细可见“简单易学的机器学习算法——决策树之ID3算法” ;
  4. correlation coefficient scores(相关系数) :皮尔逊相关系数;
  5. 互信息:I\left ( X,Y \right )= \sum_{y\epsilon Y }\sum_{x\epsilon X }p\left ( x,y \right )\log \frac{p(x,y)}{p(x)p(y)}
  6. 多变量的特征过滤算法:其中有一种CFS算法,基于如下假设:好的特征集合包含和目标变量非常相关的特征,但是这些特征变量彼此之间不相关。

考虑特征之间彼此的相关关系,CFS=\underset{s_{k}}{max}\left [ \frac{r_{cf_{1}}+r_{cf_{2}}+\cdots +r_{cf_{k}}}{\sqrt{k+2(r_{f_{1}f_{2}}+\cdots +r_{f_{i}f_{j}}+\cdots +r_{f_{k}f_{1}})}} \right ],其中,r_{cf_{i}}代表特征变量和目标变量之间的相关性,r_{f_{i}f_{j}}代表特征变量之间的相关性。

2、Wrapper方法 
其主要思想是:Filter方法不考虑后续的学习器,而包裹式选择算法直接将最终要使用的学习器的性能作为评价标准。
封装方法是特征子集搜索和评价指标相结合的方法。分为:

完全搜索:穷举法和非穷举法,分支定界搜索在穷举搜索的基础上加入了分支限界,若判定某些分支不可能搜索出比当前找到的最优解更优的解,就停止该分支的搜索。

启发式搜索序列向前选择:特征子集从空集开始,每次只加入一个特征,这是一种贪心算法;

                     序列向后选择:特征子集从全集开始,每次删除一个特征;

                     双向搜索同时使用序列向前选择和序列向后选择,当两者搜索到相同的子集时停止;

                     增L删R选择法:每轮先删除R个特征,再增加L个特征;

随机搜索:执行序列前向特征选择或者后向特征选择时,此算法随机选择特征子集。
3、Embedded方法 
       其主要思想是:Filter和wrapper特征选择中,特征选择和学习器的训练过程是分开的,而嵌入式特征选择是将特征选择过程和学习器的学习过程融为一体。
     
 主要方法:正则化,可以见“简单易学的机器学习算法——Lasso回归(Lasso Regression)”,Lasso回归就是在基本线性回归的过程中加入了L1正则项。 

        另一种是基于树的特征选择,树中较浅的节点一般对应的特征分类能力更强,可以基于树对特征进行重要程度的排序。

常用特征选择方法的比较
特征选择方法 优点 缺点 举例
过滤方法Filter 单变量

速度快;

可扩展;

跟机器学习算法独立

忽略特征之间的关系;忽略特征与模型之间的关系

卡方检验;

信息增益;

相关系数

多变量

考虑了特征之间的相关性;

跟机器学习算法独立;

计算复杂度由于封装方法

计算速度和复杂度低于单变量过滤方法;忽略了特征和模型之间的关系 基于相关性的特征选择(CFS);MBF;FCBF
封装方法Wrapper 确定性方法

简单;

跟机器学习模型耦合;

考虑特征之间的相互作用;

计算密集程度低于随机封装方法

容易过拟合;?

相比于随机封装算法,容易卡在局部最优特征子集(基于贪心;

依赖机器学习模型)

序列前向特征选择(SFS);

序列后向特征选择(SBE);

增q删r

随机方法

不容易达到局部极小点;

跟机器学习模型相关;

考虑特征之间的相互作用

计算密集型;

依赖机器学习算法;

过拟合风险高?

模拟退火;

随机爬山;

基因算法

嵌入方法Embedded

与模型相关;

计算复杂度优于封装算法;

考虑特征之间的相互作用

依赖机器学习算法

决策树、随机森林、梯度提升树;SVM; LASSO

ps:python的sklearn库中有feature-selection模块。

模拟退火算法


/*
* J(y):在状态y时的评价函数值
* Y(i):表示当前状态
* Y(i+1):表示新的状态
* r: 用于控制降温的快慢
* T: 系统的温度,系统初始应该要处于一个高温的状态
* T_min :温度的下限,若温度T达到T_min,则停止搜索
*/
while( T > T_min )
{
  dE = J( Y(i+1) ) - J( Y(i) ) ; 
  if ( dE >=0 ) //表达移动后得到更优解,则总是接受移动
        Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
  else
  {
        // 函数exp( dE/T )的取值范围是(0,1) ,dE/T越大,则exp( dE/T )也
        if ( exp( dE/T ) > random( 0 , 1 ) )
            Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
  }
  T = r * T ; //降温退火 ,0

旅行商问题 ( TSP , Traveling Salesman Problem ) :有N个城市,要求从其中某个问题出发,唯一遍历所有城市,再回到出发的城市,求最短的路线。

  旅行商问题属于所谓的NP完全问题,精确的解决TSP只能通过穷举所有的路径组合,其时间复杂度是O(N!) 。

  使用模拟退火算法可以比较快的求出TSP的一条近似最优路径。(使用遗传算法也是可以的,我将在下一篇文章中介绍)模拟退火解决TSP的思路:

                  1. 产生一条新的遍历路径P(i+1),计算路径P(i+1)的长度L( P(i+1) )

                  2. 若L(P(i+1)) < L(P(i)),则接受P(i+1)为新的路径,否则以模拟退火的那个概率接受P(i+1) ,然后降温   

                   3. 重复步骤1,2直到满足退出条件

  产生新的遍历路径的方法有很多,下面列举其中3种:

                    1. 随机选择2个节点,交换路径中的这2个节点的顺序。

                    2. 随机选择2个节点,将路径中这2个节点间的节点顺序逆转。

                    3. 随机选择3个节点m,n,k,然后将节点m与n间的节点移位到节点k后面。

【8】SVM 的推导,特性?多分类怎么处理? 

1、特点:

  • 非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射
  • 对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
  • 支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量
  • SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。
  • SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
  • 少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在: 

        ①增、删非支持向量样本对模型没有影响;

        ②支持向量样本集具有一定的鲁棒性;

        ③有些成功的应用中,SVM 方法对核的选取不敏感

  • SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法(如基于规则的分类器和人工神经网络)都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。
  • SVM通过最大化决策边界的边缘来控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。
  • SVM在小样本训练集上能够得到比其它算法好很多的结果。支持向量机之所以成为目前最常用,效果最好的分类器之一,在于其优秀的泛化能力,这是是因为其本身的优化目标是结构化风险最小,而不是经验风险最小,因此,通过margin的概念,得到对数据分布的结构化描述,因此减低了对数据规模和数据分布的要求。SVM也并不是在任何场景都比其他算法好,对于每种应用,最好尝试多种算法,然后评估结果。如SVM在邮件分类上,还不如逻辑回归、KNN、bayes的效果好
  • 它基于结构风险最小化原则,这样就避免了过学习问题,泛化能力强
  • 它是一个凸优化问题,因此局部最优解一定是全局最优解的优点
  • 泛华错误率低,分类速度快,结果易解释

2、不足之处:

  • SVM算法对大规模训练样本难以实施

        SVM的空间消耗主要是存储训练样本和核矩阵,由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法。

        如果数据量很大,SVM的训练时间就会比较长,如垃圾邮件的分类检测,没有使用SVM分类器,而是使用了简单的naive bayes分类器,或者是使用逻辑回归模型分类。

  • 用SVM解决多分类问题存在困难

        经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。

  • 对缺失数据敏感,对参数和核函数的选择敏感

        支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法.目前比较成熟的核函数及其参数的选择都是人为的,根据经验来选取的,带有一定的随意性.在不同的问题领域,核函数应当具有不同的形式和参数,所以在选取时候应该将领域知识引入进来,但是目前还没有好的方法来解决核函数的选取问题.

支持向量机的主要应用和研究的热点

3、目前支持向量机主要应用在模式识别领域中的文本识别,中文分类,人脸识别等;同时也应用到许多的工程技术和信息过滤等方面.

        当前研究的热点主要是对支持向量机中算法的优化,包括解决SVM中二次规划求解问题,对大规模SVM的求解问题,对SVM中QP问题的求解问题等.另外就是如何更好的构造基于SVM的多类分类器,如何提高SVM的归纳能力和分类速度等.如何根据实际问题确定核函数也是一个重要的研究热点.

支持向量越多越好还是越少越好:更高的维度一般意味这更高的模型复杂度,所以支持向量越多意味着模型越复杂,根据泛化理论,就越有过拟合的风险,如果在性能一致的情况下,更少的支持向量是更好的,但这一点也不绝对,因为泛化理论仅仅是误差的上界,实际决定因素比较复杂,也可能取决于kernel的性质,所以还是自己做好交叉验证比较好。

4、核函数的选择:

  • 线性核函数 \kappa \left ( x,z \right )=x^{T}z
           线性核,主要用于线性可分的情况,我们可以看到特征空间到输入空间的维度是一样的,其参数少速度快,对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的
  • 多项式核函数 \kappa \left ( x,z \right )=\left ( x^{T}z \right )^{d}
           多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。
  • 高斯(RBF)核函数     \kappa \left ( x,z \right )=exp\left (- \frac{\left \|\left ( x-z \right )^{2} \right \|}{2\sigma ^{2}} \right )
  • 高斯径向基函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。
  • sigmoid核函数   \kappa \left ( x,z \right )=tahn\left (\beta x^{T}z \right+\theta )
  • 采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。

       因此,在选用核函数的时候,如果我们对我们的数据有一定的先验知识,就利用先验来选择符合数据分布的核函数;如果不知道的话,通常使用交叉验证的方法,来试用不同的核函数,误差最下的即为效果最好的核函数,或者也可以将多个核函数结合起来,形成混合核函数。选择核函数的技巧:

  • 如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM
  • 如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数;
  • 如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况

算法工程师面试准备_第4张图片

【9】LR 的推导,特性?(LR是基于经验风险最小化的)

       h_{\theta }\left (x \right )=g\left ( \theta ^{T}x \right )=\frac{1}{1+e^{-\theta ^{T}x}}

1) 可用于概率预测,也可用于分类。 
并不是所有的机器学习方法都可以做可能性概率预测(比如SVM就不行,它只能得到1或者-1)。可能性预测的好处是结果又可比性:比如我们得到不同广告被点击的可能性后,就可以展现点击可能性最大的N个。这样以来,哪怕得到的可能性都很高,或者可能性都很低,我们都能取最优的topN。当用于分类问题时,仅需要设定一个阈值即可,可能性高于阈值是一类,低于阈值是另一类。 
2) 仅能用于线性问题 
只有在feature和target是线性关系时,才能用Logistic Regression(不像SVM那样可以应对非线性问题)。这有两点指导意义,一方面当预先知道模型非线性时,果断不使用Logistic Regression; 另一方面,在使用Logistic Regression时注意选择和target呈线性关系的feature。 
3) 各feature之间不需要满足条件独立假设,但各个feature的贡献是独立计算的。 
逻辑回归不像朴素贝叶斯一样需要满足条件独立假设(因为它没有求后验概率)。但每个feature的贡献是独立计算的,即LR是不会自动帮你combine 不同的features产生新feature的 (时刻不能抱有这种幻想,那是决策树,LSA, pLSA, LDA或者你自己要干的事情)。举个例子,如果你需要TF*IDF这样的feature,就必须明确的给出来,若仅仅分别给出两维 TF 和 IDF 是不够的,那样只会得到类似 a*TF + b*IDF 的结果,而不会有 c*TF*IDF 的效果。

4)LR对于样本噪声是robust的;

5)对缺失数据敏感;6)可用于在线学习;

LR(逻辑回归) 为什么使用sigmoid函数?

        当给定y的分布,h_{\theta }\left ( x \right )就是确定的,当y服从伯努利分布时,即y\sim Bernoulli\left ( \o \right )h_{\theta }\left ( x \right )就是sigmoid函数,当y服从高斯分布时,h_{\theta }\left ( x \right )=\theta ^{T}x。这是因为伯努利分布和高斯分布都可以转化为指数族,是通过转换过程求解E\left [ T\left ( y \right ) \mid x\right ]得到的。

lr与线性回归的区别逻辑回归用的是对数似然(或称交叉熵),而线性回归用的是平方误差。这是因为逻辑回归是二项分布,而线性回归是高斯分布,因此用不同的cost function。另外一个比较明显的区别是逻辑回归对线性变换的结果用了sigmoid函数,使得结果映射到(0,1)的区间,但大多数时候我们仍然称它为线性分类器。

LR与SVM的不同点

1、本质上是loss函数不同,或者说分类的原理不同。

LR的目标是最小化模型分布和经验分布之间的交叉熵:

LR基于概率理论中的极大似然估计。首先假设样本为0或者1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值,即让模型产生的分布P(Y|X)尽可能接近训练数据的分布。

SVM的目标是最大化分类间隔(硬SVM),或者最大化 [分类间隔—a*分错的样本数量](软SVM)


SVM​基于几何间隔最大化原理,认为几何间隔最大的分类面为最优分类面 。

2、SVM是结构风险最小化,LR则是经验风险最小化。

结构风险最小化就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,减小泛化误差。为了达到结构风险最小化的目的,最常用的方法就是添加正则项。

SVM的loss函数的第一项可看作L2正则项;LR需要加入正则化项。

3、SVM只考虑分界面附近的少数点,而LR则考虑所有点。

影响SVM决策面的样本点只有少数的支持向量。在支持向量外添加或减少任何样本点,对分类决策面没有任何影响。

在LR中,每个样本点都会影响决策面。决策面会倾向于远离样本数量较多的类别。如果不同类别之间的数量严重不平衡,一般需要先对数据做balancing。

4、SVM不能产生概率,LR可以产生概率。

5、在解决非线性问题时,SVM可采用核函数的机制,而LR通常不采用核函数的方法。

SVM只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。

LR里每个样本点都要参与核计算,计算复杂度太高,故LR通常不用核函数。
6、SVM计算复杂,但效果比LR好,适合小数据集;LR计算简单,适合大数据集,可以在线训练。

【10】决策树的特性?

       决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。 
算法 C4.5 :

算法工程师面试准备_第5张图片
C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 
1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足; 
2) 在树构造过程中进行剪枝;  
C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

CART:CART假设决策树是一颗二叉树,递归构建二叉决策树的过程,对回归树使用平方误差最小化准则,对分类树利用基尼指数最小化准则,进行特征选择。

决策树的优点 
相对于其他数据挖掘算法,决策树在以下几个方面拥有优势: 
•优点:计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;

缺点:

       1、单颗决策树分类能力弱,并且对连续值变量难以处理;

       2、容易过拟合(后续出现了随机森林,减小了过拟合现象);

       3、对有时间顺序的数据,需要很多预处理的工作;

       4、当类别太多时,错误可能就会增加的比较快;

       5、在处理特征关联性比较强的数据时表现得不是太好

解决决策树的过拟合

  1. 剪枝前置剪枝:在分裂节点的时候设计比较苛刻的条件,如不满足则直接停止分裂(这样干决策树无法到最优,也无法得到比较好的效果)
  2. 后置剪枝:在树建立完之后,用单个节点代替子树,节点的分类采用子树中主要的分类(这种方法比较浪费前面的建立过程)

【11】梯度提升决策树(Gradient Boosting Decision Tree,GBDT)

算法工程师面试准备_第6张图片

                      图 1:GBDT 的训练过程

        gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。

        弱分类器一般会选择为CART TREE(也就是分类回归树)。由于上述高偏差和简单的要求 每个分类回归树的深度不会很深。最终的总分类器 是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。

        模型最终可以描述为:F=\sum_{k=1}^{K}\alpha _{k}T(x;\theta _{k});

       模型一共训练K轮,每轮产生一个弱分类器T(x;\theta _{k}) 。弱分类器的损失函数:

                          L=\underset{\theta _{k}}{argmin}\sum_{i=1}^{m}\left ( y^{(i)},F_{k-1}\left ( x^{(i)} \right )+T\left ( x^{i};\theta _{k} \right ) \right )

     希望损失函数能够不断的减小并且是希望损失函数能够尽可能快的减小。所以如何尽可能快的减小呢?

      让损失函数沿着梯度方向的下降。这个就是gbdt 的 gb的核心了。 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。gbdt 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。

       这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解或者全局最优解。

gbdt用于分类

算法工程师面试准备_第7张图片

GBDT 和 决策森林 的区别?

      GBDT和随机森林的相同点: 
               1、都是由多棵树组成 
               2、最终的结果都是由多棵树一起决定

     GBDT和随机森林的不同点: 
               1、组成随机森林的树可以并行生成;而GBDT只能是串行生成 ;
               2、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来 ;
               3、随机森林对异常值不敏感,GBDT对异常值非常敏感 ;
               4、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成 ;
               5、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能;

               6、随机森林即可以使用决策树也可以使用回归树,但是gbdt采用的都是CART回归树。

GBDT和Adaboost的区别与联系:

         和AdaBoost一样,Gradient Boosting也是重复选择一个表现一般的模型并且每次基于先前模型的表现进行调整。不同的是,AdaBoost是通过提升错分数据点的权重来定位模型的不足而Gradient Boosting是通过算梯度(gradient)来定位模型的不足。因此相比AdaBoost, Gradient Boosting可以使用更多种类的目标函数,而当目标函数是均方误差时,计算损失函数的负梯度值在当前模型的值即为残差。

GBDT V.S. LR(Linear Regression? Logistic Regression?)
从决策边界来说,线性回归的决策边界是一条直线,逻辑回归的决策边界是一条曲线,而GBDT的决策边界可能是很多条线。

【12】SVM、LR、决策树的对比?

LR,DT,SVM都有自身的特性,首先来看一下LR,工业界最受青睐的机器学习算法,训练、预测的高效性能以及算法容易实现使其能轻松适应工业界的需求。LR还有个非常方便实用的额外功能就是它并不会给出离散的分类结果,而是给出该样本属于各个类别的概率(多分类的LR就是softmax),可以尝试不同的截断方式来在评测指标上进行同一模型的性能评估,从而得到最好的截断分数。LR不管是实现还是训练或者预测都非常高效,很轻松的handle大规模数据的问题(同时LR也很适合online learning)。此外,LR对于样本噪声是robust的,对于“mild”的多重共线性问题也不会受到太大影响,在特征的多重共线性很强的情况下,LR也可以通过L2正则化来应对该问题,虽然在有些情况下(想要稀疏特征)L2正则化并不太适用。

但是,当我们有大量的特征以及部分丢失数据时,LR就开始费劲了。太多的分类变量(变量值是定性的,表现为互不相容的类别或属性,例如性别,年龄段(1,2,3,4,5)等)也会导致LR的性能较差(这个时候可以考虑做离散化,其实肯定是要做离散化的)。还有一种论调是LR使用所有的样本数据用于训练,这引发了一个争论:明显是正例或者负例的样本(这种样本离分类边界较远,不大会影响分类的curve)不太应该被考虑太多,模型理想情况是由分类边界的样本决定的(类似SVM的思想),如下图。还有一个情况就是当特征是非线性时,需要做特征变换,这可能会导致特征维度急剧上升。下面是我认为的LR的一些利弊:

LR的优势:

对观测样本的概率值输出 
实现简单高效 
多重共线性的问题可以通过L2正则化来应对 
大量的工业界解决方案 
支持online learning(个人补充) 
LR的劣势

特征空间太大时表现不太好 
对于大量的分类变量无能为力 
对于非线性特征需要做特征变换 
依赖所有的样本数据

决策树对于单调的特征变换是”indifferent”的,也就是说特征的单调变换对于决策树来说不会产生任何影响(我本人最早使用决策树时没有理解内部的机制,当时还做了特征归一化等工作,发现效果没有任何变化),因为决策树是通过简单的使用矩形切分特征空间的,单调的特征变换只是做了特征空间的缩放而已。由于决策树是的分支生成是使用离散的区间或类别值的,所以对于不管多少分类变量都能够轻松适应,而且通过决策树生成出来的模型很直观而且容易解释(随着决策树的分支解释即可),而且决策树也可以通过计算落到该叶子类目的标签平均值获得最终类别的概率输出。但是这就引发了决策树的最大问题:非常容易过拟合,我们很容易就会生成一个完美拟合训练集的模型,但是该模型在测试集合上的表现却很poor,所以这个时候就需要剪枝以及交叉验证来保证模型不要过拟合了

过拟合的问题还可以通过使用随机森林的方式来解决,随机森林是对决策树的一个很smart的扩展,即使用不同的特征集合和样本集合生成多棵决策树,让它们来vote预测样本的标签值。但是随机森林并没有像单纯决策树一样的解释能力。 
DT的优势:

直观的决策过程 
能够处理非线性特征 
DT的劣势

极易过拟合(使用RF可以一定程度防止过拟合,但是只要是模型就会过拟合!) 
无法输出score,只能给出直接的分类结果

SVM最大的好处就是它只依赖于处于分类边界的样本来构建分类面,可以处理非线性的特征,同时,只依赖于决策边界的样本还可以让他们能够应对”obvious”样本缺失的问题。由于SVM能够轻松搞定大规模的特征空间所以在文本分析等特征维度较高的领域是比较好的选择。SVM的可解释性并不像决策树一样直观,如果使用非线性核函数,SVM的计算代价会高很多。

SVM的优势:

可以处理高维特征 
使用核函数轻松应对非线性特征空间 
分类面不依赖于所有数据 
SVM的劣势:

对于大量的观测样本,效率会很低 
找到一个“合适”的核函数还是很tricky的
为什么将原问题转为对偶问题:

  1. 对偶问题将原始问题中的约束转为了对偶问题中的等式约束(KKT)
  2. 方便核函数的引入
  3. 改变了问题的复杂度。由求特征向量w转化为求比例系数a,在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关。

【13】L1正则化和L2正则化

L1正则化可以产生稀疏模型,L2正则化可以防止过拟合。

为什么L1正则化可以产生稀疏模型,L2正则化可以防止过拟合?  见链接

【14】如何判断函数凸或非凸?

原文网址:http://blog.csdn.net/xmu_jupiter/article/details/47400411

很多最优化问题都是在目标函数是凸函数或者凹函数的基础上进行的。原因很简单,凸函数的局部极小值就是其全局最小值,凹函数的局部极大值就是其全局最大值。因此,只要我们依据一个策略,一步步地逼近这个极值,最终肯定能够到达全局最值附近。 
算法工程师面试准备_第8张图片

【15】过拟合和欠拟合

原文地址:https://blog.csdn.net/willduan1/article/details/53070777

在我们机器学习或者训练深度神经网络的时候经常会出现欠拟合和过拟合这两个问题,但是,一开始我们的模型往往是欠拟合的,也正是因为如此才有了优化的空间,我们需要不断的调整算法来使得模型的表达能拿更强。但是优化到了一定程度就需要解决过拟合的问题了,这个问题也在学术界讨论的比较多。

首先就是我们在进行模型训练的时候会出现模型不能够很好地拟合数据的情况,这个时候就需要我们来判断究竟现在的模型是欠拟合还是过拟合,那么怎么来判断这两者的情况呢?有两种方法:

首先看一下三种误差的计算方法:

  • training error

  • cross validation error

  • test error

1)学习曲线(learning curves)

学习曲线就是比较 j_train 和 j_cv。如下图所示,为一般的学习曲线,蓝色的线表示训练集上的误差 j_train, 粉色的线表示验证集上的误差 j_cv,横轴表示训练集合的大小。

算法工程师面试准备_第9张图片

刚开始处于 “A” 点,表示当训练数据很小时,很容易时训练集上的误差非常小,此时处于过拟合状态。随着训练数据的增加,训练数据上的误差 J_train 越来越大,而验证集上的误差 J_cv 越来越小,J_train 和 J_cv 越来越接近但始终保持 J_cv > J_train.

2)交叉验证(cross-validation)

这里首先解释一下bias和variance的概念。模型的Error = Bias + Variance,Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。

我们可以根据j_cv 与 j_train两个来判断是处于欠拟合还是过拟合。

算法工程师面试准备_第10张图片

当观察到 J_cv 很大时,可能处在途中蓝色圆圈中的两个位置,虽然观察到的现象很相似(J_cv都很大),但这两个位置的状态是非常不同的,处理方法也完全不同。

  • 当cross validation error (Jcv) 跟training error(Jtrain)差不多,且Jtrain较大时,即图中标出的bias,此时 high bias low variance,当前模型更可能存在欠拟合。
  • 当Jcv >> Jtrain且Jtrain较小时,即图中标出的variance时,此时 low bias high variance,当前模型更可能存在过拟合。

1. 欠拟合

欠拟合就是模型没有很好地捕捉到数据特征,不能够很好地拟合数据。例如下面的例子:

算法工程师面试准备_第11张图片算法工程师面试准备_第12张图片算法工程师面试准备_第13张图片

左图表示size与prize关系的数据,中间的图就是出现欠拟合的模型,不能够很好地拟合数据,如果在中间的图的模型后面再加一个二次项,就可以很好地拟合图中的数据了,如右面的图所示。

解决方法:

1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。

2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。

3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。

2. 过拟合

一味追求提高对训练数据的预测能力,所选的模型复杂度往往比真实模型要高,过拟合指的是模型对训练数据预测能力较好,但对未知数据预测能力很差的现象。例如下面的例子。

算法工程师面试准备_第14张图片算法工程师面试准备_第15张图片

上面左图表示size和prize的关系,我们学习到的模型曲线如右图所示,虽然在训练的时候模型可以很好地匹配数据,但是很显然过度扭曲了曲线,不是真实的size与prize曲线。

解决方法:

1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。

2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。

3)采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则。

4)特征筛选

【16】梯度下降法(BGD、SGD)、牛顿法、拟牛顿法(DFP、BFGS)

梯度下降法:随机梯度下降法、批量梯度下降法

       梯度下降法(Gradient Descent) 梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。 

算法工程师面试准备_第16张图片

从上面的公式可以看出,批量梯度下降法可以得到一个全剧最优解,但是每迭代一步,计算量是m*n^2,m—样本个数,n—特征维数,都要用到训练集的所有数据,如果m很大,那么迭代速度会很慢,所以可以采用随机梯度下降法,

算法工程师面试准备_第17张图片

SGD的问题是噪音比BGD要多,是的SGD不是每次迭代都向着整体最优的方向,SGD以损失一部分精确度和增加一定的迭代次数为代价,换取了总体的优化效率的提升,增加的迭代次数远小于样本的数量。

SGD和BGD的比较:

BGD:最小化所有训练样本的损失函数,使得最终求解的是全局最优解,即使得求解的风险函数最小,但是对于大规模样本效率较低。SGD:最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优的方向,但是大方向是全剧最优解,最终的结果往往是在全剧最优解的附近,适用于大规模的训练样本情况。

牛顿法(Newton’s method):牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f (x)的泰勒级数的前面几项来寻找方程f (x) = 0的根。牛顿法最大的特点就在于它的收敛速度很快。 

算法工程师面试准备_第18张图片

对于损失函数l\left ( \theta \right )    =>     l^{'}\left ( \theta \right )=0,则使用牛顿法的迭代为:\theta :=\theta -\frac{l^{'\left ( \theta \right )}}{l^{''\left ( \theta \right )}}

在logistic regression中,一般化的迭代为:\theta :=\theta -H^{-1}\triangledown _{\theta }l\left ( \theta \right ),其中,H为hessian矩阵,H_{ij}=\frac{\partial^{2} l\left ( \theta \right )}{\partial x_{i}\partial x_{j} }

牛顿法的优缺点总结:

  优点:二阶收敛,收敛速度快

  缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

梯度下降法和牛顿法的比较:从本质来说,梯度下降法是一阶收敛,牛顿法是二阶收敛,所以牛顿法的收敛速度更快。梯度下降法每次考虑的是当前位置的负梯度下降,而牛顿法不但考虑当前位置下降的是否够快,还会考虑下一步下降的是否够大,也就是说牛顿法目标更长远一点。牛顿法是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法使用一个平面去拟合当前的局部曲面,通常情况二次曲面额拟合会比平面更好,所以牛顿法的下降路径会更符合真实的最优下降路径。

【17】归一化相关

(1)归一化后有两个好处:1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度”。

       针对于归一化可以提高梯度下降的速度:斯坦福机器学习视频做了很好的解释: https://class.coursera.org/ml-003/lecture/21

       如下图所示,蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

       归一化可以提高精度:一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

(2) 归一化的类型

         1)线性归一化

        这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量来替代max和min。

          2)标准差标准化 

         经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:

         其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

         3)非线性归一化

         经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

【18】聚类

     https://www.zhihu.com/question/34554321

      大致可以分为划分法(Partitioning Methods)、 层次法(Hierarchical Methods)、基于密度的方法(density-based methods)、 基于网格的方法(grid-based methods)、基于模型的方法(Model-Based Methods)。

        层级聚类算法可以理解为自上而下和自下而上两种.自底向上的凝聚方法,比如AGNES。将数据集中的每个样本看成一个初始类簇,在算法的每一步找到距离最近的两个类簇进行合并,关键在于如何求两个类簇的距离,例如最大距离、最小距离、平均距离。

        最小距离:d_{min}\left ( C_{i},C_{j} \right )=\underset{x\in C_{i},z\in C_{j}}{min}dist(x,z)

        最大距离:d_{max}\left ( C_{i},C_{j} \right )=\underset{x\in C_{i},z\in C_{j}}{max}dist(x,z)

        平均距离:d_{avg}\left ( C_{i},C_{j} \right )=\frac{1}{\left | C_{i}\right | \left | C_{j} \right |}\sum \sum \underset{x\in C_{i},z\in C_{j}}{min}dist(x,z)

        划分法:K-means、K-means++和ISODATA

k-means的EM解释:

期望步(E-步):给定当前的簇中心,每个对象都被指派到簇中心离该对象最近的簇。这里,期望每个对象都属于最近的簇。

最大化步(M-步):给定簇指派,对于每个簇,算法调整其中心,使得指派到该簇的对象到该新中心到的距离之和最小化。也就是说,将指派到一个簇的对象的相似度最大化。

k-means算法的优点:

  (1)k-means算法是解决聚类问题的一种经典算法,算法简单、快速。

  (2)对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k远小于n。这个算法通常局部收敛。

  (3)算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。

   缺点:

  (1)k-平均方法只有在簇的平均值被定义的情况下才能使用,且对有些分类属性的数据不适合。

  (2)要求用户必须事先给出要生成的簇的数目k

  (3)对初值敏感,对于不同的初始值,可能会导致不同的聚类结果

  (4)不适合于发现非凸面形状的簇,或者大小差别很大的簇。

  (5)对于”噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。

       K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0

      K-means与ISODATA:ISODATA的全称是迭代自组织数据分析法。在K-means中,K的值需要预先人为地确定,并且在整个算法过程中无法更改。而当遇到高维度、海量的数据集时,人们往往很难准确地估计出K的大小。ISODATA就是针对这个问题进行了改进,它的思想也很直观:当属于某个类别的样本数过少时把这个类别去除,当属于某个类别的样本数过多、分散程度较大时把这个类别分为两个子类别。

       IDODATA参数:预期的聚类中心数目Ko:最终输出的聚类中心数目范围是 [Ko/2, 2Ko]; 每个类所要求的最少样本数目Nmin最大方差Sigma:用于衡量某个类别中样本的分散程度。当样本的分散程度超过这个值时,则有可能进行分裂操作; 两个类别对应聚类中心之间所允许最小距离dmin:两个类别对应聚类中心之间的距离非常小,则需要对这两个类别进行合并操作。

      (3) K-means与Kernel K-means:传统K-means采用欧式距离进行样本间的相似度度量,显然并不是所有的数据集都适用于这种度量方式。参照支持向量机中核函数的思想,将所有样本映射到另外一个特征空间中再进行聚类,就有可能改善聚类效果。本文不对Kernel K-means进行详细介绍。

(3)密度聚类

         由于k-means解决不了不规则形状的聚类,DBSCAN和OPTICS。

DNSCAN: 算法工程师面试准备_第19张图片

       DBSCAN的主要优点有:

    1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。

    2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感

    3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

    DBSCAN的主要缺点有:

    1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。

    2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。

    3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

 OPTICS(未处理)

(4)基于网格的方法:将数据集映射到网格单元中,并计算每个单元的密度,根据预设的阈值判断每个网格单元是否为高密度单元,由临近的稠密单元组成类,该方法执行高效,因为其速度与数据对象的个数无关,只依赖于数据空间中每个维上单元的个数,但缺点是对参数敏感、无法处理不规则分布的数据、维数灾难等。

  STING, WaveCluster.

(5) 基于模型的聚类:EM,SOM,COBWEB.

KD树:https://blog.csdn.net/app_12062011/article/details/51986805

KD树是一个对k维空间中的实例点进行存储以便对其进行快速检索的属性存储结构,kd树是二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于某一坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。

【19】EM算法和混合高斯模型(DMM):http://www.cnblogs.com/lifegoesonitself/archive/2013/05/19/3087143.html  

【20】EM原理,GMM原理,增大数据量是否会更好

(参考:https://www.cnblogs.com/txg198955/p/4097543.html)

假设每个聚类的数据都是符合高斯分布(又叫常态分布或者正态分布)的,当前数据呈现的分布就是各个聚类的分布叠加在一起。这种聚类方法得到的是每个样本点属于各个类的概率,而不是判定它完全属于一个类,所以有时也会被称为软聚类。

【21】为什么要使用拉普拉斯平滑?

零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。在文本分类的问题中,当一个词语没有在训练样本中出现,该词语调概率为0,使用连乘计算文本出现概率时也为0。这是不合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是0。


【22】各种算法的适用场景:https://www.zhihu.com/question/26726794

【23】PCA、SVD、LDA、LDI、LSI

PCA和SVD关系:https://www.cnblogs.com/fionacai/p/5846968.html(主要)

参考资料:[1] 奇异值分解(SVD)原理与在降维中的应用

                  [2] 主成分分析(PCA)原理总结

                  [3]SVD 降维体现在什么地方?

PCA使用方差度量了数据集的信息度,方差越大表示信息量越大,数据比较随机,信息熵越大;方差越小表示信息量小,数据比较统一,信息熵小;

PCA算法的主要优点有:

    1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响。 

    2)各主成分之间正交,可消除原始数据成分间的相互影响的因素。

    3)计算方法简单,主要运算是特征值分解、奇异值分解,易于实现。

    PCA算法的主要缺点有:

    1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。

    2)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。

隐性语义索引(简称LSI/LSA):https://blog.csdn.net/m0_37788308/article/details/78115313?locationNum=5&fps=1

SVD 及其在推荐系统中的应用:https://blog.csdn.net/u011412768/article/details/52972081

       1.SVD计算非常的耗时,尤其是我们的文本处理,词和文本数都是非常大的,对于这样的高维度矩阵做奇异值分解是非常难的。

  2.主题值的选取对结果的影响非常大,很难选择合适的k值。

  3.LSI得到的不是一个概率模型,缺乏统计基础,结果难以直观的解释。

  对于问题1,主题模型非负矩阵分解(NMF)可以解决矩阵分解的速度问题。

  对于问题2,大部分主题模型的主题的个数选取一般都是凭经验的,较新的层次狄利克雷过程(HDP)可以自动选择主题个数。

   对于问题3,人们整出了PLSI(也叫PLSA)和隐含狄利克雷分布(LDA)这类基于概率分布的主题模型来替代基于矩阵分解的主题模型。

  对于一些规模较小的问题,如果想快速粗粒度的找出一些主题分布的关系,则LSI是比较好的一个选择,其他时候,如果你需要使用主题模型,推荐使用LDA和HDP。

1.svd本身就是时间复杂度高的计算过程,如果数据量大的情况恐怕时间消耗无法忍受。不过可以使用梯度下降等机器学习的相关方法来进行近似计算,以减少时间消耗。

2.相似度计算方法的选择,有多种相似度计算方法,每种都有对应优缺点,对针对不同场景使用最适合的相似度计算方法。

3.推荐策略:首先是相似用户可以多个,每个由相似度作为权重来共同影响推荐的item的评分。

LDA(线性判别分析) :https://www.cnblogs.com/pinard/p/6244265.html

【24】常用的损失函数

       损失函数分为经验风险损失函数结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。通常表示为如下:

  • 0-1损失函数和绝对值损失函数

  0-1损失是指,预测值和目标值不相等为1,否则为0:

  感知机就是用的这种损失函数。但是由于相等这个条件太过严格,因此我们可以放宽条件,即满足时认为相等。

                                   

        绝对值损失函数:  

  • log对数损失函数

  Logistic回归的损失函数就是对数损失函数,在Logistic回归的推导中,它假设样本服从伯努利分布(0-1)分布,然后求得满足该分布的似然函数,接着用对数求极值。Logistic回归并没有求对数似然函数的最大值,而是把极大化当做一个思想,进而推导它的风险函数为最小化的负的似然函数。从损失函数的角度上,它就成为了log损失函数。

  log损失函数的标准形式: 

  在极大似然估计中,通常都是先取对数再求导,再找极值点,这样做是方便计算极大似然估计。损失函数L(Y,P(Y|X))是指样本X在标签Y的情况下,使概率P(Y|X)达到最大值(利用已知的样本分布,找到最大概率导致这种分布的参数值)。

  • 平方损失函数

  最小二乘法是线性回归的一种方法,它将回归的问题转化为了凸优化的问题。最小二乘法的基本原则是:最优拟合曲线应该使得所有点到回归直线的距离和最小。通常用欧式距离进行距离的度量。平方损失的损失函数为:

                                        

  • 指数损失函数

  AdaBoost就是一指数损失函数为损失函数的。

  指数损失函数的标准形式: 

  • Hinge损失函数

  Hinge loss用于最大间隔(maximum-margin)分类,其中最有代表性的就是支持向量机SVM。

       在支持向量机中,最初的SVM优化的函数如下:

                                     算法工程师面试准备_第20张图片

【8】无监督和有监督算法的区别? 

对比一 : 有标签 vs 无标签

有监督机器学习又被称为“有老师的学习”,所谓的老师就是标签。有监督的过程为先通过已知的训练样本(如已知输入和对应的输出)来训练,从而得到一个最优模型,再将这个模型应用在新的数据上,映射为输出结果。再经过这样的过程后,模型就有了预知能力。

而无监督机器学习被称为“没有老师的学习”,无监督相比于有监督,没有训练的过程,而是直接拿数据进行建模分析,意味着这些都是要通过机器学习自行学习探索。这听起来似乎有点不可思议,但是在我们自身认识世界的过程中也会用到无监督学习。比如我们去参观一个画展,我们对艺术一无所知,但是欣赏完多幅作品之后,我们也能把它们分成不同的派别。比如哪些更朦胧一点,哪些更写实一些。即使我们不知道什么叫做朦胧派和写实派,但是至少我们能把他们分为两个类。

对比二 : 分类 vs 聚类

有监督机器学习的核心是分类,无监督机器学习的核心是聚类(将数据集合分成由类似的对象组成的多个类)。有监督的工作是选择分类器和确定权值,无监督的工作是密度估计(寻找描述数据统计值),这意味着无监督算法只要知道如何计算相似度就可以开始工作。

对比三 : 同维 vs 降维

有监督的输入如果是n维,特征即被认定为n维,也即y=f(xi)或p(y|xi), i =n,通常不具有降维的能力。而无监督经常要参与深度学习,做特征提取,或者干脆采用层聚类或者项聚类,以减少数据特征的维度,使i

对比四 :分类同时定性 vs 先聚类后定性

有监督的输出结果,也就是分好类的结果会被直接贴上标签,是好还是坏。也即分类分好了,标签也同时贴好了。类似于中药铺的药匣,药剂师采购回来一批药材,需要做的只是把对应的每一颗药材放进贴着标签的药匣中。

无监督的结果只是一群一群的聚类,就像被混在一起的多种中药,一个外行要处理这堆药材,能做的只有把看上去一样的药材挑出来聚成很多个小堆。如果要进一步识别这些小堆,就需要一个老中医(类比老师)的指导了。因此,无监督属于先聚类后定性,有点类似于批处理。

对比五 :独立 vs 非独立

李航在其著作《统计学习方法》(清华大学出版社)中阐述了一个观点:对于不同的场景,正负样本的分布可能会存在偏移(可能是大的偏移,也可能偏移比较小)。好比我们手动对数据做标注作为训练样本,并把样本画在特征空间中,发现线性非常好,然而在分类面,总有一些混淆的数据样本。对这种现象的一个解释是,不管训练样本(有监督),还是待分类的数据(无监督),并不是所有数据都是相互独立分布的。或者说,数据和数据的分布之间存在联系。作为训练样本,大的偏移很可能会给分类器带来很大的噪声,而对于无监督,情况就会好很多。可见,独立分布数据更适合有监督,非独立数据更适合无监督。

对比六 : 不透明 vs 可解释性

由于有监督算法最后输出的一个结果,或者说标签。yes or no,一定是会有一个倾向。但是,如果你想探究为什么这样,有监督会告诉你:因为我们给每个字段乘以了一个参数列[w1, w2, w3...wn]。你继续追问:为什么是这个参数列?为什么第一个字段乘以了0.01而不是0.02?有监督会告诉你:这是我自己学习计算的!然后,就拒绝再回答你的任何问题。是的,有监督算法的分类原因是不具有可解释性的,或者说,是不透明的,因为这些规则都是通过人为建模得出,及其并不能自行产生规则。所以,对于像反洗钱这种需要明确规则的场景,就很难应用。而无监督的聚类方式通常是有很好的解释性的,你问无监督,为什么把他们分成一类?无监督会告诉你,他们有多少特征有多少的一致性,所以才被聚成一组。你恍然大悟,原来如此!于是,进一步可以讲这个特征组总结成规则。如此这般分析,聚类原因便昭然若揭了。

对比七 :DataVisor无监督独有的拓展性

试想这样一个n维模型,产出结果已经非常好,这时又增加了一维数据,变成了n+1维。那么,如果这是一个非常强的特征,足以将原来的分类或者聚类打散,一切可能需要从头再来,尤其是有监督,权重值几乎会全部改变。而DataVisor开发的无监督算法,具有极强的扩展性,无论多加的这一维数据的权重有多高,都不影响原来的结果输出,原来的成果仍然可以保留,只需要对多增加的这一维数据做一次处理即可。

总结(如何选择有监督和无监督)

      首先,我们查看现有的数据情况。假如在标签和训练数据都没有的情况下,毫无疑问无监督是最佳选项。但其实对数据了解得越充分,模型的建立就会越准确,学习需要的时间就会越短。我们主要应该了解数据的以下特性: 特征值是离散型变量还是连续型变量;特征值中是否存在缺失的值;何种原因造成缺失值;数据中是否存在异常值;某个特征发生的频率如何。

       其次,数据条件是否可改善?在实际应用中,有些时候即使我们没有现成的训练样本,我们也能够凭借自己的双眼,从待分类的数据中人工标注一些样本,这样就可以把条件改善,从而用于有监督学习。当然不得不说,有些数据的表达会非常隐蔽,也就是我们手头的信息不是抽象的形式,而是具体的一大堆数字,这样我们很难人工对它们进行分类。举个例子,在bag - of - words 模型中,我们采用k-means算法进行聚类,从而对数据投影。在这种情况下,我们之所以采用k-means,就是因为我们只有一大堆数据,而且是很高维的,若想通过人工把他们分成50类是十分困难的。想象一下,一个熊孩子把50个1000块的拼图混在了一起,你还能够再把这50000个凌乱的小方块区分开吗?所以说遇到这种情况也只能选用无监督学习了。

       最后,看样本是否独立分布。对于有训练样本的情况,看起来采用有监督总是比采用无监督好。但有监督学习就像是探索悬崖时的一个安全绳,有着一定的指导作用。就像是即使班级里的第一名,也非常需要标准答案来获得肯定,对吧?做完题对一下答案,总觉得会更安心一点。但对于非独立分布的数据,由于其数据可能存在内在的未知联系,因而存在某些偏移量,这个时候假如追求单一的“标准答案”反而会错失其数据背后隐藏关联。就像是做数学题,往往还有标准答案以外的其他解法。而在反欺诈的场景中,这些隐藏关联往往包含着一个未知地欺诈团伙活动。所以在反欺诈领域中无监督机器学习能实现更准确和广泛的欺诈检测。

你可能感兴趣的:(机器学习)