Py学习  »  机器学习算法

深度学习机器学习面试问题准备(必会)

大数据挖掘DT数据分析 • 5 年前 • 866 次点击  

 向AI转型的程序员都关注了这个号👇👇👇


大数据挖掘DT数据分析  公众号: datadw


第一部分:深度学习

1、神经网络基础问题

(1)Backpropagation(要能推倒) 
  后向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这称为对称失效。 
大致过程是:

  • 首先前向传导计算出所有节点的激活值和输出值, 

  • 计算整体损失函数: 


  • 然后针对第L层的每个节点计算出残差(这里是因为UFLDL中说的是残差,本质就是整体损失函数对每一层激活值Z的导数),所以要对W求导只要再乘上激活函数对W的导数即可 






(2)梯度消失、梯度爆炸 
  梯度消失:这本质上是由于激活函数的选择导致的, 最简单的sigmoid函数为例,在函数的两端梯度求导结果非常小(饱和区),导致后向传播过程中由于多次用到激活函数的导数值使得整体的乘积梯度结果变得越来越小,也就出现了梯度消失的现象。 



  梯度爆炸:同理,出现在激活函数处在激活区,而且权重W过大的情况下。但是梯度爆炸不如梯度消失出现的机会多。 
   
(3)常用的激活函数

激活函数公式缺点优点
Sigmoidσ(x)=1/(1+ex)" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">σ(x)=1/(1+ex)σ(x)=1/(1+ex)
1、会有梯度弥散
2、不是关于原点对称
3、计算exp比较耗时
-
Tanhtanh(x)=2σ(2x)1 " role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">tanh(x)=2σ(2x)−1tanh(x)=2σ(2x)1
梯度弥散没解决1、解决了原点对称问题
2、比sigmoid更快
ReLUf(x)=max(0,x)" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">f(x)=max(0, x)f(x)=max(0,x)
梯度弥散没完全解决,在(-)部分相当于神经元死亡而且不会复活1、解决了部分梯度弥散问题
2、收敛速度更快
Leaky ReLUf(x)=1(x<0)(αx)+1(x>=0)(x)" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">f(x)=1(x<0)(αx)+1(x>=0)(x )f(x)=1(x<0)(αx)+1(x>=0)(x)
-解决了神经死亡问题
Maxoutmax(w1Tx+b1,w2Tx+b2)" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">max(wT1x+b1,w T2x+b2)max(w1Tx+b1,w2Tx+b2)
参数比较多,本质上是在输出结果上又增加了一层克服了ReLU的缺点,比较提倡使用

(4)参数更新方法

方法名称公式
Vanilla updatex += - learning_rate * dx
Momentum update动量更新v = mu * v - learning_rate * dx # integrate velocity
x += v # integrate position

Nesterov Momentumx_ahead = x + mu * v 
v = mu * v - learning_rate * dx_ahead
x += v

Adagrad 
(自适应的方法,梯度大的方向学习率越来越小,由快到慢)
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)

Adamm = beta1*m + (1-beta1)dx
v = beta2*v + (1-beta2)
(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)



(5)解决overfitting的方法 
  dropout, regularization, batch normalizatin,但是要注意dropout只在训练的时候用,让一部分神经元随机失活。 
  Batch normalization是为了让输出都是单位高斯激活,方法是在连接和激活函数之间加入BatchNorm层,计算每个特征的均值和方差进行规则化。 
  

2、CNN问题

(1) 思想 
  改变全连接为局部连接,这是由于图片的特殊性造成的(图像的一部分的统计特性与其他部分是一样的),通过局部连接和参数共享大范围的减少参数值。可以通过使用多个filter来提取图片的不同特征(多卷积核)。 
   
(2)filter尺寸的选择 
  通常尺寸多为奇数(1,3,5,7) 
   
(3)输出尺寸计算公式 
  输出尺寸=(N - F +padding*2)/stride + 1 
  步长可以自由选择通过补零的方式来实现连接。 
   
