机器学习复习

文章目录

      • SVM
      • **balance的方法**
      • 逻辑回归和SVM的联系
          • 区别
      • 朴素贝叶斯
      • 逻辑回归和线性回归
      • KNN
      • KD树
      • 决策树
      • 随机森林
      • GBDT
      • Shrinkage
      • 最小二乘法
      • 和随机森林的区别
      • EM
      • Bagging
      • Boosting
      • 凸集
      • 凸函数
      • daBoost
      • 分类回归的区别
      • 生成模型和判别模型的区别
      • 过拟合
          • **正则化(Regularization)**
          • **随机失活(dropout)**
          • **逐层归一化(batch normalization)**
          • **提前终止(early stopping)**
        • 线性分类器和非线性分类器
      • 样本不均衡
      • 深度学习的实质
      • 激活函数
      • 特征选择
      • 垃圾邮件分类
      • 梯度下降
      • 牛顿迭代
      • L1和L2的区别
      • 高斯核
      • 线性核
      • 逻辑回归和线性回归的区别
      • 集成学习
          • Bagging方法:
          • Boosting方法:
      • EM算法
      • 归一化
          • 1)线性归一化
          • 2)标准差标准化
          • 3)非线性归一化
      • 完整的机器学习流程
      • new和malloc的区别
      • hash冲突解决方法
      • 熵值
      • 卷积
      • 池化
      • 梯度下降的困难
      • 牛顿法
      • python内存管理
      • 损失函数
      • 有什么要问的

https://yoyoyohamapi.gitbooks.io/mit-ml/content/逻辑回归/articles/多分类问题.html

  1. pac overfitting解决,如何从100个特征中选20个特征,有哪些方法
  2. 垃圾短信多分类任务(如何分开发票,广告,商铺信息等),有什么思路
  3. 6现在做的机器学习相关项目
  4. 7是否上过相关公开课,详细说明
  5. 8自己的长处
  6. 9未来工作意向 L1正则和L2正则的区别
  7. 朴素贝叶斯为什么被称为“朴素”?
  8. 请详细介绍一下朴素贝叶斯分类器。
  9. 什么是深度学习?深度学习和机器学习的区别是什么?
  10. 在无监督学习中,如何进行文件聚类?
  11. 如何找到与某些查询语句/搜索相关的文件?
  12. 解释下TF-IDF技术。
  13. 根据我的经验来看,TF-IDF技术在文件分类或聚类上效果并不好,你将如何改进?
  14. 什么是word2vec模型?
  15. 解释下python中的可变对象和不可变对象。
  16. 你在python中使用过什么数据结构?
  17. 解释一下支持向量机(SVM)如何学习非线性边界。
  18. 训练决策树时,其参数是什么?
  19. 在决策树的某个节点处进行分割,其分割标准是什么?
  20. 基尼系数的计算公式是什么?
  21. 熵的计算公式是什么?
  22. 决策树如何决定在哪个特征处必须进行分割?
  23. 如何利用数学计算收集来的信息?
  24. 简述随机森林的优点。
  25. 简述boosting算法。
  26. 梯度提升算法(gradient boosting)是怎样工作的?
  27. 简述AdaBoost算法工作原理。
  28. SVM中用到了哪些内核?SVM的优化技术有哪些?
  29. SVM如何学习超平面?论述下其数学运算细节。
  30. 谈一谈无监督学习?都有哪些算法?
  31. 如何定义K-Means聚类算法中K的值?
  32. 列举至少3中定义K-Means聚类算法中K的方法。
  33. 除此之外你还知道哪些聚类算法?
  34. 介绍一下DB-SCAM算法。
  35. 简述下分层凝聚聚类(Hierarchical Agglomerativeclustering)的工作原理。
  36. 解释一下主成分分析算法(PCA),简述下使用PCA算法的数学步骤。
  37. 20.使用 PCA算法有哪些缺点?
  38. 谈谈卷积神经网络的工作原理?详细说明其实现细节。
  39. 解释一下卷积神经网络中的反向传播。
  40. 你如何部署机器学习模型?
  41. 我们大部分情况下都要用C++从零开始搭建一个机器学习模型,这一点你能做到吗?
  42. 在不平衡数据集中,你会选择什么模型:随机森林还是Boosting?为什么?
  43. 你所了解的Boosting技术有哪些?
  44. 采用监督学习解决分类问题,你会选择哪个模型?假设有 40-50个分类!
  45. 你怎样使用合奏(Ensemble)技术?
  46. 简述支持向量机(SVM)的工作原理。
  47. 什么是Kernel?简单介绍一下。
  48. 如何实现非线性回归?
  49. 什么是Lasso回归和Ridge回归?
  50. Sigmoid 函数的范围是什么?
  51. 说出scikit-learn能够实现逻辑回归的包的名称。
  52. 标准正态分布的均值和方差分别是多少?
  53. 你在Python中都使用什么数据结构?
  54. 文本分类的方法有哪些?你会怎么做分类?
  55. 解释TF-IDF技术及其缺点,如何克服TF-IDF的缺点?
  56. 什么是双词搭配(Bigrams)和三词搭配(Trigrams)?用一个文本语句解释一下双词搭配和三词搭配的TF-IDF技术。
  57. 举例说明word2vec有哪些应用。
  58. 如何设计一个神经网络?如何做到“深度”?这是一个基础的神经网络问题。
  59. 简述LSTM的工作原理。它是如何记住文本的?
  60. 什么是朴素贝叶斯分类器?
  61. 抛10次硬币,4次是正面的概率是多少?
  62. 如何获取Python列表中元素的索引?
  63. 如果合并两个pandas数据集?
  64. 从用户行为来看,你需要模拟一个欺诈活动,你会如何解决这个问题?这是可能是一个异常检测问题或分类问题!
  65. 决策树和随机森林,你更喜欢哪一个?
  66. 逻辑回归和随机森林有什么区别?
  67. 你会用决策树还是随机森林来解决分类问题?随机森林有什么优点?

