数据挖掘笔试面试

Posted yumoye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据挖掘笔试面试相关的知识,希望对你有一定的参考价值。

【校招面经】机器学习与数据挖掘常见面试题整理 part1

注:以下是本人春招时看面经时收集的常见面试题,答案部分是由网上多个信息源整理而成,部分是个人解答。当时整理时只是自己看的,很多没有注明来源地址,后续有时间补上来源,如有侵权请告知。

 

一、PCA为什么要中心化

因为要算协方差。

单纯的线性变换只是产生了倍数缩放,无法消除量纲对协方差的影响,而协方差是为了让投影后方差最大。

 

二、PCA的主成分是什么

统计学中,主成分分析(PCA)是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。

主成分分析的原理是设法将原来变量重新组合成一组新的相互无关的几个综合变量,同时根据实际需要从中可以取出几个较少的综合变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析或称主分量分析,也是数学上处理降维的一种方法。主成分分析是设法将原来众多具有一定相关性(比如P个指标),重新组合成一组新的互相无关的综合指标来代替原来的指标。通常数学上的处理就是将原来P个指标作线性组合,作为新的综合指标。最经典的做法就是用F1(选取的第一个线性组合,即第一个综合指标)的方差来表达,即Va(rF1)越大,表示F1包含的信息越多。因此在所有的线性组合中选取的F1应该是方差最大的,故称F1为第一主成分。如果第一主成分不足以代表原来P个指标的信息,再考虑选取F2即选第二个线性组合,为了有效地反映原来信息,F1已有的信息就不需要再出现再F2中,用数学语言表达就是要求Cov(F1,F2)=0,则称F2为第二主成分,依此类推可以构造出第三、第四,……,第P个主成分。

 

三、为什么KNN可以避免样本不平衡

KNN只是取了最近的几个样本点做平均而已,离预测数据较远的训练数据对预测结果不会造成影响,但是svm、Bayes和NN每一个训练样本果都会对预测结果产生影响,于是如果样本不平衡的话KNN的效果最好,举个极端一点例子:答案只有A与B,但是训练样本中A的个数占99%,而B只有1%,svm、Bayes和NN训练出来的结果,恐怕预测任何数据给出的答案都是A,但是KNN不会。

 

四、Padding,Kernel-size,stride关系公式

像素宽度W,

Padding size:P,

Kernel size:K,

Stride : S,

n表示轮次,

公式为:Wn+1=(Wn+P∗2−K)/S+1

 

五、gini

技术图片

信息增益偏向于多值属性。尽管增益率调整了这种偏倚,但是它倾向于产生不平衡的划分,其中一个分区比其他分区小得多。基尼指数偏向于多值属性,并且当类的数量很大时会有困难。它还倾向于导致相等大小的分区和纯度。尽管是有偏的,但是这些度量在实践中产生相当好的结果。

 

六、kmeans初始点的选择

 1. 选择批次距离尽可能远的K个点

  首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。

2. 选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。

  常用的层次聚类算法有BIRCH和ROCK,在此不作介绍,下面简单介绍一下Canopy算法,主要摘自Mahout的Wiki:

  首先定义两个距离T1和T2,T1>T2.从初始的点的集合S中随机移除一个点P,然后对于还在S中的每个点I,计算该点I与点P的距离,如果距离小于T1,则将点I加入到点P所代表的Canopy中,如果距离小于T2,则将点I从集合S中移除,并将点I加入到点P所代表的Canopy中。迭代完一次之后,重新从集合S中随机选择一个点作为新的点P,然后重复执行以上步骤。

  Canopy算法执行完毕后会得到很多Canopy,可以认为每个Canopy都是一个Cluster,与KMeans等硬划分算法不同,Canopy的聚类结果中每个点有可能属于多个Canopy。我们可以选择距离每个Canopy的中心点最近的那个数据点,或者直接选择每个Canopy的中心点作为KMeans的初始K个类簇中心点。

 

七、kmeans++

