机器学习算法

机器学习模型概念

LR : 事件发生的对数几率是输入的线性函数

优点:

1)实现简单,广泛的应用于工业问题上;

2)计算代价不高,LR在时间和内存需求上相当高效。 

3)LR对于数据中小噪声的鲁棒性很好,并且不会受到轻微的多重共线性的特别影响。(严重的多重共线性则可以使用逻辑回归结合L2正则化来解决,但是若要得到一个简约模型,L2正则化并不是最好的选择,因为它建立的模型涵盖了全部的特征。) 

4)LR分类器适用数据类型:数值型和标称型数据。  

5)LR能以概率输出,权重可解释性强,越大越重要。

 缺点:1)当特征空间很大时,逻辑回归的性能不是很好;容易欠拟合,分类精度不高。

2)数据特征有缺失或者特征空间很大时表现效果并不好。

推广:多分类,softmax函数

LR与线性回归

逻辑回归(对数几率回归)也被称为广义线性回归模型 。线性回归做分类考虑了所有样本点到分类决策面的距离,导致两类数据分布不均匀时将误差非常大;LR和SVM克服了这个缺点,其中LR将所有数据采用sigmod函数进行了非线性映射,使得远离分类决策面的数据作用减弱;SVM直接去掉了远离分类决策面的数据,只考虑支持向量的影响。    

LR与SVM

都是线性分类器、监督学习算法、判别模型。1)思想不同。逻辑回归基于概率理论,假设样本为正样本的概率可以用sigmoid函数(S型函数)来表示,然后通过极大似然估计的方法估计出参数的值。  支持向量机基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面。2) 对数据和参数的敏感程度不同。SVM考虑分类边界线附近的样本(决定分类超平面的样本)。在支持向量外添加或减少任何样本点对分类决策面没有任何影响;  LR受所有数据点的影响。直接依赖数据分布,每个样本点都会影响决策面的结果。如果训练数据不同类别严重不平衡,则一般需要先对数据做平衡处理,让不同类别的样本尽量平衡。3)数据要求不同。SVM依赖数据表达的距离测度,所以需要对数据先做 normalization;LR不受其影响。4)细节上,SVM自带L2正则,LR需要手动添加正则项5) 处理非线性问题。SVM通过对少部分支持向量使用核函数是实现,LR也可以利用核函数,但是需要作用在所有数据上,计算更复杂。

为什么选用对数极大似然函数作为优化目标,用平方损失有什么问题。

其中最重要的一点就是为什么取-log函数为损失函数,损失函数的本质就是,如果我们预测对了,能够不惩罚,如果预测错误,会导致损失函数变得很大,也就是惩罚较大,而-log函数在【0,1】之间正好符合这一点,另外还有一点需要说明,LR是一种广义的线性回归模型,平方损失函数的话,对于Sigmoid函数求导计算,无法保证是凸函数,在优化的过程中,求得的解有可能是局部最小,不是全局的最优值。其二:取完对数之后,对我们的后续求导比较方便。如果根据似然函数,直接计算,有两点缺点:(1)不利于后续的求导,(2)似然函数的计算会导致下溢出。

SVM

SVM基于最大间隔法,分为线性可分支持向量机、线性支持向量机、非线性支持向量机。

线性可分支持向量机通过硬间隔最大化,线性支持向量机通过软间隔最大化,非线性支持向量机通过核技巧和软间隔最大化。高准确率,为避免过拟合提供了很好的理论保证,而且就算数据在原特征空间线性不可分,只要给个合适的核函数,它就能运行得很好。在动辄超高维的文本分类问题中特别受欢迎。可惜内存消耗大,难以解释,运行和调参也有些烦人,而随机森林却刚好避开了这些缺点,比较实用。

其优点:1)可以解决高维问题,即大型特征空间; 2)无需依赖整个数据,最优平面仅依赖支持向量;3)SVM优化自带L2正则项;4)SVM能处理非线性问题,通过核函数策略。计算量小。