SVM

Support Vector Machine,希望求得每没类元素最近的距离最远,

  • 训练数据线性可分:硬间隔最大化
  • 训练集近似线性可分:软间隔最大化
  • 线性不可分:和技巧及软间隔最大化
  • 离散集合:核函数表示将输入从输入空间映射到特征空间得到的特征向量之间的内积
  • 和方法:隐式的从高维的特征空间中学习线性支持向量机。

感知机利用误分类最小的策略,求得分离超平面,不过这时的解有无穷多个。线性可分支持向量机利用间隔最大化求解最优分离超平面。

一个点距离分离平面的远近可以表示分类预测的确信程度,在超平面wx+b=0确定的情况下,|wx+b|能够相对的表示点x距离超平面的远近,而wx+b的符号与标记y的符号是否一致能够表示分类是否正确

函数间隔就是y(wx+b),但是随着w的改变,可能平面不变,但是函数间隔会变,因此几何间隔提取出了真正的距离,除以一个权重的值。

逻辑回归是一种分类的方法,主要用于二分类,从训练数据特征学习出一个0/1分类模型,以一个线性组合作为自变量,使用逻辑函数将自变量映射到(0,1)上,LR分类器实际上就是求解一组权值,带入逻辑函数中,得到一个类别为1和类别为0的概率。

可以用梯度下降求解

balance的方法

调整正、负样本在求cost时的权重,比如按比例加大正样本cost的权重。然而deep learning的训练过程是on-line的因此你需要按照batch中正、负样本的比例调整。

做训练样本选取:如hard negative mining,只用负样本中的一部分。

做训练样本选取:如通过data augmentation扩大正样本数量。

两个都是线性分类器

逻辑回归和SVM的联系

1、LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题)

2、两个方法都可以增加不同的正则化项,如l1、l2等等。所以在很多实验中,两种算法的结果是很接近的。

区别

1、LR是参数模型,SVM是非参数模型。

2、从目标函数来看,区别在于逻辑回归采用的是logistical loss,SVM采用的是hinge loss,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。

3、SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。

4、逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。

5、logic 能做的 svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。

  1. 数据方面
  2. Linear SVM不直接依赖数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance一般需要先对数据做balancing
  3. Linear SVM依赖数据表达的距离测度,所以需要对数据先做normalization;LR不受其影响
  4. 过拟合方面
    1. LR容易欠拟合,准确度低。
    2. SVM不太容易过拟合:松弛因子+损失函数形式
    3. 注意SVM的求解方法叫拉格朗日乘子法,而对于均方误差的优化方法是最小二乘法。
  5. 选择:
    1. 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
    2. 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
    3. 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况
  6. svm适合处理的数据
    1. 高维稀疏,样本少。
    2. 【参数只与支持向量有关,数量少,所以需要的样本少,
    3. 由于参数跟维度没有关系,所以可以处理高维问题】

优点:

  1. 使用核函数可以向高维空间进行映射
  2. 使用核函数可以解决非线性的分类
  3. 分类思想很简单,就是将样本与决策面的间隔最大化
  4. 分类效果较好

