TensorFlow学习

机器学习深度学习面试题总结

2018-10-19  本文已影响38人  MrMiaow

简书公式支持不太好,欢迎跳转到机器学习深度学习面试题总结GitHub看完整的总结,GitHub总结比较全,大多数是参考网上比较好的面试经验和文章,计划持续更新中。喜欢的可以 Star 或者 Fork

一、机器学习

机器学习算法地图.png

1. 方差与偏差

<img src="_asset/Bias_Variance.png">

1.1 导致偏差和方差的原因

1.2 深度学习中的偏差与方差

1.3 偏差与方差的计算公式

1.4 避免过拟合和欠拟合

避免欠拟合(刻画不够)

避免过拟合(刻画太细,泛化太差)

1.5 偏差与方差的权衡(过拟合与模型复杂度的权衡)

2. 生成模型与判别模型

两者之间的联系

优缺点

常见模型

3. 先验概率与后验概率

先验概率,后验概率,似然概率,条件概率,贝叶斯,最大似然 - CSDN博客

条件概率(似然概率)

先验概率

后验概率

贝叶斯公式

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=P(Y|X)&space;=&space;\frac{P(X|Y)&space;&space;P(Y)}{P(X)}" target="_blank"><img src="https://latex.codecogs.com/gif.latex?P(Y|X)&space;=&space;\frac{P(X|Y)&space;&space;P(Y)}{P(X)}" title="P(Y|X) = \frac{P(X|Y) * P(Y)}{P(X)}" /></a></div>

最大似然理论:

认为P(x|y)最大的类别y,就是当前文档所属类别。即Max P(x|y) = Max p(x1|y)*p(x2|y)*...p(xn|y), for all y

贝叶斯理论:

认为需要增加先验概率p(y),因为有可能某个y是很稀有的类别几千年才看见一次,即使P(x|y)很高,也很可能不是它。

所以y = Max P(x|y) * P(y),其中p(y)一般是数据集里统计出来的。

4. 超参数选择

超参数的选择与交叉验证 - CSDN博客

十、如何选择神经网络的超参数 - CSDN博客

Grid Search

Random Search

4.1 超参数有哪些

与超参数对应的是参数。参数是可以在模型中通过BP(反向传播)进行更新学习的参数,例如各种权值矩阵,偏移量等等。超参数是需要进行程序员自己选择的参数,无法学习获得。

常见的超参数有模型(SVM,Softmax,Multi-layer Neural Network,…),迭代算法(Adam,SGD,…),学习率(learning rate)(不同的迭代算法还有各种不同的超参数,如beta1,beta2等等,但常见的做法是使用默认值,不进行调参),正则化方程的选择(L0,L1,L2),正则化系数,dropout的概率等等。

4.2 确定调节范围

超参数的种类多,调节范围大,需要先进行简单的测试确定调参范围。

4.2.1 模型

模型的选择很大程度上取决于具体的实际问题,但必须通过几项基本测试。

首先,模型必须可以正常运行,即代码编写正确。可以通过第一个epoch的loss估计,即估算第一个epoch的loss,并与实际结果比较。注意此过程需要设置正则项系数为0,因为正则项引入的loss难以估算

其次,模型必须可以对于小数据集过拟合,即得到loss接近于0,accuracy接近于1的模型。否则应该尝试其他或者更复杂的模型。

最后,如果 val_acc 与 acc 相差很小,可能是因为模型复杂度不够,需要尝试更为复杂的模型。

4.2.2 学习率

根据以上两条原则,可以得到学习率的大致范围。

4.2.3 正则项系数

根据以上两条原则,可以得到正则项系数的大致范围。

4.3 交叉验证

对于训练集再次进行切分,得到训练集以及验证集。通过训练集训练得到的模型,在验证集验证,从而确定超参数。(选取在验证集结果最好的超参数)

交叉验证的具体实例详见CS231n作业笔记1.7:基于特征的图像分类之调参和CS231n作业笔记1.2: KNN的交叉验证。