缺点:1)SVM基于数据距离,所以需要对数据先做 normalization。2)无法给出概率结果。3)当观测样本很多时,效率并不是很高;一个可行的解决办法是模仿随机森林,对数据分解,训练多个模型,然后求平均,时间复杂度降低p倍,分多少份,降多少倍对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数;

核技巧:通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。高斯核:会将原始空间映射为无穷维空间,具有相当高的灵活性,也是使用最广泛的核函数之一。线性核首先文本数据。 对缺失数据敏感;对于核的选择也是有技巧的(libsvm中自带了四种核函数:线性核、多项式核、RBF以及sigmoid核):第一,如果样本数量小于特征数,那么就没必要选择非线性核,简单的使用线性核就可以了;第二,如果样本数量大于特征数目,这时可以使用非线性核,将样本映射到更高维度,一般可以得到更好的结果;第三,如果样本数目和特征数目相等,该情况可以使用非线性核,原理和第二种一样。对于第一种情况,也可以先对数据进行降维,然后使用非线性核,这也是一种方法。

解释核函数,给了张纸让画图解释高维映射

- 为什么要把原问题转换为对偶问题?因为原问题是凸二次规划问题,转换为对偶问题更加高效。

- 为什么求解对偶问题更加高效?因为只用求解alpha系数,而alpha系数只有支持向量才非0,其他全部为0.

- alpha系数有多少个?样本点的个数

KNN

KNN即最近邻算法,其主要过程为:1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等); 2. 对上面所有的距离值进行排序; 3. 选前k个最小距离的样本; 4. 根据这k个样本的标签进行投票,得到最后的分类类别; 如何选择一个最佳的K值,这取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值可通过各种启发式技术来获取,比如,交叉验证。

KNN算法的优点:理论成熟,思想简单,既可以用来做分类也可以用来做回归;可用于非线性分类;训练时间复杂度为O(n);对数据没有假设,准确度高,对outlier不敏感;

缺点:  1)数据储存量大(需要储存训练集中所有的样本);2.在预测时计算量大(需要计算到所有样本点的距离)3.容易对维度灾难敏感

讨论有关维度爆炸的问题

应用k-近邻算法的一个实践问题是,实例间的距离是根据实例的所有属性计算的。这与那些只选择全部实例属性的一个子集方法不同,例如决策树学习系统。 如果每个实例由20个属性描述,但是这些属性中仅仅2个属性与它的分类有关,这种情况,两个相关属性一致的实例可能在这个20维空间实例中相距很远,结果就是这些不相关属性会导致近邻间距离被支配。这种由于存在很多不相关属性所导致的难题,有时被称为维度灾难。

解决方法:
比较简单,就是计算距离的时候,对属性加权。这样就会减小不相关属性的影响。                                                        另一种方法是:从实例空间中完全消除最不相关属性,等效认为是对某个属性设置缩放因子为0。

PCA、LDA

①数据在低维下更容易处理、更容易使用;②相关特征,特别是重要特征更能在数据中明确的显示出来;如果只有两维或者三维的话,更便于可视化展示;③去除数据噪声④降低算法开销

标准差和方差一般是用来描述一维数据的,协方差就是一种用来度量两个随机变量关系的统计量。求出协方差矩阵的特征值及特征向量之后,按照特征值由大到小进行排列,这将给出成分的重要性级别。

决策树决策树处理连续值的方法;连续值处理:二分法(C4.5)ID3和C4.5的优缺点,树的融合(RF和GBDT) 

优点:1)决策树自身的优点计算简单,易于理解,可解释性强。决策树模型可以可视化,非常直观应用范围广,可用于分类和回归,而且非常容易做多类别的分类能够处理数值型和连续的样本特征;2)训练快速并且可调,无须担心要像支持向量机那样调一大堆参数;

缺点:1)不支持在线学习,于是在新样本到来后,决策树需要全部重建。2)很容易在训练数据中生成复杂的树结构,造成过拟合(overfitting)。剪枝可以缓解过拟合的负作用,常用方法是限制树的高度、叶子节点中的最少样本数量。实际中的决策树是基于启发式的贪心算法建立的,这种算法不能保证建立全局最优的决策树。Random Forest 引入随机能缓解这个问题。3)对于那些各类别样本数量不一致的数据,在决策树当中,信息增益的结果偏向于那些具有更多数值的特征(只要是使用了信息增益,都有这个缺点,如RF)。