缺点:

  1. 对大规模数据训练比较困难
  2. 无法直接支持多分类,但是可以使用间接的方法来做

SVM多分类的问题:

  1. 直接法:直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,计算复杂度比较高,实现起来困难
  2. 简介法:
    1. 一对多:其中某个类为一类,剩下n-1一个类为另一个类,一次遍历所有的类,每个类都有单独成为一个类的机会,训练和类别数量相等的分类器,最后在测试的时候将分类器取最大值为分类器。
    2. 一对一:每两个类都拿出来训练一个分类器,但是最后代价太大。

朴素贝叶斯

时间A和B同时发生的概率为A发生的情况下发生B或者B发生的情况下发生A,对于给出的待分类项,求解在此项目条件下各个目标类别出现的概率,哪个最大就认为此待分类项属于哪个类别。

假如现在有样本x=(a1,a2,a3…,an),有分类目标Y={y1,y2,…,yn}

那么max(P(y1|x),P(y2|x)…)就是分类结果

P(yi|x)=P(x|yi)*P(yi)/P(x),而样本可以看成由特征组成,因此可以把x换成对特征求相同值以后的求和

相当于从样本中统计出来

P(ai|yi)代表该类别下该特征出现的概率

P(yi)代表全部类别中,该类别出现的概率

  1. 如果输入是连续值,考虑满足高斯分布,用高斯分布的概率来做
  2. 如果某个类别中某个特征没有出现,会导致0,引入拉普拉斯校验,对于每类别下面的所有划分计数加一。
  3. 要求特征之间独立,可以使用DAG进行概率图的描述

优点:对小规模数据表现好,适合多分类任务,适合增量训练

缺点:对于输入的数据很敏感

逻辑回归和线性回归

逻辑回归是一个线性的二分类问题,主要是计算在某个样本特征下事件发生的概率

线性函数+sigmoid函数求得,这个线性和函数权重的特征值的累加以及加上偏置求出来的,所以训练其实就是在训练这个权重。

所以求解问题就变成了这个最大似然函数的最优化问题,这里通常会采样随机梯度下降法和拟牛顿迭代法来进行优化

如果类别之间是否互斥(比如音乐只能属于古典音乐、乡村音乐、摇滚月的一种)就用softmax 否则类别之前有联系(比如一首歌曲可能有影视原声,也可能包含人声,或者是舞曲),这个时候使用k个LR更为合适

优缺点:
Logistic回归优点:

  1. 实现简单;
  2. 分类时计算量非常小,速度很快,存储资源低;

缺点:

  1. 容易欠拟合,一般准确度不太高
  2. 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;

KNN

三要素:

  1. k值的选择
  2. 距离的度量(常见的距离度量有欧式距离,马氏距离等)
  3. 分类决策规则 (多数表决规则)

k值的选择

  1. k值越小表明模型越复杂,更加容易过拟合
  2. 但是k值越大,模型越简单,如果k=N的时候就表明无论什么点都是训练集中类别最多的那个类

所以一般k会取一个较小的值,然后用过交叉验证来确定
这里所谓的交叉验证就是将样本划分一部分出来为预测样本,比如95%训练,5%预测,然后k分别取1,2,3,4,5之类的,进行预测,计算最后的分类误差,选择误差最小的k

KNN算法的优点:

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

缺点:

  1. 计算量大;
  2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
  3. 需要大量的内存;

KNN中的K值选取对K近邻算法的结果会产生重大影响。如李航博士的一书「统计学习方法」上所说:

  1. **如果选择较小的K值,**就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
  2. 如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。
  3. K=N,则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的累,模型过于简单,忽略了训练实例中大量有用信息。

​ 在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。

KD树

KD树是一个二叉树,表示对K维空间的一个划分,可以进行快速检索(那KNN计算的时候不需要对全样本进行距离的计算了)

KD树更加适用于实例数量远大于空间维度的KNN搜索

构建过程:根据样本的每一个特征的中位数作为且分点,将举行区域划分成两个区域,再对下一个特征两两划分,不断重复2的操作,直到两个子区域没有实例的时候停止。

决策树

ID3:计算信息增益,选择信息增益最大的特征作为当前节点的决策特征,信息增益表示分类目标的熵减去当前属性的熵,增益越大,分类能力越强

  • 熵等于负的概率乘以log概率

C4.5:使用信息增益率来进行属性的选择,准确率高,但是子构造树的过程中需要进行多次的扫描和排序,所以它的运算效率较低

cart:根据当前特征计算他们的基尼增益,选择基尼增益最小的特征作为划分特征,总体的类别越杂乱,GINI指数越大

  • 等于1-概率平方和