k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。 1. 从输入的数据点集合中随机选择一个点作为第一个聚类中心 2. 对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x) 3. 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大 4. 重复2和3直到k个聚类中心被选出来 5. 利用这k个初始的聚类中心来运行标准的k-means算法

 

八、xgb中的贡献度(importance)是什么

根据结构分数的增益情况计算出来选择哪个特征的哪个分割点,某个特征的重要性,就是它在所有树中出现的次数之和。

(树模型特征重要性评估可参考:https://blog.csdn.net/u013382288/article/details/80838732

 

九、xgboost怎么处理缺失值

xgboost处理缺失值的方法和其他树模型不同,xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。

 

十、xgb和lgb的区别

  1. xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了务必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
  2. lightgbm使用了基于histogram的决策树算法,这一点不同与xgboost中的 exact 算法,histogram算法在内存和计算代价上都有不小优势。
  3. 内存上优势:很明显,直方图算法的内存消耗为(#data* #features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值),而xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。
  4. 计算上的优势,预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为(#data),而直方图算法只需要遍历桶就行了,时间为(#bin)
  5. 直方图做差加速
  6. 一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
  7. lightgbm支持直接输入categorical的feature
  8. 在对离散特征分裂时,每个取值都当作一个桶,分裂时的增益算的是”是否属于某个category“的gain。类似于one-hot编码。
  9. 但实际上xgboost的近似直方图算法也类似于lightgbm这里的直方图算法,为什么xgboost的近似算法比lightgbm还是慢很多呢?
  10. xgboost在每一层都动态构建直方图, 因为xgboost的直方图算法不是针对某个特定的feature,而是所有feature共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图,而lightgbm中对每个特征都有一个直方图,所以构建一次直方图就够了。
  11. lightgbm做了cache优化
  12. feature parallel:一般的feature parallel就是对数据做垂直分割(partiion data vertically,就是对属性分割),然后将分割后的数据分散到各个workder上,各个workers计算其拥有的数据的best splits point, 之后再汇总得到全局最优分割点。但是lightgbm说这种方法通讯开销比较大,lightgbm的做法是每个worker都拥有所有数据,再分割?(没懂,既然每个worker都有所有数据了,再汇总有什么意义?这个并行体现在哪里??)
  13. data parallel:传统的data parallel是将对数据集进行划分,也叫 平行分割(partion data horizontally), 分散到各个workers上之后,workers对得到的数据做直方图,汇总各个workers的直方图得到全局的直方图。 lightgbm也claim这个操作的通讯开销较大,lightgbm的做法是使用”Reduce Scatter“机制,不汇总所有直方图,只汇总不同worker的不同feature的直方图(原理?),在这个汇总的直方图上做split,最后同步。

 

十一、xgb的gamma,alpha,lambda等参数

1. alpha[默认1]权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。

2. lambda权重的L2正则化项(和Ridge regression类似)。 这个参数是用来控制XGBoost的正则化部分的 3. gamma[默认0]在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。

xgboost寻找分割点的标准是最大化gain. 考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中计算Gain按最大值找出最佳的分割点。它的计算公式分为四项, 可以由正则化项参数调整(lamda为叶子权重平方和的系数, gama为叶子数量): 第一项是假设分割的左孩子的权重分数, 第二项为右孩子, 第三项为不分割总体分数, 最后一项为引入一个节点的复杂度损失 由公式可知, gamma越大gain越小, lamda越大, gain可能小也可能大

 

十二、rf与gbdt之间的区别

1)相同点:都是由多棵树组成,最终的结果都是由多棵树一起决定。 2)不同点: a 组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成 b 组成随机森林的树可以并行生成,而GBDT是串行生成 c 随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和 d 随机森林对异常值不敏感,而GBDT对异常值比较敏感 e 随机森林是减少模型的方差,而GBDT是减少模型的偏差 f 随机森林不需要进行特征归一化。而GBDT则需要进行特征归一化

 

十三、nlp中常用的距离

1. 莱文斯坦距离:莱文斯坦距离(LD)用于衡量两个字符串之间的相似度。 以下我们称这两个字符串分别为 a (原字符串) 和 b (目标字符串)。莱文斯坦距离被定义为‘‘将字符串 a 变换为字符串 b 所需的删除、插入、替换操作的次数‘‘。

 

十四、lr与dt的区别

1. lr是线性的,dt可以处理非线性

2. lr不能有缺失值,dt可以缺失值

3. dt是贪心的,可能陷入局部最优

4. lr特征一定要标准化,dt可以不用

5. lr特征间要尽量独立,dt无所谓

 

十五、lr损失函数

技术图片

 

十六、lr和svm的区别

1. svm只由支持向量绝对划分平面,lr是所有样本都参与决策面的更新

2. svm对异常值不敏感,更稳健

 

十七、为什么gbdt需要归一化

1. 自身是梯度的过程,归一化加快收敛

2. 避免给样本加权的时候过度偏向一些范围大的特征的样本

 

十八、gbdt和xgb的差异

1.损失函数是用泰勒展式二项逼近,而不是像gbdt里的就是一阶导数 2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性 3.节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的gain 引用自:@Xijun LI

 

十九、熵与gini

既然这两个都可以表示数据的不确定性,不纯度。那么这两个有什么区别那?

1. Gini 指数的计算不需要对数运算,更加高效;

2. Gini 指数更偏向于连续属性,熵更偏向于离散属性。

 

二十、正负样本失衡问题

1. 上下采样方法,会影响样本的分布。上采样可以用SMOTE。

2. 正样本比较少,可以把负样本分成多个,每个和正样本训练一个模型,然后把多个模型ensemble

3. 公交卡发现小偷的案例(https://blog.csdn.net/u013382288/article/details/79301372),正负样本严重不平衡,那么先聚类,把正常的类拿掉,用剩下可能异常的样本训练模型

 

二十一、余弦距离与欧式距离求相似度的差别

1. 欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。

余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。

2. 从几何意义上来说,n维向量空间的一条线段作为底边和原点组成的三角形,其顶角大小是不确定的。也就是说对于两条空间向量,即使两点距离一定,他们的夹角余弦值也可以随意变化。

感性的认识,当两用户评分趋势一致时,但是评分值差距很大,余弦相似度倾向给出更优解。举个极端的例子,两用户只对两件商品评分,向量分别为(3,3)和(5,5),这两位用户的认知其实是一样的,但是欧式距离给出的解显然没有余弦值合理。

3. 余弦夹角可以有效规避个体相同认知中不同程度的差异表现,更注重维度之间的差异,而不注重数值上的差异;反过来思考,当向量夹角的余弦值较小(差异很大)时,欧氏距离可以很小(差异很小),如(0,1)和(1,0)两个点,所以如果要对电子商务用户做聚类,区分高价值用户和低价值用户,用消费次数和平均消费额,这个时候用余弦夹角是不恰当的,因为它会将(2,10)和(10,50)的用户算成相似用户,但显然后者的价值高得多,因为这个时候需要注重数值上的差异,而不是维度之间的差异。

 

二十二、优化kmeans计算速度

使用kd树或者ball tree 将所有的观测实例构建成一颗kd树,之前每个聚类中心都是需要和每个观测点做依次距离计算,现在这些聚类中心根据kd树只需要计算附近的一个局部区域即可

 

二十三、协同过滤与聚类推荐的区别

1. 原理上:协同过滤实际上是图的搜索算法,找到某个节点的邻域;聚类是图的分解算法,将节点分入几个类中

2. 使用上:协同过滤可以得到推荐排序,千人千面;聚类得到的是千人k面

3. 如果只使用人的属性或物品的属性,聚类可以冷启动,协同过滤不行

4. 计算上:协同过滤计算量大,大数据集下聚类会快一些。可以结合两者做,如先对用户进行聚类,然后用聚类代表做协同过滤

 

二十四、为什么lr用sigmoid

1. 因为是二分类问题,认为分类满足伯努利分布

技术图片

2. 求导快

3. 值域[0-1],单调递增

 

二十五、为什么xgboost要用泰勒展开,优势在哪里?

xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。

 

二十六、为什么l1容易得到0解,l2容易得到更多接近0的解

1. 图像法解释

技术图片

       可以看到,L1-ball 与L2-ball 的不同就在于L1在和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有w1=0,而更高维的时候(想象一下三维的L1-ball 是什么样的?)除了角点以外,还有很多边的轮廓也是既有很大的概率成为第一次相交的地方,又会产生稀疏性。

       相比之下,L2-ball 就没有这样的性质,因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么L1-regularization 能产生稀疏性,而L2-regularization 不行的原因了。

       总结:L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候非常有用,而Ridge就只是一种规则化而已。

2. 导数法解释:L1和L2的差别,为什么一个让绝对值最小,一个让平方最小,会有那么大的差别呢?看导数一个是1一个是w便知, 在靠进零附近, L1以匀速下降到零, 而L2则完全停下来了. 这说明L1是将不重要的特征(或者说, 重要性不在一个数量级上)尽快剔除, L2则是把特征贡献尽量压缩最小但不至于为零. 两者一起作用, 就是把重要性在一个数量级(重要性最高的)的那些特征一起平等共事(简言之, 不养闲人也不要超人)。

 

二十七、为什么ReLu要好过于tanh和sigmoid function

第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。

第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,参见@Haofeng Li 答案的第三点),从而无法完成深层网络的训练。

第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生

作者:Begin Again

链接:https://www.zhihu.com/question/29021768/answer/43488153

 

二十八、梯度提升方法Gradient Boosting

梯度提升算法初看起来不是很好理解,但我们和线性回归加以类比就容易了。回忆一下线性回归是希望找到一组参数使得残差最小化。如果只用一次项来解释二次曲线一定会有大量残差留下来,此时就可以用二次项来继续解释残差,所以可在模型中加入这个二次项。

同样的,梯度提升是先根据初始模型计算伪残差,之后建立一个基学习器来解释伪残差,该基学习器是在梯度方向上减少残差。再将基学习器乘上权重系数(学习速率)和原来的模型进行线性组合形成新的模型。这样反复迭代就可以找到一个使损失函数的期望达到最小的模型。在训练基学习器时可以使用再抽样方法,此时就称之为随机梯度提升算法stochastic gradient boosting。

 

二十九、随机梯度下降

1. target function一般是用估计出的模型计算所有训练数据估计label和真实label的差距之和,随机梯度就是随机取样一些训练数据,替代整个训练集,在其上作target function的梯度下降。

2. 因为只用少量样本,所以每一次比较快

3. 比梯度下降更能应付鞍点问题

 

三十、随机森林如何评估特征重要性

衡量变量重要性的方法有两种,Decrease GINI 和 Decrease Accuracy: 1) Decrease GINI: 对于回归问题,直接使用argmax(VarVarLeftVarRight)作为评判标准,即当前节点训练集的方差Var减去左节点的方差VarLeft和右节点的方差VarRight。 2) Decrease Accuracy:对于一棵树Tb(x),我们用OOB样本可以得到测试误差1;然后随机改变OOB样本的第j列:保持其他列不变,对第j列进行随机的上下置换,得到误差2。至此,我们可以用误差1-误差2来刻画变量j的重要性。基本思想就是,如果一个变量j足够重要,那么改变它会极大的增加测试误差;反之,如果改变它测试误差没有增大,则说明该变量不是那么的重要

 

以上是关于数据挖掘笔试面试的主要内容,如果未能解决你的问题,请参考以下文章

数据挖掘笔试+面试

面试笔试Java常见面试笔试总结

Java笔试面试题整理第一波

数据结构与算法笔试面试题整理

网络笔试面试题整理

数据挖掘笔试面试