决策树算法有哪些

ID3、C4.5、CART。

他们划分属性的准则不同。

ID3以信息增益为准则;C4.5以增益率为准则;CART以基尼指数为准则

Adaboosting

Adaboost是一种加和模型,每个模型都是基于上一次模型的错误率来建立的,过分关注分错的样本,而对正确分类的样本减少关注度,逐次迭代之后,可以得到一个相对较好的模型。是一种典型的boosting算法。

优点

adaboost是一种有很高精度的分类器。

可以使用各种方法构建子分类器,Adaboost算法提供的是框架。

当使用简单分类器时,计算出的结果是可以理解的,并且弱分类器的构造极其简单。

简单,不用做特征筛选。

不容易发生overfitting。

关于随机森林和GBDT等组合算法,参考这篇文章:机器学习-组合算法总结

缺点:对outlier比较敏感

 xgboost

这是一个近年来出现在各大比赛的大杀器,夺冠选手很大部分都使用了它。

高准确率高效率高并发,支持自定义损失函数,既可以用来分类又可以用来回归

可以像随机森林一样输出特征重要性,因为速度快,适合作为高维特征选择的一大利器

在目标函数中加入正则项,控制了模型的复杂程度,可以避免过拟合

支持列抽样,也就是随机选择特征,增强了模型的稳定性

对缺失值不敏感,可以学习到包含缺失值的特征的分裂方向

另外一个广受欢迎的原因是支持并行,速度杠杠的

用的好,你会发现他的全部都是优点。

XGBoost的发起人——陈天奇博士,他并不认可将深度学习和XGBoost截然对立起来。他谈到,这两种方法在其各自擅长领域的性能表现都非常好:XGBoost专注于模型的可解释性,而基于人工神经网络的深度学习,则更关注模型的准确度。XGBoost更适用于变量数较少的表格数据,而深度学习则更适用于图像或其他拥有海量变量的数据。不同的机器学习模型适用于不同类型的任务。深度神经网络通过对时空位置建模,能够很好地捕获图像、语音、文本等高维数据。而基于树模型的XGBoost则能很好地处理表格数据,同时还拥有一些深度神经网络所没有的特性(如:模型的可解释性、输入数据的不变性、更易于调参等)。

随机森林和GBDT的区别、RF,GBDT 的区别; GBDT,XgBoost的区别(烂大街的问题最好从底层原理去分析回答); 

模型组合+决策树相关的算法有两种比较基本的形式 - 随机森林与GBDT((Gradient Boost Decision Tree),其他的比较新的模型组合+决策树的算法都是来自这两种算法的延伸。本文主要侧重于GBDT,对于随机森林只是大概提提,因为它相对比较简单。

Bagging,Boosting,随机森林:集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能。

根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:

1)个体学习器间存在强大依赖关系、必须串行生成的序列化方法,代表算法:Boosting;

2)个体学习器间不存在依赖关系、可同时生成的并行化方法,代表算法Bagging和“随机森林”RF。

K-means 的原理,优缺点以及改进; EM与K-means的关系; 

关于K-Means聚类的文章,链接:机器学习算法-K-means聚类。关于K-Means的推导,里面有着很强大的EM思想。

优点

算法简单,容易实现 ;

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

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

缺点

对数据类型要求较高,适合数值型数据;

可能收敛到局部最小值,在大规模数据上收敛较慢

K值比较难以选取;

对初值的簇心值敏感,对于不同的初始值,可能会导致不同的聚类结果;

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

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

算法对比

在统计学中,一个模型好坏,是根据偏差和方差来衡量的

偏差:描述的是预测值(估计值)的期望E’与真实值Y之间的差距。偏差越大,越偏离真实数据。