好的决策树

  1. 叶子节点数尽量少
  2. 叶子节点的深度尽量小(太深可能会过拟合)

解决过拟合

  1. 剪枝:
    1. 前置剪枝:在分裂节点的时候设计比较苛刻的条件,如果不满足就直接停止分裂
    2. 后置剪枝:建立完树以后,用单个节点代替子树
  2. 交叉验证
  3. 随机森林

优点:

  1. 计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;

缺点:

  1. 单颗决策树分类能力弱,并且对连续值变量难以处理;
  2. 容易过拟合(后续出现了随机森林,减小了过拟合现象);

随机森林

随机森林是有很多随机得决策树构成,它们之间没有关联。得到RF以后,在预测时分别对每一个决策树进行判断,最后使用Bagging的思想进行结果的输出(也就是投票的思想)

  1. 现在有N个训练样本,每个样本的特征为M个,需要建K颗树
  2. 从N个训练样本中有放回的取N个样本作为一组训练集(其余未取到的样本作为预测分类,评估其误差)
  3. 从M个特征中取m个特征左右子集特征(m<
  4. 对采样的数据使用完全分裂的方式来建立决策树,这样的决策树每个节点要么无法分裂,要么所有的样本都指向同一个分类
  5. 重复2的过程K次,即可建立森林

使用oob(out-of-bag)进行泛化误差的估计,将各个树的未采样样本作为预测样本(大约有36.8%),使用已经建立好的森林对各个预测样本进行预测,预测完之后最后统计误分得个数占总预测样本的比率作为RF的oob误分率。

  1. 能够处理大量特征的分类,并且还不用做特征选择
  2. 在训练完成之后能给出哪些feature的比较重要
  3. 训练速度很快
  4. 很容易并行
  5. 实现相对来说较为简单

GBDT

GBDT的精髓在于训练的时候都是以上一颗树的残差为目标,这个残差就是上一个树的预测值与真实值的差值。

Boosting的好处就是每一步的参加就是变相了增加了分错instance的权重,而对已经对的instance趋向于0,这样后面的树就可以更加关注错分的instance的训练了

Shrinkage

Shrinkage认为,每次走一小步逐步逼近的结果要比每次迈一大步逼近结果更加容易避免过拟合。

优点:

  1. 精度高

  2. 能处理非线性数据

  3. 能处理多特征类型

  4. 适合低维稠密数据

    缺点:

  5. 并行麻烦(因为上下两颗树有联系)

  6. 多分类的时候 复杂度很大

最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

使误差「所谓误差,当然是观察值与实际真实值的差量」平方和达到最小以寻求估计值的方法,就叫做最小二乘法,用最小二乘法得到的估计,叫做最小二乘估计。当然,取平方和作为目标函数只是众多可取的方法之一。

  • 最小二乘使得误差平方和最小,并在各个方程的误差之间建立了一种平衡,从而防止某一个极端误差取得支配地位
  • 计算中只要求偏导后求解线性方程组,计算过程明确便捷
  • 最小二乘可以导出算术平均值作为估计值

是一种数学的优化技术,通过求最小化平方误差来寻找最佳的函数匹配 假设现在有二维的观测数据(x1,y1),(x2,y2)…(xn,yn)(x1,y1),(x2,y2)…(xn,yn),求y=a+bxy=a+bx的拟合。

训练串行,运行并行

和随机森林的区别

区别:

(1)取样方式

(2)预测时,RF多数投票,GBDT加权累加

(3)样本的关系—>并行和串行

(4)学期器的种类,GBDT只能用CART回归树 (因为要计算连续梯度)

(5)对异常值的敏感性

(6)通过减少方差/偏差提高性能

EM

EM用隐含变量的概率模型的极大似然估计,一般分为两步:第一步求期望,第二步求极大

如果概率模型的变量都是观测变量,那么给定数据之后就可以直接使用极大似然法或者贝叶斯估计模型参数。
但是当模型含有隐含变量的时候就不能简单的用这些方法来估计,EM就是一种含有隐含变量的概率模型参数的极大似然估计法。

应用到的地方:混合高斯模型、混合朴素贝叶斯模型、因子分析模型

Bagging

  1. 从N样本中有放回的采样N个样本
  2. 对这N个样本在全属性上建立分类器(CART,SVM)
  3. 重复上面的步骤,建立m个分类器
  4. 预测的时候使用投票的方法得到结果

Boosting

boosting在训练的时候会给样本加一个权重,然后使loss function尽量去考虑那些分错类的样本(比如给分错类的样本的权重值加大)

在机器学习中往往是最终要求解某个函数的最优值,但是一般情况下,任意一个函数的最优值求解比较困难,但是对于凸函数来说就可以有效的求解出全局最优值。

凸集

一个集合C是,当前仅当任意x,y属于C且0≤Θ≤10≤Θ≤1,都有Θ∗x+(1−Θ)∗yΘ∗x+(1−Θ)∗y属于C

用通俗的话来说C集合线段上的任意两点也在C集合中

凸函数

一个函数f其定义域(D(f))是凸集,并且对任意x,y属于D(f)和0≤Θ≤10≤Θ≤1都有

f(Θ∗x+(1−Θ)∗y)≤Θ∗f(x)+(1−Θ)∗f(y)f(Θ∗x+(1−Θ)∗y)≤Θ∗f(x)+(1−Θ)∗f(y)

常见的凸函数有:

  • 指数函数f(x)=ax;a>1f(x)=ax;a>1
  • 负对数函数−logax;a>1,x>0−logax;a>1,x>0
  • 开口向上的二次函数等

凸函数的判定:

  1. 如果f是一阶可导,对于任意数据域内的x,y满足f(y)≥f(x)+f′(x)(y−x)f(y)≥f(x)+f′(x)(y−x)
  2. 如果f是二阶可导,

凸优化应用举例

  • SVM:其中由max|w|max|w| 转向min(12∗|w|2)min(12∗|w|2)
  • 最小二乘法?
  • LR的损失函数∑(yi∗log(hw(xi))+(1−yi)∗(log(1−hw(xi))))

daBoost

daBoost的优缺点 优点:(1)容易理解、实现简单 (2)易编码 (3)分类精度高 (4)可以使用各种回归模型构建基分类器,非常灵活 (5)作为二元分类器是,构造简单、结果可理解、少参数 (6)相对来说,不宜过拟合

缺点:(1)只能串行 (2)对异常值敏感 boosting对异常值敏感

分类回归的区别

定量输出称为回归,或者说是连续变量预测;

定性输出称为分类,或者说是离散变量预测。

生成模型和判别模型的区别

判别方法:由数据直接学习决策函数 Y = f(X),或者由条件分布概率 P(Y|X)作为预测模型,即判别模型。

生成方法:由数据学习联合概率密度分布函数 P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型。

由生成模型可以得到判别模型,但由判别模型得不到生成模型。

常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场

常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机

有监督机器学习方法可以分为生成方法和判别方法(常见的生成方法有混合高斯模型、朴素贝叶斯法和隐形马尔科夫模型等,常见的判别方法有SVM、LR等),生成方法学习出的是生成模型,判别方法学习出的是判别模型。

监督学习,预测时,一般都是在求p(Y|X)生成模型: 从数据中学习联合概率分布p(X,Y),然后利用贝叶斯公式求:

判别模型:直接学习P(Y|X), 它直观输入什么特征X,就直接预测出最可能的Y; 典型的模型包括:LR, SVM,CRF,Boosting,Decision tree…

生成方法的特点:生成方法可以还原联合概率分布,而判别方法则不能;生成方法的学习收敛速度更快,即当样本容量增加的时候,学习的模型可以更快的收敛于真实的模型;当存在隐变量时,仍可以用生成方法学习,此时判别方法就不能用。

判别方法的特点:判别方法直接学习的是条件概率或者决策函数,直接面对预测,往往学习的准确率更高;由于直接学习或者,可以对数据进行各种程度上的抽象、定义特征并使用特征,因此可以简化学习问题

精确率(Precision)为TP/(TP+FP)

召回率(Recall)为TP/(TP+FN)

F1值是精确率和召回率的调和均值,即F1=2PR/(P+R)

所以AUC表征的是模型的分类能力。

过拟合

解决方法

交叉验证法
减少特征
正则化
权值衰减
验证数据

正则化(Regularization)

L2正则化:目标函数中增加所有权重w参数的平方之和, 逼迫所有w尽可能趋向零但不为零. 因为过拟合的时候, 拟合函数需要顾忌每一个点, 最终形成的拟合函数波动很大, 在某些很小的区间里, 函数值的变化很剧烈, 也就是某些w非常大. 为此, L2正则化的加入就惩罚了权重变大的趋势.
L1正则化:目标函数中增加所有权重w参数的绝对值之和, 逼迫更多w为零(也就是变稀疏. L2因为其导数也趋0, 奔向零的速度不如L1给力了). 大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的特征权重反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些无用的特征,也就是把这些特征对应的权重置为0。

随机失活(dropout)

在训练的运行的时候,让神经元以超参数p的概率被激活(也就是1-p的概率被设置为0), 每个w因此随机参与, 使得任意w都不是不可或缺的, 效果类似于数量巨大的模型集成。

逐层归一化(batch normalization)

这个方法给每层的输出都做一次归一化(网络上相当于加了一个线性变换层), 使得下一层的输入接近高斯分布. 这个方法相当于下一层的w训练时避免了其输入以偏概全, 因而泛化效果非常好.

提前终止(early stopping)

理论上可能的局部极小值数量随参数的数量呈指数增长, 到达某个精确的最小值是不良泛化的一个来源. 实践表明, 追求细粒度极小值具有较高的泛化误差。这是直观的,因为我们通常会希望我们的误差函数是平滑的, 精确的最小值处所见相应误差曲面具有高度不规则性, 而我们的泛化要求减少精确度去获得平滑最小值, 所以很多训练方法都提出了提前终止策略. 典型的方法是根据交叉叉验证提前终止: 若每次训练前, 将训练数据划分为若干份, 取一份为测试集, 其他为训练集, 每次训练完立即拿此次选中的测试集自测. 因为每份都有一次机会当测试集, 所以此方法称之为交叉验证. 交叉验证的错误率最小时可以认为泛化性能最好, 这时候训练错误率虽然还在继续下降, 但也得终止继续训练了.

线性分类器和非线性分类器

常见的线性分类器有:LR,贝叶斯分类,单层感知机、线性回归
常见的非线性分类器:决策树、RF、GBDT、多层感知机
SVM两种都有(看线性核还是高斯核)

线性分类器速度快、编程方便,但是可能拟合效果不会很好
非线性分类器编程复杂,但是效果拟合能力强

特征比数据量还大时,选择什么样的分类器?
线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分
对于维度很高的特征,你是选择线性还是非线性分类器?
理由同上
对于维度极低的特征,你是选择线性还是非线性分类器?
非线性分类器,因为低维空间可能很多特征都跑到一起了,导致线性不可分

样本不均衡

主要三个方面,数据,模型和评估方法。

数据上重采样和欠采样,使之均衡;

模型上选对样本不均衡问题不敏感的模型,和算法集成技术,如决策树,不能用KNN;

评估方法,用查全率,查准率之类

深度学习的实质

与浅层学习的区别

深度学习实质:多隐层+海量数据——>学习有用特征—–>提高分类或预测准确性 区别:(1)DL强调模型深度 (2)DL突出特征学习的重要性:特征变换+非人工

卷积层:特征提取 子采样层/池化层:缩减输入数据的规模

激活函数

(1)sigmoid:易饱和(梯度消失),非0均值

(2)tanh,改进了sigmoid的第二个缺点,即它是0均值的

(3)ReLU,收敛快(不容易饱和),求梯度简单(没有指数计算,只需要阈值就可以),有稀疏特性。缺点是神经元容易坏死

由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了

leaky-relu

不是0

特征选择

Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。

Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。

Embedded:集成方法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

垃圾邮件分类

朴素 贝叶斯垃圾邮件分类器是在对邮件关键字进行统计分析到基础上利用贝叶斯公式进行分类到方法。相比其他模型,朴素贝叶斯模型到搭建比较简单,并且具有良好到分类效果。

朴素真贝叶斯分类器通过对邮件关键字进行统计,然后使用贝叶斯推理来计算一封电子邮件是或不是垃圾邮件的概率。

1.特征量的选择

对于文本信息而言,文本中的关键字更能代表文本到内容,因此在此分类器中我们对邮件内容进行分词处理,选取邮件中出现频率最高的10个词作为这封邮件到特征量。

2.样本分类

对于垃圾邮件分类器而言样本到分类比较简单,垃圾邮件类和非垃圾邮件类。

3.训练

词分类器中到样本数据来源于

SpamAssassin公共语料库。对语料库中的垃圾邮件和非垃圾邮件做分词然后统计对应到词频,对相关数据进行统计计算关键字后验概率形成分类器。

实现细节

1)分词