(4)pooling池化的作用 
  虽然通过.卷积的方式可以大范围的减少输出尺寸(特征数),但是依然很难计算而且很容易过拟合,所以依然利用图片的静态特性通过池化的方式进一步减少尺寸。 
   
(5)常用的几个模型,这个最好能记住模型大致的尺寸参数。

名称特点
LeNet5–没啥特点-不过是第一个CNN应该要知道
AlexNet引入了ReLU和dropout,引入数据增强、池化相互之间有覆盖,三个卷积一个最大池化+三个全连接层
VGGNet采用1*1和3*3的卷积核以及2*2的最大池化使得层数变得更深。常用VGGNet-16和VGGNet19
Google Inception Net
我称为盗梦空间网络
这个在控制了计算量和参数量的同时,获得了比较好的分类性能,和上面相比有几个大的改进:
  1、去除了最后的全连接层,而是用一个全局的平均池化来取代它;
  2、引入Inception Module,这是一个4个分支结合的结构。所有的分支都用到了1*1的卷积,这是因为1*1性价比很高,可以用很少的参数达到非线性和特征变换。
  3、Inception V2第二版将所有的5*5变成2个3*3,而且提出来著名的Batch Normalization;
  4、Inception V3第三版就更变态了,把较大的二维卷积拆成了两个较小的一维卷积,加速运算、减少过拟合,同时还更改了Inception Module的结构。
微软ResNet残差神经网络(Residual Neural Network)1、引入高速公路结构,可以让神经网络变得非常深
2、ResNet第二个版本将ReLU激活函数变成y=x的线性函数

2、RNN

1、RNN原理: 
  在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward+Neural+Networks)。而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出。所以叫循环神经网络 
2、RNN、LSTM、GRU区别

  • RNN引入了循环的概念,但是在实际过程中却出现了初始信息随时间消失的问题,即长期依赖(Long-Term Dependencies)问题,所以引入了LSTM。

  • LSTM:因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。推导forget gate,input gate,cell state, hidden information等因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸的变化是关键,下图非常明确适合记忆: 

  • GRU是LSTM的变体,将忘记门和输入们合成了一个单一的更新门。 

3、LSTM防止梯度弥散和爆炸 
  LSTM用加和的方式取代了乘积,使得很难出现梯度弥散。但是相应的更大的几率会出现梯度爆炸,但是可以通过给梯度加门限解决这一问题。 
   
4、引出word2vec 
  这个也就是Word Embedding,是一种高效的从原始语料中学习字词空间向量的预测模型。分为CBOW(Continous Bag of Words)和Skip-Gram两种形式。其中CBOW是从原始语句推测目标词汇,而Skip-Gram相反。CBOW可以用于小语料库,Skip-Gram用于大语料库。具体的就不是很会了。




3、GAN