方差:描述的是预测值的变化范围,离散程度,也就是离其期望值E的距离。方差越大,数据的分布越分散。

在统计学习框架下,大家刻画模型复杂度的时候,有这么个观点,认为Error = Bias + Variance。这里的Error大概可以理解为模型的预测错误率,是有两部分组成的,一部分是由于模型太简单而带来的估计不准确的部分(Bias)(欠拟合),另一部分是由于模型太复杂而带来的更大的变化空间和不确定性(Variance)(过拟合)。当模型复杂度上升的时候,偏差会逐渐变小,而方差会逐渐变大。

算法选择参考之前翻译过一些国外的文章,有一篇文章中给出了一个简单的算法选择技巧:首当其冲应该选择的就是逻辑回归,如果它的效果不怎么样,那么可以将它的结果作为基准来参考,在基础上与其他算法进行比较;然后试试决策树(随机森林)看看是否可以大幅度提升你的模型性能。即便最后你并没有把它当做为最终模型,你也可以使用随机森林来移除噪声变量,做特征选择;如果特征的数量和观测样本特别多,那么当资源和时间充足时(这个前提很重要),使用SVM不失为一种选择。通常情况下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,现在深度学习很热门,很多领域都用到,它是以神经网络为基础的,目前我自己也在学习,只是理论知识不是很厚实,理解的不够深,这里就不做介绍了。算法固然重要,但好的数据却要优于好的算法,设计优良特征是大有裨益的。假如你有一个超大数据集,那么无论你使用哪种算法可能对分类性能都没太大影响(此时就可以根据速度和易用性来进行抉择)。

神经网络

人工神经网络的优点:分类的准确度高;并行分布处理能力强,分布存储及学习能力强,对噪声神经有较强的鲁棒性和容错能力,能充分逼近复杂的非线性关系;具备联想记忆的功能。

人工神经网络的缺点:神经网络需要大量的参数,如网络拓扑结构、权值和阈值的初始值;不能观察之间的学习过程,输出结果难以解释,会影响到结果的可信度和可接受程度;学习时间过长,甚至可能达不到学习的目的。

BP神经网络。反向传播的细节.梯度弥散问题。

sigmoid函数的应用有哪些,为什么?

作为激活函数,增加非线性能力。

Sigmoid函数的值域范围限制在(0,1)之间,我们知道[0,1]与概率值的范围是相对应的,这样sigmoid函数就能与一个概率分布联系起来了。

Sigmoid函数的导数是其本身的函数,即f′(x)=f(x)(1−f(x))f′(x)=f(x)(1−f(x)),计算非常方便,也非常节省计算时间。

列举十种常用的神经网络模型

受限玻尔兹曼机(RBM:Restricted Boltzmann machines)、自编码机(AE)、稀疏自编码机(SAE)、深度信念网络(DBN)、卷积神经网络(CNN)、生成式对抗网络(GAN)、循环神经网络(RNN)、长短期记忆(LSTM)、深度残差网络(DRN)、门循环单元(GRU)

卷积神经网络中卷积如何实现,激活函数的意义,损失函数有哪些,初始化参数如何选择

在生物意义上的神经元中,只有前面的树突传递的信号的加权和值大于某一个特定的阈值的时候,后面的神经元才会被激活。简单的说激活函数的意义在于判定每个神经元的输出 。

sigmoid的问题:

1.Sigmoid 容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中可以看出梯度的趋势。这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新**,我们就无法递归地学习到输入数据了。另外,你需要尤其注意参数的初始值来尽量避免这一情况。如果你的初始值很大的话,大部分神经元可能都会处在饱和的状态而把梯度kill掉,这会导致网络变的很难学习。对于这一点,我个人的理解就是对于数据特别小的时候,梯度确实应该接近0(等于0就不好了),理由如上所述,数据特别大的时候,梯度不应该接近0。就像Relu函数做的那样。

2.Sigmoid 的输出不是0均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in f=wTx+b),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。(如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。)

使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(如上图右)。有人说这是因为它是linear,而且梯度不会饱和。ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。