英文分词主要以空格作为分词到手段从中提取关键字,但是此方法对中文并不适用。因为中文词之间没有明确到分隔,并且中文的词大部分都是有多字词构成这就无法从字的角度进行分词。

此处的分词我们选择了“庖丁解牛”这个中文分词工具对邮件文本进行分词。分词之前先做了一些预处理,去掉了文本中的非中文字符。

2)训练中数据的平滑处理

在非类器训练过程中可能会遇到待评估邮件中包含到关键字在非类器中不存在到情况,为了防止零概率情况到发生我们把不存在到关键字的词频设为0.5。然后再放入分类器中进行相关计算。

3)假设条件

假设特征变量之间相互。
假设邮件为垃圾或者非垃圾邮件到概率各为50%。

梯度下降

  • 梯度下降法

在微积分中,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。几何意义上来说,梯度就是函数变化增加最快的地方。沿着梯度相反的方向,就是梯度减少最快的地方,最容易找到最小值。

在最小化损失函数时,可以通过梯度下降法来一步步迭代求解,得到最小化的损失函数,和模型参数值。

步长:步长决定了在梯度下降迭代的过程中,每一步沿着梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最容易下山的位置走得那一步的长度

特征:样本中输入部分

假设函数:监督学习中,为了拟合输入样本,而使用的假设函数