4.3.1 先粗调,再细调

先通过数量少,间距大的粗调确定细调的大致范围。然后在小范围内部进行间距小,数量大的细调。

4.3.2 尝试在对数空间内进行调节

即在对数空间内部随机生成测试参数,而不是在原空间生成,通常用于学习率以及正则项系数等的调节。出发点是该超参数的指数项对于模型的结果影响更显著;而同阶的数据之间即便原域相差较大,对于模型结果的影响反而不如不同阶的数据差距大。

4.3.3. 随机搜索参数值,而不是格点搜索

<img src="_asset/RandomSearchVSGridSearch.png">

通过随机搜索,可以更好的发现趋势。图中所示的是通过随机搜索可以发现数据在某一维上的变化更加明显,得到明显的趋势。

4.4 神经网路中的超参数

  1. 学习率 η
  2. 正则化参数 λ
  3. 神经网络的层数 L
  4. 每一个隐层中神经元的个数 j
  5. 学习的回合数 Epoch
  6. 小批量数据 minibatch 的大小
  7. 输出神经元的编码方式
  8. 代价函数的选择
  9. 权重初始化的方法
  10. 神经元激活函数的种类
  11. 参加训练模型数据的规模

5. 余弦相似度(Cos距离)与欧氏距离的区别和联系

欧氏距离和余弦相似度的区别是什么? - 知乎

6. 混淆矩阵、模型度量指标:准确率、精确率、召回率、F1 值、ROC、AUC等

机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率 - 简书

分类 (Classification):ROC 和曲线下面积

<img src="_asset/机器学习性能评估指标.png">

6.1 分类评价指标

混淆矩阵

<img src="_asset/混肴矩阵.png">

准确率(accuracy)

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=ACC&space;=&space;\frac{TP&space;+&space;TN}{TP&space;+&space;TN&space;+&space;FP&space;+&space;FN}" target="_blank"><img src="https://latex.codecogs.com/gif.latex?ACC&space;=&space;\frac{TP&space;+&space;TN}{TP&space;+&space;TN&space;+&space;FP&space;+&space;FN}" title="ACC = \frac{TP + TN}{TP + TN + FP + FN}" /></a></div>

精确率(precision)【查准率】

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=P&space;=&space;\frac{TP}{TP&space;+&space;FP}" target="_blank"><img src="https://latex.codecogs.com/gif.latex?P&space;=&space;\frac{TP}{TP&space;+&space;FP}" title="P = \frac{TP}{TP + FP}" /></a></div>

准确率与精确率的区别:

在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。比如在互联网广告里面,点击的数量是很少的,一般只有千分之几,如果用acc,即使全部预测成负类(不点击)acc 也有 99% 以上,没有意义。

召回率(recall, sensitivity, true positive rate)【查全率】

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=R&space;=&space;\frac{TP}{TP&space;+&space;FN}" target="_blank"><img src="https://latex.codecogs.com/gif.latex?R&space;=&space;\frac{TP}{TP&space;+&space;FN}" title="R = \frac{TP}{TP + FN}" /></a></div>

F1值——精确率和召回率的调和均值

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=\frac{2}{F_{1}}&space;=&space;\frac{1}{P}&space;+&space;\frac{1}{R}" target="blank"><img src="https://latex.codecogs.com/gif.latex?\frac{2}{F{1}}&space;=&space;\frac{1}{P}&space;+&space;\frac{1}{R}" title="\frac{2}{F_{1}} = \frac{1}{P} + \frac{1}{R}" /></a></div>

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=F_{1}&space;=&space;\frac{2TP}{2TP&space;+&space;FP&space;+&space;FN}" target="blank"><img src="https://latex.codecogs.com/gif.latex?F{1}&space;=&space;\frac{2TP}{2TP&space;+&space;FP&space;+&space;FN}" title="F_{1} = \frac{2TP}{2TP + FP + FN}" /></a></div>

只有当精确率和召回率都很高时,F1值才会高

ROC