7.2随机初始化仍然希望参数期望接近1随机参数服从高斯分布或均匀分布进行初始化

TensorFlow中的session是什么,session和interactivesession的区别

graph只是定义了计算,他本身不计算任何东西,他不保存任何值,他只是定义了你用代码所规定的操作              session允许计算图或者图的一部分,他为这个分配资源并且保存中间结果的值和变量

tf.InteractiveSession():它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利,比如使用IPython。tf.Session():需要在启动session之前构建整个计算图,然后启动该计算图。意思就是在我们使用tf.InteractiveSession()来构建会话的时候,我们可以先构建一个session然后再定义操作(operation),如果我们使用tf.Session()来构建会话我们需要在会话构建之前定义好全部的操作(operation)然后再构建会话。

Python的数据结构有哪些

list tuple dict set

问了loss优化方法,说了BGD,SGD,各自优缺点,优化方向(Adam之类的)

BGD(batch gradient descent):优点: 由于每一步都利用了训练集中的所有数据,因此当损失函数达到最小值以后,能够保证此时计算出的梯度为0,换句话说,就是能够收敛.因此,使用BGD时不需要逐渐减小学习速率缺点: 由于每一步都要使用所有数据,因此随着数据集的增大,运行速度会越来越慢.

SGD(Stochastic Gradient Descent ) :训练速度快,对于很大的数据集,也能够以较快的速度收敛.缺点: 由于是抽取,因此不可避免的,得到的梯度肯定有误差.因此学习速率需要逐渐减小.否则模型无法收敛 因为误差,所以每一次迭代的梯度受抽样的影响比较大,也就是说梯度含有比较大的噪声,不能很好的反映真实梯度.

mini-batch Gradient Descent:虽然相较于批量梯度下降和随机梯度下降方法效果有所改善但是任然存在许多挑战: 1. 难以选择合适的学习速率:如果学习速率选择过小会造成网络收敛太慢,但是设得太大可能使得损失函数在最小点周围不断摇摆而永远达不到最小点; 2. 可以在训练开始时设置一个较大地学习率然后每训练若干个周期后按比例降低学习率,虽然这个方法有一些作用,但是由于降低学习率的周期是人为事先设定的,所以它不能很好地适应数据内在的规律; 3. 另一方面,我们对特征向量中的所有的特征都采用了相同的学习率,如果训练数据十分稀疏并且不同特征的变化频率差别很大,这时候对变化频率慢得特征采用大的学习率而对变化频率快的特征采用小的学习率是更好的选择。 4. 这些梯度下降方法难以逃脱”鞍点”, 如下图所示,鞍点既不是最大点也不是最小点,在这个点附近,所有方向上的梯度都接近于0,这些梯度下降算法很难逃离它。

 交叉验证问题 

什么是交叉验证法?

它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。为什么用交叉验证法?

交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。还可以从有限的数据中获取尽可能多的有效信息。k 折交叉验证(k-fold cross validation)通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感。第一步,不重复抽样将原始数据随机分为 k 份。第二步,每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。第三步,重复第二步 k 次,这样每个子集都有一次机会作为测试集,其余机会作为训练集。在每个训练集上训练后得到一个模型,用这个模型在相应的测试集上测试,计算并保存模型的评估指标,第四步,计算 k 组测试结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。

L1与L2的作用,区别以及如何解决L1求导困难;L1为什么能让参数稀疏,L2为什么会让参数趋于较小值,L1优化方法

当你想从一个手头的数据集中学习出一套规则时,贝叶斯学派认为仅仅使用这些数据是不够的,还需要加入先验知识。如果你在损失函数中使用了L1正则项,那么其实质就是加入了拉普拉斯先验分布,即认为数据是符合拉普拉斯分布的;如果你使用了L2正则项,那么就是加入了高斯先验分布,即认为数据是符合高斯分布的。

如何用尽可能少的样本训练模型同时又保证模型的性能; 

fine-tune

机器学习性能评价,准确率,召回率,ROC 

判别模型与生成模型的本质区别是什么

交叉熵loss推到

推荐阅读更多精彩内容