机器学习面试中常考的知识点和代码实现(一)

2019-08-26 17:12:25 浏览数 (1)

作者:mantchs 著作权归作者所有。AI开发者获得授权转载,禁止二次转载 https://github.com/NLP-LOVE/ML-NLP

注:封面图片来自网络

前言

本文是机器学习面试中常考的知识点和代码实现,也是作为一个算法工程师必会的理论基础知识;既然是以面试为主要目的,亦不可以篇概全,请谅解,有问题可提出。

线性回归(Liner Regression)

什么是线性回归

  • 线性:两个变量之间的关系是一次函数关系的——图象是直线,叫做线性。
  • 非线性:两个变量之间的关系不是一次函数关系的——图象不是直线,叫做非线性。
  • 回归:人们在测量事物的时候因为客观条件所限,求得的都是测量值,而不是事物真实的值,为了能够得到真实值,无限次的进行测量,最后通过这些测量数据计算回归到真实值,这就是回归的由来。

能够解决什么样的问题

对大量的观测数据进行处理,从而得到比较符合事物内部规律的数学表达式。也就是说寻找到数据与数据之间的规律所在,从而就可以模拟出结果,也就是对结果进行预测。解决的就是通过已知的数据得到未知的结果。例如:对房价的预测、判断信用评价、电影票房预估等。

一般表达式是什么

w叫做x的系数,b叫做偏置项。

如何计算

Loss Function--MSE

利用梯度下降法找到最小值点,也就是最小误差,最后把 w 和 b 给求出来。

过拟合、欠拟合如何解决

使用正则化项,也就是给loss function加上一个参数项,正则化项有L1正则化、L2正则化、ElasticNet。加入这个正则化项好处:

  • 控制参数幅度,不让模型“无法无天”。
  • 限制参数搜索空间
  • 解决欠拟合与过拟合的问题。

1.什么是L2正则化(岭回归)

方程:

表示上面的 loss function ,在loss function的基础上加入w参数的平方和乘以

,假设:

回忆以前学过的单位元的方程:

正和L2正则化项一样,此时我们的任务变成在L约束下求出J取最小值的解。求解J0的过程可以画出等值线。同时L2正则化的函数L也可以在w1w2的二维平面上画出来。如下图:

L表示为图中的黑色圆形,随着梯度下降法的不断逼近,与圆第一次产生交点,而这个交点很难出现在坐标轴上。这就说明了L2正则化不容易得到稀疏矩阵,同时为了求出损失函数的最小值,使得w1和w2无限接近于0,达到防止过拟合的问题。

2.什么场景下用L2正则化

只要数据线性相关,用LinearRegression拟合的不是很好,需要正则化,可以考虑使用岭回归(L2), 如何输入特征的维度很高,而且是稀疏线性关系的话, 岭回归就不太合适,考虑使用Lasso回归。

3.什么是L1正则化(Lasso回归)

L1正则化与L2正则化的区别在于惩罚项的不同:

求解J0的过程可以画出等值线。同时L1正则化的函数也可以在w1w2的二维平面上画出来。如下图:

惩罚项表示为图中的黑色棱形,随着梯度下降法的不断逼近,与棱形第一次产生交点,而这个交点很容易出现在坐标轴上。这就说明了L1正则化容易得到稀疏矩阵。

4.什么场景下使用L1正则化

L1正则化(Lasso回归)可以使得一些特征的系数变小,甚至还使一些绝对值较小的系数直接变为0,从而增强模型的泛化能力 。对于高的特征数据,尤其是线性关系是稀疏的,就采用L1正则化(Lasso回归),或者是要在一堆特征里面找出主要的特征,那么L1正则化(Lasso回归)更是首选了。

5.什么是ElasticNet回归

ElasticNet综合了L1正则化项和L2正则化项,以下是它的公式:

6.ElasticNet回归的使用场景

ElasticNet在我们发现用Lasso回归太过(太多特征被稀疏为0),而岭回归也正则化的不够(回归系数衰减太慢)的时候,可以考虑使用ElasticNet回归来综合,得到比较好的结果。

线性回归要求因变量服从正态分布?

我们假设线性回归的噪声服从均值为0的正态分布。当噪声符合正态分布N(0,delta^2)时,因变量则符合正态分布N(ax(i) b,delta^2),其中预测函数y=ax(i) b。这个结论可以由正态分布的概率密度函数得到。也就是说当噪声符合正态分布时,其因变量必然也符合正态分布。

在用线性回归模型拟合数据之前,首先要求数据应符合或近似符合正态分布,否则得到的拟合函数不正确。

代码实现:

https://github.com/NLP-LOVE/ML-NLP/tree/master/Machine Learning/Liner Regression/demo

逻辑回归(Logistics Regression)

什么是逻辑回归

逻辑回归是用来做分类算法的,大家都熟悉线性回归,一般形式是Y=aX b,y的取值范围是[-∞, ∞],有这么多取值,怎么进行分类呢?不用担心,伟大的数学家已经为我们找到了一个方法。