ROC曲线:接收者操作特征曲线(receiver operating characteristic curve),是反映敏感性和特异性连续变量的综合指标,roc曲线上每个点反映着对同一信号刺激的感受性。

对于分类器,或者说分类算法,评价指标主要有precision,recall,F-score等,以及这里要讨论的ROC和AUC。下图是一个ROC曲线的示例:

<img src="_asset/ROC.png">

在一个二分类模型中,假设采用逻辑回归分类器,其给出针对每个实例为正类的概率,那么通过设定一个阈值如0.6,概率大于等于0.6的为正类,小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。

如下面这幅图,(a)图中实线为ROC曲线,线上每个点对应一个阈值。

<img src="_asset/ROC曲线和它相关的比率.png">

(a) 理想情况下,TPR应该接近1,FPR应该接近0。ROC曲线上的每一个点对应于一个threshold,对于一个分类器,每个threshold下会有一个TPR和FPR。比如Threshold最大时,TP=FP=0,对应于原点;Threshold最小时,TN=FN=1,对应于右上角的点(1,1)。
(b) P和N得分不作为特征间距离d的一个函数,随着阈值theta增加,TP和FP都增加。

<img src="_asset/ROC坐标系里的店如何移动.png">

AUC

AUC (Area Under Curve) 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于 y=x 这条直线的上方,所以AUC的取值范围一般在0.5和1之间

使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

AUC的计算有两种方式,梯形法ROC AUCH法,都是以逼近法求近似值,具体见wikipedia

AUC意味着什么

那么AUC值的含义是什么呢?根据(Fawcett, 2006),AUC的值的含义是:

The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.

这句话有些绕,我尝试解释一下:首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类

从AUC判断分类器(预测模型)优劣的标准:

三种AUC值示例:

<img src="_asset/AUC.png">

简单说:AUC值越大的分类器,正确率越高

为什么使用ROC曲线

既然已经这么多评价标准,为什么还要使用ROC和AUC呢?

因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

6.2 回归评价指标

机器学习评估指标 - 知乎

机器学习-浅谈模型评估的方法和指标 - 简书

MAE(平均绝对误差)

平均绝对误差MAE(Mean Absolute Error)又被称为 L1范数损失。(n = m -1)

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=MAE(y,\hat{y})&space;=&space;\frac{1}{m}\sum_{i=1}^{n}|y_i&space;-&space;\hat{y_i}|" target="blank"><img src="https://latex.codecogs.com/gif.latex?MAE(y,\hat{y})&space;=&space;\frac{1}{m}\sum{i=1}^{n}|y_i&space;-&space;\hat{y_i}|" title="MAE(y,\hat{y}) = \frac{1}{m}\sum_{i=1}^{n}|y_i - \hat{y_i}|" /></a></div>

MAE有哪些不足?

MSE(均方误差)

均方误差MSE(Mean Squared Error)又被称为 **L2范数损失 **。

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=MSE(y,\hat{y})&space;=&space;\frac{1}{m}\sum_{i=1}{m}(y_i&space;-&space;\hat{y_i})2" target="blank"><img src="https://latex.codecogs.com/gif.latex?MSE(y,\hat{y})&space;=&space;\frac{1}{m}\sum{i=1}{m}(y_i&space;-&space;\hat{y_i})2" title="MSE(y,\hat{y}) = \frac{1}{m}\sum_{i=1}^{m}(y_i - \hat{y_i})^2" /></a></div>

还有没有比MSE更合理一些的指标?

RMSE(均方根误差)

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=RMSE(y,\hat{y})&space;=&space;\sqrt{\frac{1}{m}\sum_{i=1}{m}(y_i&space;-&space;\hat{y_i})2}" target="blank"><img src="https://latex.codecogs.com/gif.latex?RMSE(y,\hat{y})&space;=&space;\sqrt{\frac{1}{m}\sum{i=1}{m}(y_i&space;-&space;\hat{y_i})2}" title="RMSE(y,\hat{y}) = \sqrt{\frac{1}{m}\sum_{i=1}^{m}(y_i - \hat{y_i})^2}" /></a></div>