1、GAN的思想 
  GAN结合了生成模型和判别模型,相当于矛与盾的撞击。生成模型负责生成最好的数据骗过判别模型,而判别模型负责识别出哪些是真的哪些是生成模型生成的。但是这些只是在了解了GAN之后才体会到的,但是为什么这样会有效呢? 
  假设我们有分布Pdata(x),我们希望能建立一个生成模型来模拟真实的数据分布,假设生成模型为Pg(x;θ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">θθ),我们的目的是求解θ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">θθ的值,通常我们都是用最大似然估计。但是现在的问题是由于我们相用NN来模拟Pdata(x),但是我们很难求解似然函数,因为我们没办法写出生成模型的具体表达形式,于是才有了GAN,也就是用判别模型来代替求解最大似然的过程。 
  在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。这样我们的目的就达成了:我们得到了一个生成式的模型G,它可以用来生成图片。

2、GAN的表达式 
 
  通过分析GAN的表达可以看出本质上就是一个minmax问题。其中V(D, G)可以看成是生成模型和判别模型的差异,而minmaxD说的是最大的差异越小越好。这种度量差异的方式实际上叫做Jensen-Shannon divergence。 
3、GAN的实际计算方法 
  因为我们不可能有Pdata(x)的分布,所以我们实际中都是用采样的方式来计算差异(也就是积分变求和)。具体实现过程如下: 
 
有几个关键点:判别方程训练K次,而生成模型只需要每次迭代训练一次,先最大化(梯度上升)再最小化(梯度下降)。 
  但是实际计算时V的后面一项在D(x)很小的情况下由于log函数的原因会导致更新很慢,所以实际中通常将后一项的log(1-D(x))变为-logD(x)。 
  实际计算的时候还发现不论生成器设计的多好,判别器总是能判断出真假,也就是loss几乎都是0,这可能是因为抽样造成的,生成数据与真实数据的交集过小,无论生成模型多好,判别模型也能分辨出来。解决方法有两个:1、用WGAN 2、引入随时间减少的噪声

4、对GAN有一些改进有引入f-divergence,取代Jensen-Shannon divergence,还有很多,这里主要介绍WGAN

5、WGAN 
  上面说过了用f-divergence来衡量两个分布的差异,而WGAN的思路是使用Earth Mover distance (挖掘机距离 Wasserstein distance)。



第二部分、机器学习准备

1、决策树树相关问题

(1)各种熵的计算 
  熵、联合熵、条件熵、交叉熵、KL散度(相对熵)

  • 熵用于衡量不确定性,所以均分的时候熵最大

  • KL散度用于度量两个分布的不相似性,KL(p||q)等于交叉熵H(p,q)-熵H(p)。交叉熵可以看成是用q编码P所需的bit数,减去p本身需要的bit数,KL散度相当于用q编码p需要的额外bits。

  • 交互信息Mutual information :I(x,y) = H(x)-H(x|y) = H(y)-H(y|x) 表示观察到x后,y的熵会减少多少。

(2)常用的树搭建方法:ID3、C4.5、CART 
  上述几种树分别利用信息增益、信息增益率、Gini指数作为数据分割标准。

  • 其中信息增益衡量按照某个特征分割前后熵的减少程度,其实就是上面说的交互信息。 

  • 用上述信息增益会出现优先选择具有较多属性的特征,毕竟分的越细的属性确定性越高。所以提出了信息增益率的概念,让含有较多属性的特征的作用降低。 

  • CART树在分类过程中使用的基尼指数Gini,只能用于切分二叉树,而且和ID3、C4.5树不同,Cart树不会在每一个步骤删除所用特征。 

(3)防止过拟合:剪枝 
  剪枝分为前剪枝和后剪枝,前剪枝本质就是早停止,后剪枝通常是通过衡量剪枝后损失函数变化来决定是否剪枝。后剪枝有:错误率降低剪枝、悲观剪枝、代价复杂度剪枝

(4)前剪枝的几种停止条件

  • 节点中样本为同一类

  • 特征不足返回多类

  • 如果某个分支没有值则返回父节点中的多类

  • 样本个数小于阈值返回多类

2、逻辑回归相关问题

(1)公式推导一定要会

(2)逻辑回归的基本概念 
  这个最好从广义线性模型的角度分析,逻辑回归是假设y服从Bernoulli分布。

(3)L1-norm和L2-norm 
  其实稀疏的根本还是在于L0-norm也就是直接统计参数不为0的个数作为规则项,但实际上却不好执行于是引入了L1-norm;而L1norm本质上是假设参数先验是服从Laplace分布的,而L2-norm是假设参数先验为Gaussian分布,我们在网上看到的通常用图像来解答这个问题的原理就在这。 
  但是L1-norm的求解比较困难,可以用坐标轴下降法或是最小角回归法求解。

(4)LR和SVM对比 
  首先,LR和SVM最大的区别在于损失函数的选择,LR的损失函数为Log损失(或者说是逻辑损失都可以)、而SVM的损失函数为hinge loss。 
 
  其次,两者都是线性模型。 
  最后,SVM只考虑支持向量(也就是和分类相关的少数点) 
   
(5)LR和随机森林区别 
  随机森林等树算法都是非线性的,而LR是线性的。LR更侧重全局优化,而树模型主要是局部的优化。 
   
(6)常用的优化方法 
  逻辑回归本身是可以用公式求解的,但是因为需要求逆的复杂度太高,所以才引入了梯度下降算法。 
  一阶方法:梯度下降、随机梯度下降、mini 随机梯度下降降法。随机梯度下降不但速度上比原始梯度下降要快,局部最优化问题时可以一定程度上抑制局部最优解的发生。 
  二阶方法:牛顿法、拟牛顿法: 
  这里详细说一下牛顿法的基本原理和牛顿法的应用方式。牛顿法其实就是通过切线与x轴的交点不断更新切线的位置,直到达到曲线与x轴的交点得到方程解。在实际应用中我们因为常常要求解凸优化问题,也就是要求解函数一阶导数为0的位置,而牛顿法恰好可以给这种问题提供解决方法。实际应用中牛顿法首先选择一个点作为起始点,并进行一次二阶泰勒展开得到导数为0的点进行一个更新,直到达到要求,这时牛顿法也就成了二阶求解问题,比一阶方法更快。我们常常看到的x通常为一个多维向量,这也就引出了Hessian矩阵的概念(就是x的二阶导数矩阵)。缺点:牛顿法是定长迭代,没有步长因子,所以不能保证函数值稳定的下降,严重时甚至会失败。还有就是牛顿法要求函数一定是二阶可导的。而且计算Hessian矩阵的逆复杂度很大。 
拟牛顿法: 不用二阶偏导而是构造出Hessian矩阵的近似正定对称矩阵的方法称为拟牛顿法。拟牛顿法的思路就是用一个特别的表达形式来模拟Hessian矩阵或者是他的逆使得表达式满足拟牛顿条件。主要有DFP法(逼近Hession的逆)、BFGS(直接逼近Hession矩阵)、 L-BFGS(可以减少BFGS所需的存储空间)。

3、SVM相关问题

(1)带核的SVM为什么能分类非线性问题? 
  核函数的本质是两个函数的內积,而这个函数在SVM中可以表示成对于输入值的高维映射。注意核并不是直接对应映射,核只不过是一个內积 
   
(2)RBF核一定是线性可分的吗 
  不一定,RBF核比较难调参而且容易出现维度灾难,要知道无穷维的概念是从泰勒展开得出的。 
   
(3)常用核函数及核函数的条件: 
  核函数选择的时候应该从线性核开始,而且在特征很多的情况下没有必要选择高斯核,应该从简单到难的选择模型。我们通常说的核函数指的是正定和函数,其充要条件是对于任意的x属于X,要求K对应的Gram矩阵要是半正定矩阵。

  • RBF核径向基,这类函数取值依赖于特定点间的距离,所以拉普拉斯核其实也是径向基核。

  • 线性核:主要用于线性可分的情况

  • 多项式核

(4)SVM的基本思想: 
  间隔最大化来得到最优分离超平面。方法是将这个问题形式化为一个凸二次规划问题,还可以等价位一个正则化的合页损失最小化问题。SVM又有硬间隔最大化和软间隔SVM两种。这时首先要考虑的是如何定义间隔,这就引出了函数间隔和几何间隔的概念(这里只说思路),我们选择了几何间隔作为距离评定标准( 为什么要这样,怎么求出来的要知道),我们希望能够最大化与超平面之间的几何间隔x,同时要求所有点都大于这个值,通过一些变化就得到了我们常见的SVM表达式。接着我们发现定义出的x只是由个别几个支持向量决定的。对于原始问题(primal problem)而言,可以利用凸函数的函数包来进行求解,但是发现如果用对偶问题(dual )求解会变得更简单,而且可以引入核函数。而原始问题转为对偶问题需要满足KKT条件(这个条件应该细细思考一下)到这里还都是比较好求解的。因为我们前面说过可以变成软间隔问题,引入了惩罚系数,这样还可以引出hinge损失的等价形式(这样可以用梯度下降的思想求解SVM了)。我个人认为难的地方在于求解参数的SMO算法。

(5)是否所有的优化问题都可以转化为对偶问题: 
这个问题我感觉非常好,有了强对偶和弱对偶的概念。用知乎大神的解释吧 


(6)处理数据偏斜: 
  可以对数量多的类使得惩罚系数C越小表示越不重视,相反另数量少的类惩罚系数变大。

4、Boosting和Bagging

(1)随机森林 
  随机森林改变了决策树容易过拟合的问题,这主要是由两个操作所优化的:1、Boostrap从袋内有放回的抽取样本值2、每次随机抽取一定数量的特征(通常为sqr(n))。 
  分类问题:采用Bagging投票的方式选择类别频次最高的 
  回归问题:直接取每颗树结果的平均值。

常见参数误差分析优点缺点
1、树最大深度
2、树的个数 
3、节点上的最小样本数
4、特征数(sqr(n))
oob(out-of-bag)
将各个树的未采样样本作为预测样本统计误差作为误分率
可以并行计算
不需要特征选择
可以总结出特征重要性
可以处理缺失数据
不需要额外设计测试集
在回归上不能输出连续结果

(2)Boosting之AdaBoost 
  Boosting的本质实际上是一个加法模型,通过改变训练样本权重学习多个分类器并进行一些线性组合。而Adaboost就是加法模型+指数损失函数+前项分布算法。Adaboost就是从弱分类器出发反复训练,在其中不断调整数据权重或者是概率分布,同时提高前一轮被弱分类器误分的样本的权值。最后用分类器进行投票表决(但是分类器的重要性不同)。 
   
(3)Boosting之GBDT 
  将基分类器变成二叉树,回归用二叉回归树,分类用二叉分类树。和上面的Adaboost相比,回归树的损失函数为平方损失,同样可以用指数损失函数定义分类问题。但是对于一般损失函数怎么计算呢?GBDT(梯度提升决策树)是为了解决一般损失函数的优化问题,方法是用损失函数的负梯度在当前模型的值来模拟回归问题中残差的近似值。 
  注:由于GBDT很容易出现过拟合的问题,所以推荐的GBDT深度不要超过6,而随机森林可以在15以上。 
   
(4)GBDT和Random Forest区别 
这个就和上面说的差不多。

(5)Xgboost 
这个工具主要有以下几个特点:

  • 支持线性分类器

  • 可以自定义损失函数,并且可以用二阶偏导

  • 加入了正则化项:叶节点数、每个叶节点输出score的L2-norm

  • 支持特征抽样

  • 在一定情况下支持并行,只有在建树的阶段才会用到,每个节点可以并行的寻找分裂特征。

5、KNN和Kmean

(1)KNN 和Kmean缺点 
  都属于惰性学习机制,需要大量的计算距离过程,速度慢的可以(但是都有相应的优化方法)。 
(2)KNN 
  KNN不需要进行训练,只要对于一个陌生的点利用离其最近的K个点的标签判断其结果。KNN相当于多数表决,也就等价于经验最小化。而KNN的优化方式就是用Kd树来实现。 
(3)Kmean 
  要求自定义K个聚类中心,然后人为的初始化聚类中心,通过不断增加新点变换中心位置得到最终结果。Kmean的缺点可以用Kmean++方法进行一些解决(思想是使得初始聚类中心之间的距离最大化)

6、EM算法、HMM、CRF

  这三个放在一起不是很恰当,但是有互相有关联,所以就放在这里一起说了。注意重点关注算法的思想。 
(1)EM算法 
  EM算法是用于含有隐变量模型的极大似然估计或者极大后验估计,有两步组成:E步,求期望(expectation);M步,求极大(maxmization)。本质上EM算法还是一个迭代算法,通过不断用上一代参数对隐变量的估计来对当前变量进行计算,直到收敛。 
  注意:EM算法是对初值敏感的,而且EM是不断求解下界的极大化逼近求解对数似然函数的极大化的算法,也就是说EM算法不能保证找到全局最优值。对于EM的导出方法也应该掌握。 
(2)HMM算法 
  隐马尔可夫模型是用于标注问题的生成模型。有几个参数(π" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;"> ππ,A,B):初始状态概率向量π" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">ππ,状态转移矩阵A,观测概率矩阵B。称为马尔科夫模型的三要素。 
马尔科夫三个基本问题:

  • 概率计算问题:给定模型和观测序列,计算模型下观测序列输出的概率。–》前向后向算法

  • 学习问题:已知观测序列,估计模型参数,即用极大似然估计来估计参数。–》Baum-Welch(也就是EM算法)和极大似然估计。

  • 预测问题:已知模型和观测序列,求解对应的状态序列。–》近似算法(贪心算法)和维比特算法(动态规划求最优路径)

(3)条件随机场CRF 
  给定一组输入随机变量的条件下另一组输出随机变量的条件概率分布密度。条件随机场假设输出变量构成马尔科夫随机场,而我们平时看到的大多是线性链条随机场,也就是由输入对输出进行预测的判别模型。求解方法为极大似然估计或正则化的极大似然估计。 
  之所以总把HMM和CRF进行比较,主要是因为CRF和HMM都利用了图的知识,但是CRF利用的是马尔科夫随机场(无向图),而HMM的基础是贝叶斯网络(有向图)。而且CRF也有:概率计算问题、学习问题和预测问题。大致计算方法和HMM类似,只不过不需要EM算法进行学习问题。

(4)HMM和CRF对比 
  其根本还是在于基本的理念不同,一个是生成模型,一个是判别模型,这也就导致了求解方式的不同。 
  

7、常见基础问题

(1)数据归一化(或者标准化,注意归一化和标准化不同)的原因 
  要强调:能不归一化最好不归一化,之所以进行数据归一化是因为各维度的量纲不相同。而且需要看情况进行归一化。

  • 有些模型在各维度进行了不均匀的伸缩后,最优解与原来不等价(如SVM)需要归一化。

  • 有些模型伸缩有与原来等价,如:LR则不用归一化,但是实际中往往通过迭代求解模型参数,如果目标函数太扁(想象一下很扁的高斯模型)迭代算法会发生不收敛的情况,所以最坏进行数据归一化。

补充:其实本质是由于loss函数不同造成的,SVM用了欧拉距离,如果一个特征很大就会把其他的维度dominated。而LR可以通过权重调整使得损失函数不变。

(2)衡量分类器的好坏: 
  这里首先要知道TP、FN(真的判成假的)、FP(假的判成真)、TN四种(可以画一个表格)。 
几种常用的指标:

  • 精度precision = TP/(TP+FP) = TP/~P (~p为预测为真的数量)

  • 召回率 recall = TP/(TP+FN) = TP/ P

  • F1值: 2/F1 = 1/recall + 1/precision

  • ROC曲线:ROC空间是一个以伪阳性率(FPR,false positive rate)为X轴,真阳性率(TPR, true positive rate)为Y轴的二维坐标系所代表的平面。其中真阳率TPR = TP / P = recall, 伪阳率FPR = FP / N

(3)SVD和PCA 
  PCA的理念是使得数据投影后的方差最大,找到这样一个投影向量,满足方差最大的条件即可。而经过了去除均值的操作之后,就可以用SVD分解来求解这样一个投影向量,选择特征值最大的方向。

(4)防止过拟合的方法 
  过拟合的原因是算法的学习能力过强;一些假设条件(如样本独立同分布)可能是不成立的;训练样本过少不能对整个空间进行分布估计。 
  处理方法:

  • 早停止:如在训练中多次迭代后发现模型性能没有显著提高就停止训练

  • 数据集扩增:原有数据增加、原有数据加随机噪声、重采样

  • 正则化

  • 交叉验证

  • 特征选择/特征降维

(5)数据不平衡问题 
  这主要是由于数据分布不平衡造成的。解决方法如下:

  • 采样,对小样本加噪声采样,对大样本进行下采样

  • 进行特殊的加权,如在Adaboost中或者SVM中

  • 采用对不平衡数据集不敏感的算法

  • 改变评价标准:用AUC/ROC来进行评价

  • 采用Bagging/Boosting/ensemble等方法

  • 考虑数据的先验分布



机器学习面试问题准备(进阶)


这部分主要是针对上面问题的一些更细节的补充,包括公式的推倒思路、模型的基本构成、细节问题的分析等等。


一、问题杂烩

1、PCA的第二主成分 
第二个主成分时域第一成分方向正教的差异性次大方向。 
2、什么时候用组合的学习模型 
只有当各个模型之间没有相关性的时候组合起来是最好用的。但是一般来说,弱相关的模型组合比较好用。 
3、多重共线性 
多重共线性是指当两个特征的相关性很大的时候,会对参数模型造成非常大的影响。可以用相关分析判断多重共线性的存在性。 
4、什么时候用L2优于L1 
如果多个变量都是一些具有小尺度或中等尺度影响的时候用L2比较好,如果个别变量影响很大的时候用L1。其实也可以结合起来使用。 
5、交叉验证的参数选择问题 
我们通常进行参数选择的时候都是用网格法做的,但是这样其实也是有弊端的,索性可以用随机取样的方式逼近最优参数。 
6、如果缺失值超过30%要怎么办? 
可以把缺失值单独组成一类。


二、模型流程和公式推导

1、PCA传统计算流程:

  1. 去除均值

  2. 计算协方差矩阵

  3. 计算特征值和特征向量

  4. 特征值从大到小排序

  5. 保留前N个特征向量

  6. 投影重构(记得吧去除的均值还回去)

或者干脆去均值后用SVD计算

2、离散数据下的生成模型 
(1)贝叶斯概念 
我们都知道概率学派和贝叶斯学派的不同,现在我们从贝叶斯的角度上考虑问题。对于一个问题,通常要考虑其先验概率,这是因为对于某些数据不足或有某些问题的情况下,单纯考虑似然函数是不够的,还需要引入假设先验给一个主观的先验概率,而且在真正分析的时候应该引入假设空间D的概念(满足要求的所有假设),后验就相当于给定假设空间D下的其中某一个假设D的概率P(h|D)。 
其实本质上最大后验估计MAP是等价于最大似然估计的,即数据点足够多的时候会淹没先验。 
利用得到的后验进行预测需要后验预测分布(Posterior pordictive distribution),方法是对每一个独立假设的加权均值(称之为Bayes model averaging) 
我们使用MAP的时候都要对先验进行一些假设,而这些假设对应的先验函数和似然函数通常是共轭的,这样方便计算,关于共轭分布的概念其实很简单,常用的几个了解就可以。 
(2)朴素贝叶斯分类器 
朴素贝叶斯是最简单的分类器之一了,根本是假设各个特征之间是独立同分布的,也就是说P(X|y)=P(x1|y)*…P(xn|y)。我们可以假设特征x的分布,比如:在特征为real-value的时候,可以假设特征分布为高斯分布、在特征为二元特征的时候假设为Bernoulli分布、在类别特征的时候假设为multinoulli分布(我们通常见到的)。通常我们看到的Laplace平滑实际上是对参数的先验分布(但是这个先验可以只看出一个附加条件)。 
具体的关于朴素贝叶斯的推导和使用见这里。补充一点,贝叶斯是可以进行在线学习的。但是要知道贝叶斯其实可以变得更复杂。

3、Gaussian高斯模型的高斯判别分析 
对于多元高斯分布来说,他的共轭分布也是多元高斯分布,关于多元高斯分布的最大似然结果可以自己查查资料。这里主要说的是高斯判别分析。 
高斯判别分析假设p(X,y=c,θ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">θθ)= N(X|μ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">μμ,Σ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">Σ Σ )服从多元高斯分布,当Σ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; word-break: break-all;">ΣΣ为对角矩阵的时候起始就是上面说的朴素贝叶斯了。我们通常说到的Linear discriminant analysis(LDA)其实就是高斯判别模型的一种,假设所有类别的协方差矩阵都是相同的,这时求解后验分布的时候得到的就是LDA。当然协方差矩阵不同的时候对应的QDA(Quadratic discriminant analysis,二次判别分析)。这个相当于我们对于通常定义LDA**最大化类间距最小化类内距离**实际上是等价的。

4、Logistic regression和指数分布族 
这里将会从两个角度看一下逻辑回归的推导过程。 
(1)逻辑回归推导 
这个很简单,网上随便找一个都有,就是求解MLE而已。但是除了二元的逻辑回归还应该知道多元逻辑回归的条件概率由sigmoid变为softmax。 
(2)逻辑回归的广义线性模型解释 
首先要知道什么是广义线性模型:广义线性模型是指输出概率是指数分布族的y|x;θ∼ExpoentialFamily(η),而且指数分布族的自然参数η的是x的线性组合。这个我掌握的不是很好,但是如果面试的时候讲出来效果应该不错。 
(3)逻辑回归输出值是不是概率 
答案是肯定的,解释在这里,其实用广义线性模型的思路说更好,但是实在是对概念掌握的不好。

5、SVM支持向量机 
(1)支持向量机的公式推导,要详细到KKT条件。 
(2)可以进一步结合核函数和GLM引出核机的概念。

6、概率图模型 
有向图、无向图等

三、重要概念

1、监督学习的生成模型和判别模型 
这可以说是一个最基础的问题,但是深挖起来又很复杂,面试的时候应该说出几个有亮点的部分。 
(1)基本说法 
生成模型是由数据学习联合概率分布P(X,Y),然后再求出条件概率分布P(Y|X),典型的生成模型有朴素贝叶斯和马尔科夫模型。 
判别模型就是直接学习判别函数或者是条件概率分布,应该是更直接一些。两者各有优缺点。 
(2)进阶区分 
* 应该说生成模型的假设性更强一些,因为通常是从后验分布的角度思考问题,通常对x的分布进行了一些假设。 
* 训练过程中,对于判别模型通常是最大化对数似然,对生成模型则是最大化联合对数似然函数 
* 因为生成模型对于特征的分布都做出了一定的假设(如高斯判别模型假设特征分布满足多元高斯分布),所以如果对于特征的分布估计比较正确的情况下,生成模型的速度更好准确性也更高。 
* 生成模型在训练数据的时候对于每一类数据的都是独立估计的(也就是每一类的参数不同),这也就说明如果有新类别加入的情况下,是不需要对原有类别进行重新训练的 
* 对于半监督学习,生成模型往往更有用 
* 生成模型有一个大的缺点就是不能对特征进行某些预处理(如特征映射),因为预处理后的数据分布往往有了很大的变化。


2、频率学派的一些基本理论 
(1)期望损失(风险函数)、经验损失(经验风险)、结构风险 
期望损失:理论上知道模型后得到的平均损失较期望损失(依赖于真实分布),但是模型正是我们要求的 
经验损失:经验损失指针对模型的抽样值(训练集)进行平均的损失估计,根据大数定律当训练数据足够的时候经验损失和期望损失是等价的 
结构风险:经验损失是假设经验分布和自然分布相同时得到的,但是这样会造成过拟合,所以引入了正则化,惩罚模型复杂度。 


(2)极大似然MLE、极大后验MAP 
因为我们有的时候利用经验损失求解的时候会遇到不好求解的问题(如不连续0-1)这是可以用对数极大似然估计等价的对参数进行分析。 


同理最大后验利用先验概率达到惩罚模型的作用。如l2-norm岭回归对应高斯先验、L1对应拉普拉斯先验。

via https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1


人工智能大数据与深度学习

搜索添加微信公众号:weic2c

长按图片,识别二维码,点关注



大数据挖掘DT数据分析

搜索添加微信公众号:datadw


教你机器学习,教你数据挖掘

长按图片,识别二维码,点关注




今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/sK9jOiLUB9
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/11134
 
866 次点击