假装下面这些是我面华为网易腾讯百度阿里美团京东宇宙条商汤科大讯飞搜狐新浪时会遇到的问题,不要太难。
【参考文献】
[1] 周志华. 机器学习.
[2] 李航. 统计学习方法.
[3] 若干博客.
一、数据标准化、归一化
数据归一化主要是使所有特征具有相同的权重,并能加快梯度下降速度,但不会提高模型的精度。有两个图体会一下
常用方法:
(1) 线性归一化*
简单公式表达:y = (x-min)/(max -min)
其中,x是归一化之前的数据,y是归一化之后的数据,max和 min分别对应这一组数据中的最大值和最小值,y的范围:[0,1]。
适用于:把原来数据等比例缩放限定在某一范围内,在不涉及距离度量和协方差计算的时候使用。
(2) 标准差归一化*
简单公式表达:y = (x-μ)/σ
其中,x,y分别对应归一化前后数据。μ代表这组数据的均值,σ代表这组数据的方差。
适用于:原来数据近似高斯分布,同时是距离度量的。
(3) 对数归一化
简单公示表达:y= log10(x)
其中,x,y分别对应归一化前后数据。
(4) 反余切归一化(原理类似对数归一化)
简单公示表达:y = atan(x)*2/pi
其中,x,y分别对应归一化前后数据。反余切函数的范围在[0,π/2],因此对反余切得到的值乘2除π,把范围控制在[0,1]。
二、 降维的好处
(1)减少所需的存储空间。
(2)加快计算速度,更少的维数意味着更少的计算,并且更少的维数可以允许使用不适合大量维数的算法。
(3)去除冗余特征,例如在以平方米和平方英里存储地形尺寸方面没有意义
(4)将数据的维数降低到2D或3D可以允许我们绘制和可视化它,可能观察模式,给我们提供直观感受。
(5)太多的特征或太复杂的模型可能导致过拟合。
三、 特征选择
1.过滤式选择:即先对数据集进行特征选择,再训练学习器,特征选择过程与学习过程无关。
以Relief方法为例,设计一个叫做相关统计量的向量,维度等于总特征数,每个分量可以看作是特征的权重。学好之后,或者设定一个阈值,大于阈值的分量对应的特征作为最终选择的特征,或者设定一个数量k,前k个最大的分量对应的特征作为最终选择的特征。
确定相关统计量的方法是:
(1)对每个样本x,找到同类中最近的样本y,再找到异类中最近的样本z。
(2)遍历每个特征,在当前特征j上,若d(xj,yj),则增大j的统计量分量;否则,减小j的统计量分量。
2.包裹式选择:把学习器的性能作为特征子集评价的标准,相当于是为学习器量身定做特征子集。
以LVW方法为例:先随机产生特征子集,计算某学习器在当前特征子集的交叉验证产生的分类误差,若当前分类误差小于上一次的分类误差,或者分类误差与上一次相等但特征数更少,则选用该特征子集,重复刚才的过程;否则,再重新随机产生子集重复刚才的过程,直到达到最大次数。
3.嵌入式选择:特征选择与学习器的训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中就自动进行特征选择了。
岭回归和Lasso回归就属于嵌入式选择。
四、 数据增强
1.为什么要对数据进行增强?
增加数据量,防止过拟合,提高模型的泛化能力。
2.分类:离线增强和在线增强
(1)离线增强:预先进行所有必要的变换,从根本上增加数据集的规模。这个方法常被用于相对较小的数据集。因为你最终会通过一个与执行的转换数量相等的因子来增加数据集的大小(例如,通过翻转所有图像,数据集数量会增加2倍)。
(2)在线增强(动态增强):小批量执行变换,仅仅在输入机器学习模型之前。主要应用于规模较大的数据集,因为你无法负担数据量爆炸性增长。反而,你可以通过对即将输入模型的小批量数据的执行相应的变化。很多机器学习架构已经支持在线增强,并可以利用GPU进行加速。
3.常用方法:
(1)低级的:翻转、旋转、放缩、裁剪、平移、加入扰动(如高斯噪声)
(2)高级的:用GAN生成更多样本、插值方法(即填充未知空间)
五、 处理缺失数据
1. 丢弃
如果数据量很大,或丢失的值所在的特征不是那么重要,可以丢弃数据。
2. 补齐
(1)人工填写:很费时,不推荐。
(2)特殊值补充:比如用unknow填充,但会导致数据偏离,不推荐。
(3)平均值填充:当缺失值为数值属性,用平均值填充;当缺失值为非数据属性,用众数填充。
(4)K近邻填充:先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。
(5)热卡填充(就近补齐):在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。
(6)回归填充:基于完整的数据集,建立回归方程。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关时会导致有偏差的估计。
还有几个更复杂的,不想写了,详见:https://blog.csdn.net/lujiandong1/article/details/52654703
六、 模型评估方法
1.留出法
将数据集随机划分为两部分(注意分层采样),一部分作训练,另一部分作测试。多次划分并评估,取平均值。
2.交叉验证法
将数据集分层抽样划分k个互斥子集,遍历这k个子集,每次都用k-1个作训练,1个作测试,得到k个结果,取平均,即k折交叉验证。也可以重复划分n次,取平均,即n次k折交叉验证。
3.留一法
假设数据量为N,遍历N个样本,每次都用N-1个样本作训练,1个样本作测试,取平均。但计算开销太大。
4.自助法
假设数据量为N,每次从数据集中有放回地取一个样本,重复N次,得到样本量为N的新数据集,用这个数据集作训练,没用取到的样本作测试。实际上,初始数据集中约有36.8%的样本没有被抽到。
自助法改变了初始数据集的分布,会引入估计偏差。留出法和交叉验证法更常用。
七、 模型性能度量
1.错误率与精度
错误率:分类错误的样本数占样本总数的比例;
精度:分类正确的样本数占样本总数的比例;
不适用于不平衡数据集。
2.查准率、查全率与F1
a)查准率(准确率)P:挑出的西瓜中,好瓜的比例。
b)查全率(召回率)R:所有好瓜中,挑出来的好瓜的比例。
c)P-R曲线
若一个学习器的P-R曲线被另一个学习器完全包住,则后者的性能优于前者。当存在交叉时,可以计算曲线围住面积,但比较麻烦,常用平衡点(查准率=查全率,BEP)度量,越大越好。
d)F1度量:2PR/(P+R),
更一般的形式:(1+a^2)PR/(a^2+R)
a>1希望查全率更重要,a<1希望查准率更重要。
在商品推荐系统中,希望查准率高一些,即在推荐的商品中,用户真正感兴趣的越多越好,而不是用户所有感兴趣的都要推荐出来。
在追查逃犯时,希望查全率高一些,即所有的逃犯中,实际追查到的越多越好,而不是在追查到的人中,逃犯越多越好。
当有多个二分类混淆矩阵时,希望估计算法的全局性能,即宏P/R/f1和微P/R/F1。
e)宏查准率、宏查全率、宏F1
以宏查准率为例:先计算每个混淆矩阵的查准率,再得到平均查准率,即宏查准率。
f)微查准率、微查全率、微F1
以微查准率为例:先计算平均混淆矩阵,再计算查准率,即微查准率。
3.ROC与AUC
a)真正例率(TPR):正例中预测为正例的比例
b)假正例率(FPR):反例中预测为正例的比例
ROC的横轴为真正例率,纵轴为假正例率。若一个模型的ROC曲线被另一个包住,则另一个更好。ROC曲线下的面积叫做AUC,AUC越大,模型越好。
4.代价敏感错误率与代价曲线
在现实中,不同错误所造成的后果不同,例如,把健康人诊断为患者,只是增加了干净诊断开销,而把患者诊断为病人,则会推行最佳治疗时机。有如下的二分类代价矩阵
一般情况下,cost10和cost01是不同的,此时的代价敏感错误率为
E=([0类中误分类点]*cost01+[1类中误分类点]*cost10)/m
(代价曲线暂时看不懂-_-|)
八、 偏差-方差分解
先看4个图,直观感受一下偏差和方差
九、 多分类学习
本身可以进行多分类的模型有:k近邻算法、朴素贝叶斯、决策树、随机森林、逻辑回归、神经网络等,但更多时候是通过一些策略,利用二分类问题来解决多分类问题的。
基本思想是先对问题进行拆分,然后为拆分的每个二分类任务训练一个分类器;在测试时,对这些分类器的结果进行集成以获得最终的分类结果。
1.一对一
假设一共有N个类别,这些类别两两组合,共N(N-1)/2种组合,对每种组合都训练一个分类器并进行分类,最后把预测结果最多的类别作为最终类别。
2.一对多
假设一共有N个类别,遍历这N个类别,每次把当前类别作为正例,其他类别作为反例,训练N个分类器,并进行分类。在测试时若只有一个分类器预测为正例,则对应的类别就是最终结果;若有多个分类器预测为正例,取置信度最大的那个类(比如逻辑回归中输出的概率)。
3.多对多
以纠错输出码(ECOC)为例,主要分两步:
编码:如图,对N个类别进行M次划分,每次划分都划分为正例和反例,然后训练M个分类器。
解码:用这些分类器对测试样本分别预测,得到M个结果,组成一个编码,用这个编码和每个类别对应的编码算距离,取最近的那个类别作为最终类别。
十、 梯度弥散与梯度爆炸
1.直接原因有两个:
(1)深度学习的网络层数太多,在进行反向传播时根据链式法则,要连乘每一层梯度值。
(2)每一层的梯度值是由,非线性函数的导数以及本层的权重相乘得到的,这样非线性的导数的大小和初始化权重的大小会直接影响是否发生梯度弥散或者梯度爆炸。
比如激活函数用sigmoid函数时,由于其导数最大也才0。25,所以反向一层层乘回去时,梯度会越来越小。
再比如当初始化权重过大时,从输出层一层一层乘回来时,梯度会越来越大。
2.解决方法:
(1)梯度剪切:设置一个梯度剪切阈值,当更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,这可以防止梯度爆炸。
(2)权重正则化:有L1正则和L2正则,以L2正则为例:Loss=(y−W*x)2+alpha*||W||^2,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。
(3)使用Relu、LeakRelu、Elu等激活函数,可有效防止梯度弥散。
Relu的x负半轴是0,LeakRelu的x负半轴是kx,Elu的x负半轴是a(e^x-1),弯的。
Relu缓解了梯度弥散,计算速度快,但由于负数部分恒为0,会导致一些神经元无法激活,而LeakRelu和Elu很好地解决了这个问题,但Elu比LeakRelu计算慢一些。
(4)Batch Normalization(BN)
传统的神经网络,只是在将样本x输入输入层之前对x进行标准化处理(减均值,除以标准差),以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化。消除了权重带来的放大、缩小的影响,同时也能够加速收敛。
(5)残差网络
残差网络中,因为有shortcut的存在,反向传播时能无损地传播梯度。既能增加网络深度,又能避免梯度弥散和退化问题。
(6)LSTM
LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates)。LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。
十一、 处理不平衡数据
大体可分为数据层面和算法层面
1.数据层面
(1)重采样:
a)上采样:复制稀有类的样本 , 但是这样做容易导致过拟合。
b)下采样:舍弃部分大类样本 , 降低不平衡程度。
(2)训练集划分方法:
首先根据代价敏感学习的需要,学习一个合理的类别样本分布比例。然后将大类样本随机划分成一系列不相交子集。这些子集的大小由稀有类样本集的数量和预先学习的样本分布比例决定。接下来分别将这些不相交子集跟稀有类样本结合, 组成一系列平衡的分类子问题,单独训练成子分类器,最后通过元学习将这些子分类器的输出进一步学习成组合分类器,这种方法在信用卡非法使用检测问题上大大降低了总代价。
2.算法层面
(1)分类器集成方法
平衡随机森林的方法,该方法对正类和反类分别进行重采样,重采样多次后采用多数投票的方法进行集成学习。
(2)代价敏感方法
在大部分不平衡分类问题中,稀有类是分类的重点。在这种情况下,正确识别出稀有类的样本比识别大类的样本更有价值。反过来说,错分稀有类的样本需要付出更大的代价。代价敏感学习赋予各个类别不同的错分代价 ,它能很好地解决不平衡分类问题。以两类问题为例,假设正类是稀有类,并具有更高的错分代价,则分类器在训练时,会对错分正类样本做更大的惩罚,迫使最终分类器对正类样本有更高的识别率。
代价敏感学习能有效地提高稀有类的识别率。但问题是,一方面,在多数情况下,真实的错分代价很难被准确地估计。另一方面,虽然许多分类器 可以直接引入代价敏感学习机制,如支持向量机和决策树,但是也有一些分类器不能直接使用代价敏感学习,只能通过调整正负样本比例或者决策阈值间接的实现代价敏感学习,这样不能保证代价敏感学习的效果。
(3)特征选择方法
当样本数量分布很不平衡时,特征的分布同样会不平衡。尤其在文本分类问题中,在大类中经常出现的特征,也许在稀有类中根本不出现。因此,根据不平衡分类问题的特点,选取最具有区分能力的特征,有利于提高稀有类的识别率。
十二、 矩阵计算顺序
假设有3个稠密矩阵A,B,C的尺寸分别为m*n,n*p,p*q,且m
规律:先算小的,再算大的。
十三、 为什么对图像使用卷积而不仅仅是FC层
(1)卷积保存、编码和实际使用来自图像的空间信息。如果我们只使用FC层,我们将没有相对的空间信息。
(2)卷积神经网络( CNNs )具有部分内建的平移不变性,因为每个卷积核充当其自身的滤波器/特征检测器。
十四、 什么使CNNs具有平移不变性
如上所述,每个卷积核充当它自己的滤波器/特征检测器。假设您正在进行目标检测,目标在图像中的位置并不重要,因为无论如何,我们将在整个图像中以滑动窗口的方式应用卷积。
十五、 为什么分类CNNs模型中需要max-pooling
CNN中的最大池化允许您减少计算量,因为池化后feature maps变小了,不会丢失太多的语义信息,因为您正在进行最大程度的激活。还有一种理论认为,最大池化对CNNs的平移不变性有一定的贡献。总之,池化可以加快计算速度,防止过拟合。
十六、 为什么在图像分割中CNNs通常具有编码器-解码器结构
编码器CNN基本上可以被认为是特征提取网络,而解码器使用该信息通过“解码”特征并放大到原始图像大小来预测图像分割区域。
十七、 如何有效避免过拟合
(1)L2正则化:通过减小w的值来防止过拟合(可参考曲线拟合来理解)
(2)Dropout:每次迭代都随机删除一部分隐藏单元。
(3)数据集扩增:可通过数据增强来扩增。
(4)Early stopping:迭代早点停。
十八、 L0/L1/L2范数的区别
L0/L1可以实现稀疏,产生少量的特征,从而进行特征选择。
L2可以产生很小的特征,避免模型过拟合,提高模型的泛化能力。