RMSE有没有不足的地方?有没有规范化(无量纲化的指标)?

R^2(决定系数)

变量之所以有价值,就是因为变量是变化的。什么意思呢?比如说一组因变量为[0, 0, 0, 0, 0],显然该因变量的结果是一个常数0,我们也没有必要建模对该因变量进行预测。假如一组的因变量为[1, 3, 7, 10, 12],该因变量是变化的,也就是有变异,因此需要通过建立回归模型进行预测。这里的变异可以理解为一组数据的方差不为0。

决定系数又称为R^2 score,反映因变量的全部变异能通过回归关系被自变量解释的比例。

<img src="_asset/R2.png">

化简上面的公式 ,分子就变成了我们的均方误差MSE,下面分母就变成了方差:

<img src="_asset/R2_1.png">

以上评估指标有没有缺陷,如果有,该怎样改进?

以上的评估指标是基于误差的均值对进行评估的,均值对异常点(outliers)较敏感,如果样本中有一些异常值出现,会对以上指标的值有较大影响,即均值是非鲁棒的

6.3 解决评估指标鲁棒性问题

我们通常用以下两种方法解决评估指标的鲁棒性问题:

<div align="center"><a href="https://www.codecogs.com/eqnedit.php?latex=MAPE&space;=&space;median(|y_i&space;-&space;\hat{y_i}|&space;/&space;y_i)" target="_blank"><img src="https://latex.codecogs.com/gif.latex?MAPE&space;=&space;median(|y_i&space;-&space;\hat{y_i}|&space;/&space;y_i)" title="MAPE = median(|y_i - \hat{y_i}| / y_i)" /></a></div>

MAPE是一个相对误差的中位数,当然也可以使用别的分位数。

7. 如何处理数据中的缺失值

可以分为以下 2 种情况:

  1. 缺失值较多

    • 直接舍弃该列特征,否则可能会带来较大的噪声,从而对结果造成不良影响。
  2. 缺失值较少

    • 当缺失值较少(<10%)时,可以考虑对缺失值进行填充,以下是几种常用的填充策略:
    1. 用一个异常值填充(比如 0),将缺失值作为一个特征处理

      data.fillna(0)

    2. 均值|条件均值填充

      如果数据是不平衡的,那么应该使用条件均值填充

      所谓条件均值,指的是与缺失值所属标签相同的所有数据的均值

      data.fillna(data.mean())

    3. 用相邻数据填充

      # 用前一个数据填充
      data.fillna(method='pad')
      # 用后一个数据填充
      data.fillna(method='bfill') 
      
    4. 插值

      data.interpolate()

    5. 拟合

      简单来说,就是将缺失值也作为一个预测问题来处理:将数据分为正常数据和缺失数据,对有值的数据采用随机森林等方法拟合,然后对有缺失值的数据进行预测,用预测的值来填充。

8. 介绍一个完整的机器学习项目流程

  1. 数学抽象

    明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。

    这里的抽象成数学问题,指的是根据数据明确任务目标,是分类、还是回归,或者是聚类。

  2. 数据获取

    数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。

    数据要有代表性,否则必然会过拟合。

    对于分类问题,数据偏斜不能过于严重(平衡),不同类别的数据数量不要有数个数量级的差距。

    对数据的量级要有一个评估,多少个样本,多少个特征,据此估算出内存需求。如果放不下就得考虑改进算法或者使用一些降维技巧,或者采用分布式计算。

  3. 预处理与特征选择

    良好的数据要能够提取出良好的特征才能真正发挥效力。

    预处理/数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。

    筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。

  4. 模型训练与调优

    直到这一步才用到我们上面说的算法进行训练。

    现在很多算法都能够封装成黑盒使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。

  5. 模型诊断

    如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。

    过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。

    误差分析也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题......

    诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。

  6. 模型融合/集成

    一般来说,模型融合后都能使得效果有一定提升。而且效果很好。

    工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。

  7. 上线运行

    这一部分内容主要跟工程实现的相关性更大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。

    这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有多实践,多积累项目经验,才会有自己更深刻的认识。