也就是把Y的结果带入一个非线性变换的Sigmoid函数中,即可得到[0,1]之间取值范围的数S,S可以把它看成是一个概率值,如果我们设置概率阈值为0.5,那么S大于0.5可以看成是正样本,小于0.5看成是负样本,就可以进行分类了。

什么是Sigmoid函数

函数公式如下:

函数中t无论取什么值,其结果都在[0,-1]的区间内,回想一下,一个分类问题就有两种答案,一种是“是”,一种是“否”,那0对应着“否”,1对应着“是”,那又有人问了,你这不是[0,1]的区间吗,怎么会只有0和1呢?这个问题问得好,我们假设分类的阈值是0.5,那么超过0.5的归为1分类,低于0.5的归为0分类,阈值是可以自己设定的。

好了,接下来我们把aX b带入t中就得到了我们的逻辑回归的一般模型方程:

结果P也可以理解为概率,换句话说概率大于0.5的属于1分类,概率小于0.5的属于0分类,这就达到了分类的目的。

损失函数是什么

逻辑回归的损失函数是 log loss,也就是对数似然函数,函数公式如下:

公式中的 y=1 表示的是真实值为1时用第一个公式,真实 y=0 用第二个公式计算损失。为什么要加上log函数呢?可以试想一下,当真实样本为1时,但h=0概率,那么log0=∞,这就对模型最大的惩罚力度;当h=1时,那么log1=0,相当于没有惩罚,也就是没有损失,达到最优结果。所以数学家就想出了用log函数来表示损失函数。

最后按照梯度下降法一样,求解极小值点,得到想要的模型效果。

可以进行多分类吗?

可以的,其实我们可以从二分类问题过度到多分类问题(one vs rest),思路步骤如下:

1.将类型class1看作正样本,其他类型全部看作负样本,然后我们就可以得到样本标记类型为该类型的概率p1。

2.然后再将另外类型class2看作正样本,其他类型全部看作负样本,同理得到p2。

3.以此循环,我们可以得到该待预测样本的标记类型分别为类型class i时的概率pi,最后我们取pi中最大的那个概率对应的样本标记类型作为我们的待预测样本类型。

总之还是以二分类来依次划分,并求出最大概率结果。

逻辑回归有什么优点

  • LR能以概率的形式输出结果,而非只是0,1判定。
  • LR的可解释性强,可控度高(你要给老板讲的嘛…)。
  • 训练快,feature engineering之后效果赞。
  • 因为结果是概率,可以做ranking model。

逻辑回归有哪些应用

  • CTR预估/推荐系统的learning to rank/各种分类场景。
  • 某搜索引擎厂的广告CTR预估基线版是LR。
  • 某电商搜索排序/广告CTR预估基线版是LR。
  • 某电商的购物搭配推荐用了大量LR。
  • 某现在一天广告赚1000w 的新闻app排序基线是LR。

逻辑回归常用的优化方法有哪些

1.一阶方法

梯度下降、随机梯度下降、mini 随机梯度下降降法。随机梯度下降不但速度上比原始梯度下降要快,局部最优化问题时可以一定程度上抑制局部最优解的发生。

2.二阶方法:牛顿法、拟牛顿法:

这里详细说一下牛顿法的基本原理和牛顿法的应用方式。牛顿法其实就是通过切线与x轴的交点不断更新切线的位置,直到达到曲线与x轴的交点得到方程解。在实际应用中我们因为常常要求解凸优化问题,也就是要求解函数一阶导数为0的位置,而牛顿法恰好可以给这种问题提供解决方法。实际应用中牛顿法首先选择一个点作为起始点,并进行一次二阶泰勒展开得到导数为0的点进行一个更新,直到达到要求,这时牛顿法也就成了二阶求解问题,比一阶方法更快。我们常常看到的x通常为一个多维向量,这也就引出了Hessian矩阵的概念(就是x的二阶导数矩阵)。

缺点:牛顿法是定长迭代,没有步长因子,所以不能保证函数值稳定的下降,严重时甚至会失败。还有就是牛顿法要求函数一定是二阶可导的。而且计算Hessian矩阵的逆复杂度很大。

拟牛顿法:不用二阶偏导而是构造出Hessian矩阵的近似正定对称矩阵的方法称为拟牛顿法。拟牛顿法的思路就是用一个特别的表达形式来模拟Hessian矩阵或者是他的逆使得表达式满足拟牛顿条件。主要有DFP法(逼近Hession的逆)、BFGS(直接逼近Hession矩阵)、 L-BFGS(可以减少BFGS所需的存储空间)。

逻辑斯特回归为什么要对特征进行离散化。

  • 非线性!非线性!非线性!逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;离散特征的增加和减少都很容易,易于模型的快速迭代;
  • 速度快!速度快!速度快!稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  • 鲁棒性!鲁棒性!鲁棒性!离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  • 方便交叉与特征组合:离散化后可以进行特征交叉,由M N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  • 稳定性:特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
  • 简化模型:特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

逻辑回归的目标函数中增大L1正则化会是什么结果。

所有的参数w都会变成0。

代码实现:

https://github.com/NLP-LOVE/ML-NLP/blob/master/Machine Learning/2.Logistics Regression/demo/CreditScoring.ipynb

0 人点赞