损失函数:为了评估模型拟合的好坏,通常用损失函数来度量拟合的成都。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。

算法过程:

  1. 确定当前的损失函数的梯度,通过求当前参数的微分
  2. 用步长乘以损失函数的梯度,得到当前位置下降的距离
  3. 确定是否所有的梯度下降的距离都小于ε,如果小于ε则算法终止,当前的所有参数即为最终结果,否则进入步骤4
  4. 更新所有的参数,更新完以后进入步骤1

算法调优:

  • 步长选择,多选一些值,从大到小分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要减小步长
  • 算法参数的初始值选择,初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值。
  • 归一化:由于样本不同特征的取值范围不一样,可能导致迭代很慢。为了减少特征取值的影响,可以对特征归一化或者标准化。

批梯度下降:更新参数使用所有样本进行更新

随机梯度下降:求梯度时没有用所有的m个样本的数据,而仅仅选取一个样本来求梯度。

小批量梯度下降:对于m各样本,采用x个样子来迭代。

和最小二乘法比较:

不同:梯度下降是迭代求解,最小二乘法是解析求解

缺点:需要选择步长,如果样本少的时候,最小二成计算速度块

优点:样本量很大的时候,最小二乘需要去一个超级大的逆矩阵,这时候求解很慢,使用迭代的梯度下降法比较有优势

梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。

牛顿迭代

  • 牛顿迭代

牛顿-拉弗森方法

切线是曲线的线性逼近。

随便找一个曲线上的点做切线,找到与x周的交点做垂线,然后继续做切线,重复刚才的过程

如果f二阶可导,那么待求的零点x周围存在一个区域,只要起始点位于这个邻近域内,那么牛顿-拉弗森方法必定收敛

但是因为我们不知道根点在哪里,所以起始点的选择就不一定在这个区域内。

  • 驻点:驻点没有根
  • 越来越远离:比如说x的三分之一的幂
  • 循环震荡不收敛:x的绝对值的二分之一幂
    • 注意零点倒数不存在也有可能可以用牛顿方法解
  • 不能完整求出所有根,可能只能求到近一点的根,或者远一点的跟

应用牛顿-拉弗森方法,要注意以下问题:

  • 函数在整个定义域内最好是二阶可导的
  • 起始点对求根计算影响重大,可以增加一些别的判断手段进行试错

L1和L2的区别

L2正则化:目标函数中增加所有权重w参数的平方之和, 逼迫所有w尽可能趋向零但不为零. 因为过拟合的时候, 拟合函数需要顾忌每一个点, 最终形成的拟合函数波动很大, 在某些很小的区间里, 函数值的变化很剧烈, 也就是某些w非常大. 为此, L2正则化的加入就惩罚了权重变大的趋势.

L1正则化:目标函数中增加所有权重w参数的绝对值之和, 逼迫更多w为零(也就是变稀疏. L2因为其导数也趋0, 奔向零的速度不如L1给力了). 大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的特征权重反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些无用的特征,也就是把这些特征对应的权重置为0。

L1是拉普拉斯分布,L2是高斯分布。

高斯核

高斯核img,这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果img选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果img选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数img,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维线性不可分的数据通过高斯核函数映射到了高维空间:

线性核

线性核img,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。

逻辑回归和线性回归的区别

逻辑回归的模型本质上是一个线性回归模型,逻辑回归都是以线性回归为理论支持的。但线性回归模型无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题。

集成学习

Bagging方法:

学习器间不存在强依赖关系, 学习器可并行训练生成, 集成方式一般为投票;

Random Forest属于Bagging的代表, 放回抽样, 每个学习器随机选择部分特征去优化;

Boosting方法:

学习器之间存在强依赖关系、必须串行生成, 集成方式为加权和;