9. 数据清洗与特征处理

数据清洗方法

机器学习中的数据清洗与特征处理综述 - 美团技术团队

【机器学习InAction系列】数据清洗与特征处理综述 - 腾讯云

<img src="_asset/数据清洗与特征处理.jpg">

10. 关联规则挖掘的 3 个度量指标:支持度、置信度、提升度

支持度(Support)

置信度(Confidence)

提升度(Lift)

10.1 规则的有效性:

10.2 判断规则的有效性

问题:已知有1000名顾客买年货,分为甲乙两组,每组各500人,其中甲组有500人买了茶叶,同时又有450人买了咖啡;乙组有450人买了咖啡,如表所示,请问“茶叶→咖啡”是一条有效的关联规则吗?

组次 买茶叶的人数 买咖啡的人数
甲组(500人) 500 450
乙组(500人) 0 450

答:

由于提升度 Lift(X→Y) = 1,表示 XY 相互独立。也就是说,是否购买咖啡,与是否购买茶叶无关联。规则“茶叶→咖啡”不成立,或者说几乎没有关联,虽然它的置信度高达90%,但它不是一条有效的关联规则。

11. 信息熵、KL 散度(相对熵)与交叉熵

什么是熵?

《深度学习》 3.13 信息论

信息论的基本想法是一个不太可能的事件居然发生了,要比一个非常可能的事件发生,能提供更多的信息。

该想法可描述为以下性质:

  1. 非常可能发生的事件信息量要比较少,并且极端情况下,确保能够发生的事件应该没有信息量。
  2. 比较不可能发生的事件具有更高的信息量。
  3. 独立事件应具有增量的信息。例如,投掷的硬币两次正面朝上传递的信息量,应该是投掷一次硬币正面朝上的信息量的两倍。

11.1 自信息与信息熵

自信息(self-information)是一种量化以上性质的函数,定义一个事件 x 的自信息为:

<div align="center"><img src="http://latex.codecogs.com/gif.latex?I(x) = - \log P(x)" /></div>

当该对数的底数为 e 时,单位为奈特(nats,本书标准);当以 2 为底数时,单位为比特(bit)或香农(shannons)

自信息只处理单个的输出。此时,用信息熵(Information-entropy)来对整个概率分布中的不确定性总量进行量化:

<div align="center"><img src="http://latex.codecogs.com/gif.latex?H(\mathrm{X}) = \mathbb{E}{\mathrm{X} \sim P}[I(x)] = - \sum{x \in \mathrm{X}}P(x) \log P(x)" /></div>

信息熵也称香农熵(Shannon entropy)

信息论中,记 0log0 = 0

11.2 相对熵(KL 散度)与交叉熵

P 对 Q 的 KL散度(Kullback-Leibler divergence):

<div align="center"><img src="http://latex.codecogs.com/gif.latex?D_P(Q) = \mathbb{E}{\mathrm{X} \sim P} \left[ \log \frac{P(x)}{Q(x)} \right] = \sum{x \in \mathrm{X}}P(x) \left[ \log P(x) - \log Q(x) \right]" /></div>

KL 散度在信息论中度量的是那个直观量

在离散型变量的情况下, KL 散度衡量的是,当我们使用一种被设计成能够使得概率分布 Q 产生的消息的长度最小的编码,发送包含由概率分布 P 产生的符号的消息时,所需要的额外信息量。

KL 散度的性质

交叉熵(cross-entropy):

<div align="center"><img src="http://latex.codecogs.com/gif.latex?H_P(Q) = - \mathbb{E}{\mathrm{X} \sim P} \log Q(x) = - \sum{x \in \mathrm{X}}P(x) \log Q(x)" /></div>

信息量,信息熵,交叉熵,KL散度和互信息(信息增益) - CSDN博客

上一篇下一篇

猜你喜欢

热点阅读