Adaboost属于Boosting, 采用指数损失函数替代原本分类任务的0/1损失函数;

GBDT属于Boosting的优秀代表, 对函数残差近似值进行梯度下降, 用CART回归树做学习器, 集成为回归模型;

xgboost属于Boosting的集大成者, 对函数残差近似值进行梯度下降, 迭代时利用了二阶梯度信息, 集成模型可分类也可回归. 由于它可在特征粒度上并行计算, 结构风险和工程实现都做了很多优化, 泛化, 性能和扩展性都比GBDT要好。

EM算法

有时候因为样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的参数时一般采用最大似然估计,由于含有了隐含变量,所以对似然函数参数求导是求不出来的,这时可以采用EM算法来求模型的参数的(对应模型参数个数可能有多个),EM算法一般分为2步:

E步:选取一组参数,求出在该参数下隐含变量的条件概率值;

M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。

​ 重复上面2步直至收敛。

归一化

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

1)线性归一化

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

2)标准差标准化

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

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

3)非线性归一化

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

完整的机器学习流程

1 抽象成数学问题

明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。 这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。

2 获取数据

数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。 数据要有代表性,否则必然会过拟合。 而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。 而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。

3 特征预处理与特征选择

良好的数据要能够提取出良好的特征才能真正发挥效力。 特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。 筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。

4 训练模型与调优

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

5 模型诊断

如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。 过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。 误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题…… 诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。

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

7 上线运行 这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。 这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。 故,基于此,七月在线每一期ML算法班都特此增加特征工程、模型调优等相关课。比如,这里有个公开课视频《特征处理与特征选择》。

new和malloc的区别

  1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
  2. 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
  3. 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
  4. C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存

hash冲突解决方法

关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突。解决办法:

1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。

2) 再哈希法:同时构造多个不同的哈希函数。

3)链地址法:将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

4)建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

熵值

一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以说,信息熵可以被认为是系统有序化程度的一个度量。

卷积

对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

3.1 卷积层

卷积层是一种线性的、平移不变性的运算。

  • 线性
    • 卷积核过滤的结果相当于一次线性计算
  • 平移不变性
    • 识别结果不依赖物体的位置
    • 卷积核扫过图片,只要DNA是不变的,那么它在图片上下左右的哪个位置看到的结果都相同,这便是卷积本身具有平移不变形的原理。

卷积的kernel本质

  • kernel具有局域性,只对图像中的局部区域敏感
  • 权重共享,一个kernel扫描整个图像,过程kernel的值是不变的

池化

池化,简言之,即取区域平均或最大

上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。

池化

扔掉周边长得差不多那些像素

本质:降采样,提升统计效率,局部特征不变性降维

在pooling的终结点, 我们得到的是一个降低维度了的图像,这个图像的含义是告诉你在原有的图像的每个区域里是含有1还是不含有1, 又叫做特征图。

梯度下降的困难

  1. 梯度的计算:目标函数经常是求和函数的形式,当样本量极大的时候
  2. 学习率的选择:太小导致收敛很慢,太大导致不收敛

牛顿法

缺点:

  1. 要求计算目标函数的二阶导数,高纬特征情况下,矩阵太大,计算和存储都有问题
  2. 小批量的情况下,牛顿法的计算结果噪音太大
  3. 目标函数非凸时,牛顿法更容易收敛到鞍点

python内存管理

答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制

一、对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

引用计数增加的情况:

1,一个对象分配一个新名称

2,将其放入一个容器中(如列表、元组或字典)

引用计数减少的情况:

1,使用del语句对对象别名显示的销毁

2,引用超出作用域或被重新赋值 sys.getrefcount( )函数可以获得对象的当前引用计数 多数情况下,引用计数比你猜测得要大得多。

对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

二、垃圾回收

1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。

2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

三、内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。

3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

损失函数

有什么要问的

( 1) 虽然在投递的时候有看到职位描述但很抽象,您能否具体描述一下,如果这个岗位具体需要是完成什么工作的,具体分工大概是怎样的?比如您可以说说您平时的工作大致是什么呢?

​ (2) 刚才问的那个技术问题某个细节我还不太明白,能解释下吗?

​ (3) 您可以对我刚刚的表现做一个评价,指出我有哪些不足吗?

​ (4) 如果我有机会被录用,接下来半年有哪些优先度比较高的任务需要我处理?

​ (5) 如果我很幸运被被录用,我能不能提前来实习?如果不能来,接下来的一年在学校,我学习什么可以对我今后的工作有帮助?

你可能感兴趣的:(保研夏令营)