机器学习面经
1. 机器学习常见面试问题
- 算法要从以下几个方面来掌握:
- 产生背景,适用场合(数据规模,特征维度,是否有 Online 算法,离散/连续特征处理等角度);
- 原理推导(最大间隔,软间隔,对偶);
- 求解方法(随机梯度下降、拟牛顿法等优化算法);
- 优缺点,相关改进;
- 和其他基本方法的对比;
1.1 各模型优缺点
SVM
特性:
- 非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
- 对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
- 支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量;
- SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的 “转导推理”,大大简化了通常的分类和回归等问题。
- SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了 “维数灾难”。
- 少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:
a. 增、删非支持向量样本对模型没有影响;
b. 支持向量样本集具有一定的鲁棒性;
c. 有些成功的应用中,SVM 方法对核的选取不敏感; - SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法(如基于规则的分类器和人工神经网络)都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。
- SVM通过最大化决策边界的边缘来控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。
- SVM在小样本训练集上能够得到比其它算法好很多的结果。支持向量机之所以成为目前最常用,效果最好的分类器之一,在于其优秀的泛化能力,这是是因为其本身的优化目标是结构化风险最小,而不是经验风险最小,因此,通过margin的概念,得到对数据分布的结构化描述,因此减低了对数据规模和数据分布的要求。SVM也并不是在任何场景都比其他算法好,对于每种应用,最好尝试多种算法,然后评估结果。如SVM在邮件分类上,还不如逻辑回归、KNN、bayes的效果好。
- 它基于结构风险最小化原则,这样就避免了过学习问题,泛化能力强。
- 它是一个凸优化问题,因此局部最优解一定是全局最优解的优点。
- 泛华错误率低,分类速度快,结果易解释
不足:
- SVM算法对大规模训练样本难以实施
SVM的空间消耗主要是存储训练样本和核矩阵,由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及 m 阶矩阵的计算(m为样本的个数),当 m 数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法。
如果数据量很大,SVM的训练时间就会比较长,如垃圾邮件的分类检测,没有使用SVM分类器,而是使用了简单的naive bayes分类器,或者是使用逻辑回归模型分类。 - 用SVM解决多分类问题存在困难
经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。 - 对缺失数据敏感,对参数和核函数的选择敏感
支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法。目前比较成熟的核函数及其参数的选择都是人为的,根据经验来选取的,带有一定的随意性。在不同的问题领域,核函数应当具有不同的形式和参数,所以在选取时候应该将领域知识引入进来,但是目前还没有好的方法来解决核函数的选取问题。
- SVM算法对大规模训练样本难以实施
- 支持向量机的主要应用和研究的热点
目前支持向量机主要应用在模式识别领域中的文本识别,中文分类,人脸识别等;同时也应用到许多的工程技术和信息过滤等方面。
当前研究的热点主要是对支持向量机中算法的优化,包括解决SVM中二次规划求解问题,对大规模SVM的求解问题,对SVM中QP问题的求解问题等,另外就是如何更好的构造基于SVM的多类分类器,如何提高SVM的归纳能力和分类速度等,如何根据实际问题确定核函数也是一个重要的研究热点。
LR
优点
- 实现简单,广泛的应用于工业问题上;
- 分类时计算量非常小,速度很快,存储资源低;
- 便利的观测样本概率分数;
- 对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题;
不足
- 当特征空间很大时,逻辑回归的性能不是很好;
- 容易欠拟合,一般准确度不太高;
- 不能很好地处理大量多类特征或变量;
- 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;
决策树
优点
- 决策树易于理解和实现. 人们在通过解释后都有能力去理解决策树所表达的意义。
- 需要准备的数据量不大,而其他的技术往往需要很大的数据集,需要创建虚拟变量,去除不完整的数据,但是该算法对于丢失的数据不能进行准确的预测
- 决策树算法的时间复杂度(即预测数据)是用于训练决策树的数据点的对数
- 对于决策树,数据的准备往往是简单或者是不必要的。其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。
- 能够同时处理数据型和常规型属性。其他的技术往往要求数据属性的单一。
- 在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
- 对缺失值不敏感
- 可以处理不相关特征数据
- 效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。
不足
- 决策树算法学习者可以创建复杂的树,但是没有推广依据,这就是所谓的过拟合,为了避免这种问题,出现了剪枝的概念,即设置一个叶子结点所需要的最小数目或者设置树的最大深度
- 决策树的结果可能是不稳定的,因为在数据中一个很小的变化可能导致生成一个完全不同的树,这个问题可以通过使用集成决策树来解决
- 众所周知,学习一恶搞最优决策树的问题是NP——得到几方面完全的优越性,甚至是一些简单的概念。因此,实际决策树学习算法是基于启发式算法,如贪婪算法,寻求在每个节点上的局部最优决策。这样的算法不能保证返回全局最优决策树。这可以减轻训练多棵树的合奏学习者,在那里的功能和样本随机抽样更换。
- 在处理特征关联性比较强的数据时表现得不是太好
1.2 过拟合原因
数据:数据不规范,数据量少,数据穿越,统计特征用到了未来的信息或者标签信息
算法:算法过于复杂
解决:
1. 将数据规范化,处理缺失值,增加数据量,采样,添加噪声数据
2. 正则化,控制模型复杂程度
3. early stoping,减少迭代次数,减少树的深度
4. 学习率调大/小点
5. 融合几个模型
6. dropout、regularization、batch normalizatin
1.3 L1和L2的区别
- L1是Lasso Regression,表示向量中每个元素绝对值的和:L1范数的解通常是稀疏性的,倾向于选择数目较少的一些非常大的值或者数目较多的 insignificant 的小值。
- L2是岭回归,Ridge Regression,是欧氏距离也就是平方和的平方根。L2范数越小,可以使得w的每个元素都很小,接近于0,但与 L1 范数不同的是他不会让它等于 0 而是接近于 0。
- L1 正则化的w可取的值是转置的方形,L2 对应的是圆形。这样损失函数 l(w) l ( w ) 的最小值更容易在 L1 对应的边角上取得,从而这些维度变成 0 了。
- 从贝叶斯的角度来看,加入正则项相当于加入了一种先验。即当训练一个模型时,仅依靠当前的训练数据集是不够的,为了实现更好的泛化能力,往往需要加入先验项。
L1范数相当于加入了一个Laplacean先验;
L2范数相当于加入了一个Gaussian先验。
L2对大数的惩罚更大,但是解相对来说比较均匀。
1.4 生成模型和判别模型区别
对于输入x,类别标签y:
生成式模型先求它们的联合概率分布 P(x,y) P ( x , y ) ,然后根据贝叶斯定理求 P(y|x) P ( y | x )判别式模型直接求条件概率分布 P(y|x) P ( y | x )
常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场
- 常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机
1.5 SVM 算法
- SVM是一种二类分类的模型,它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。
- 惩罚因子 C 决定了你有多重视离群点带来的损失,显然当所有离群点的松弛变量的和一定时,你定的 C 越大,对目标函数的损失也越大,此时就暗示着你非常不愿意放弃这些离群点,最极端的情况是你把C定为无限大,这样只要稍有一个点离群,目标函数的值马上变成无限大,马上让问题变成无解,这就退化成了硬间隔问题。
- 惩罚因子C不是一个变量,整个优化问题在解的时候,C是一个你必须事先指定的值,指定这个值以后,解一下,得到一个分类器,然后用测试数据看看结果怎么样,如果不够好,换一个C的值,再解一次优化问题,得到另一个分类器,再看看效果,如此就是一个参数寻优的过程,但这和优化问题本身决不是一回事,优化问题在解的过程中,C一直是定值,要记住。
- 解决过拟合的办法是为 SVM 引入了松弛变量
ξ
ξ
(slack variable),将SVM公式的约束条件改为
12||w||2+C∑Ni=1ξi
1
2
|
|
w
|
|
2
+
C
∑
i
=
1
N
ξ
i
。因为松弛变量能够容忍异常点的存在,我们的支持向量和超平面尽量不会受到它的影响。 我们加上松弛变量的平方和,并求最小值。这样就达到一个平衡:
既希望松弛变量存在以解决异常点问题,又不希望松弛变量太大导致分类解决太差。
1.6 LR和SVM的联系与区别
- 联系:
- LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题)
- 两个方法都可以增加不同的正则化项,如 L1、L2 等等。所以在很多实验中,两种算法的结果是很接近的。
- 区别:
- LR是参数模型,SVM是非参数模型。
- 从目标函数来看,区别在于逻辑回归采用的是 logistical loss,SVM采用的是 hinge loss。这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
- SVM的处理方法是只考虑 support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
- 逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
- LR 能做的 SVM 能做,但可能在准确率上有问题,SVM 能做的 LR 有的做不了。
1.7 RF GBDT XGBoost的区别与联系
Gradient boosting(GB)
机器学习中的学习算法的目标是为了优化或者说最小化 Loss Function, Gradient boosting 的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型 Fm+1(x) F m + 1 ( x ) 基于前面学习模型的 Fm(x) F m ( x ) 的效果生成的。Gradient boosting Decision Tree(GBDT)
GB 算法中最典型的基学习器是决策树,尤其是 CART,正如名字的含义,GBDT是GB和DT的结合。要注意的是这里的决策树是回归树,GBDT中的决策树是个弱模型,深度较小一般不会超过5,叶子节点的数量也不会超过 10,对于生成的每棵决策树乘上比较小的缩减系数(学习率 < 0.1),有些GBDT的实现加入了随机抽样( subsample0.5≤f≤0.8 s u b s a m p l e 0.5 ≤ f ≤ 0.8 )提高模型的泛化能力。通过交叉验证的方法选择最优的参数。XGBoost
XGBoost是 GB 算法的高效实现,XGBoost中的基学习器除了可以是CART(GB tree)也可以是线性分类器(GB linear)。- XGBoost在目标函数中显示的加上了正则化项,基学习为CART时,正则化项与树的叶子节点的数量 T T 和叶子节点的值有关。
- GB中使用 Loss Function 对 的一阶导数计算出伪残差用于学习生成 fm(x) f m ( x ) ,XGBoost 不仅使用到了一阶导数,还使用二阶导数。
上面提到 CART 回归树中寻找最佳分割点的衡量标准是最小化均方差,XGBoost 寻找分割点的标准是最大化,lamda,gama与正则化项相关。
XGBoost 算法的步骤和 GB 基本相同,都是首先初始化为一个常数,GB 是根据一阶导数 ri r i ,XGBoost 是根据一阶导数 gi g i 和二阶导数 hi h i ,迭代生成基学习器,相加更新学习器。
XGBoost 与 GBDT 除了上述三点的不同,XGBoost 在实现时还做了许多优化:
- 在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,XGBoost 实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
- XGBoost 考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper 提到50倍。 特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然 XGBoost 算法迭代必须串行,但是在处理每个特征列时可以做到并行。 按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致 cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。
- xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。
Random Forest:
bagging (原本叫Bootstrap aggregating)
bagging 的关键是重复的对经过 bootstrapped 采样来的观测集子集进行拟合。然后求平均。一个 bagged tree 充分利用近2/3的样本集。所以就有了OOB预估(out of bag estimation)学习随机森林模型前,一定要先了解决策树模型。树越深,模型越复杂。
- 决策树模型的优点如下:
- 容易理解和解释,树可以被可视化。
- 不需要太多的数据预处理工作,即不需要进行数据归一化,创造哑变量等操作。
- 隐含地创造了多个联合特征,并能够解决非线性问题。
- 决策树模型最大的缺点是容易过拟合。
- 随机森林由很多棵不同的决策树构成,对于一个给定的预测对象,每棵决策树都输出一个 label,最后采取“投票”的方式,选择得票最多的 label 作为最终结果。随机森林是一种集成方法,也被认为是最近邻预测器的一种。集成方法是将一组弱分类器以一定的方式组合起来,形成一个强分类器。
- 随机森林的错误率依赖两件事:
- 树之间的相关性越大,整体错误率越高。
- 单棵树的错误率越高,整体错误率越高。
- 随机森林的优点与缺点:
- 优点:
- 容易理解和解释,树可以被可视化。
- 不需要太多的数据预处理工作,即不需要进行数据归一化,创造哑变量等操作。
- 隐含地创造了多个联合特征,并能够解决非线性问题。
- 和决策树模型,GBDT模型相比,随机森林模型不容易过拟合。
- 自带out-of-bag (oob)错误评估功能。
- 易于并行化。
- 缺点:
- 不适合小样本,只适合大样本。
- 大多数情况下,RF模型的精度略低于GBDT模型的精度。
- 适合决策边界是矩形的,不适合对角线型的。
- 优点:
- 决策树模型的优点如下:
GBDT和随机森林的相同点与不同点:
相同点:
- 都是由多棵树组成
- 最终的结果都是由多棵树一起决定
不同点:
- 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
- 组成随机森林的树可以并行生成;而 GBDT 只能是串行生成
- 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
- 随机森林对异常值不敏感,GBDT对异常值非常敏感
- 随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
- 随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
- 随机森林不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化
XBGoost 比 GBDT 好的地方:
二阶泰勒展开
节点分数惩罚
增益计算不同,GBDT 是 gini,XBGoost 是优化推导公式XGBoost 泰勒展开的优势
XGBoost 使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得二阶倒数形式, 可以在不选定损失函数具体形式的情况下用于算法优化分析.本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了 XGBoost 的适用性。
1.8 优化算法及其优缺点
- 随即梯度下降
- 优点:
- 可以一定程度上解决局部最优解的问题
- 缺点:
- 收敛速度较慢
- 优点:
- 批量梯度下降
- 优点:
- 容易陷入局部最优解
- 缺点:
- 收敛速度较快
- 优点:
- mini_batch梯度下降
综合随即梯度下降和批量梯度下降的优缺点,提取的一个中和的方法。 - 牛顿法
- 优点:
- 缺点:
- 拟牛顿法
- 优点:
- 缺点:
- 启发式的优化算法
启发式的优化算法有遗传算法,粒子群算法等。这类算法的主要思想就是设定一个目标函数,每次迭代根据相应的策略优化种群。直到满足什么样的条件为止。
1.9 梯度消失和梯度膨胀
梯度消失:
- 根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0
- 可以采用ReLU激活函数有效的解决梯度消失的情况
梯度膨胀:
- 根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大
- 可以通过激活函数来解决
1.20 欧氏距离与曼哈顿距离
- 欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,对应于L2
- 曼哈顿距离,我们可以定义曼哈顿距离的正式意义为 L1-距离 或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。
- 通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。而实际驾驶距离就是这个“曼哈顿距离”,这也是曼哈顿距离名称的来源, 同时,曼哈顿距离也称为城市街区距离(City Block distance)。
1.21 数据归一化
归一化为什么能提高梯度下降法求解最优解的速度?
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;
对原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。归一化有可能提高精度
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
1.22 逻辑斯特回归为什么要对特征进行离散化
- 在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列 0、1 特征交给逻辑回归模型,这样做的优势有以下几点:
- 离散特征的增加和减少都很容易,易于模型的快速迭代;
- 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
- 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
- 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
- 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
- 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
- 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。
1.23 XGBoost 和 GBDT 的区别
算法层面的:
- XGB加了正则项,普通GBDT没有。为了防止过拟合
- XGBoost损失函数是误差部分是二阶泰勒展开,GBDT 是一阶泰勒展开。因此损失函数近似的更精准。
- 对每颗子树增加一个参数,使得每颗子树的权重降低,防止过拟合,这个参数叫shrinkage对特征进行降采样,灵感来源于随机森林,除了能降低计算量外,还能防止过拟合。
- 实现了利用分捅/分位数方法,实现了全局和局部的近似分裂点算法,降低了计算量,并且在eps参数设置合理的情况下,能达到穷举法几乎一样的性能
- 提出并实现了特征带权重的分位数的方法(好像是用到rank 场景下的,没太懂。。。)
- 增加处理缺失值的方案(通过枚举所有缺失值在当前节点是进入左子树,还是进入右子树更优来决定一个处理缺失值默认的方向)。
系统层面:
- 对每个特征进行分块(block)并排序,使得在寻找最佳分裂点的时候能够并行化计算。这是xgboost比一般GBDT更快的一个重要原因。
- 通过设置合理的block的大小,充分利用了 CPU 缓存进行读取加速(cache-aware access)。使得数据读取的速度更快。因为太小的block的尺寸使得多线程中每个线程负载太小降低了并行效率。太大的block尺寸会导致CPU的缓存获取miss掉。
- out-of-core 通过将block压缩(block compressoin)并存储到硬盘上,并且通过将block分区到多个硬盘上(block Sharding)实现了更大的IO 读写速度,因此,因为加入了硬盘存储block读写的部分不仅仅使得xgboost处理大数据量的能力有所提升,并且通过提高IO的吞吐量使得xgboost相比一般实利用这种技术实现大数据计算的框架更快。
2. 机器学习、大数据面试经验、答题思路
你在研究/项目/实习经历中主要用过哪些机器学习/数据挖掘的算法?
A、最好是在项目/实习的大数据场景里用过,比如推荐里用过 CF、LR,分类里用过 SVM、GBDT
B、一般用法是什么,是不是自己实现的,有什么比较知名的实现,使用过程中踩过哪些坑
C、优缺点分析你熟悉的机器学习/数据挖掘算法主要有哪些?
A、基础算法要多说,其它算法要挑熟悉程度高的说,不光列举算法,也适当说说应用场合;
B、面试官和你的研究方向可能不匹配,不过在基础算法上你们还是有很多共同语言的,你说得太高大上可能效果并不好,一方面面试官还是要问基础的,另一方面一旦面试官突发奇想让你给他讲解高大上的内容,而你只是泛泛的了解,那就傻叉了。你用过哪些机器学习/数据挖掘工具或框架?
A、主流的分布式框架如 Hadoop,Spark,Graphlab,Parameter Server 等择一或多使用了解;
B、通用算法包,如 mahout,scikit,weka 等;
C、专用算法包,如 OpenCV,theano,torch7,ICTCLAS 等。基础知识
A、无监督和有监督算法的区别?
B、SVM 的推导,特性?多分类怎么处理?
C、LR 的推导,特性?
D、决策树的特性?
E、SVM、LR、决策树的对比?
F、GBDT 和 决策森林 的区别?
G、如何判断函数凸或非凸?
H、解释对偶的概念。
I、如何进行特征选择?
J、为什么会产生过拟合,有哪些方法可以预防或克服过拟合?
K、介绍卷积神经网络,和 DBN 有什么区别?
L、采用 EM 算法求解的模型有哪些,为什么不用牛顿法或梯度下降法?
M、用 EM 算法推导解释 Kmeans。
N、用过哪些聚类算法,解释密度聚类算法。
O、聚类算法中的距离度量有哪些?
P、如何进行实体识别?
Q、解释贝叶斯公式和朴素贝叶斯分类。
R、写一个 Hadoop 版本的 wordcount。
开放问题
A、给你公司内部群组的聊天记录,怎样区分出主管和员工?B、如何评估网站内容的真实性(针对代刷、作弊类)?
C、深度学习在推荐系统上可能有怎样的发挥?
D、路段平均车速反映了路况,在道路上布控采集车辆速度,如何对路况做出合理估计?
E、采集数据中的异常值如何处理?
F、如何根据语料计算两个词词义的相似度?
G、在百度贴吧里发布 APP 广告,问推荐策略?
H、如何判断自己实现的 LR、Kmeans 算法是否正确?
I、100亿数字,怎么统计前100大的?
腾讯2017年春招内推面试(一)
1、询问实验室具体情况,偏向于做哪一块;
2、分布式并行化的了解,sklearn库的运用;
3、GBDT和随机森林的区别;
4、模型的方法和偏差的区别;
5、ROC和AUC分别代表的是什么,ROC的取值范围;(AUC是ROC下面的面积!!)
6、过拟合是怎么解决的(基本的算法、神经网络的算法中)
7、神经网络防治过拟合除了dropout还有什么方法;(early stopping,augmentation,正则化)
8、L1和L2产生的结果有什么区别;
9、神经网络梯度消失的问题是怎么产生的;
10、深度学习平常有使用到吗?(问得不深入)
11、文本的使用?(问得不深入)
12、spark的MLlib的使用过吗?
13、PageRank的实现原理,大概思想?(网页排序算法)
14、前面提到了有向图,那么树的叶子结点和边结点有什么关系?(对于二叉树来说,叶子结点和内部结点是什么关系,这个回答得不好)
15、什么是平衡二叉树?什么是红黑树?红黑树有哪些实际应用场景呢?(回答了STL的两个底层,实际场景没有回答出来)
16、哈希冲突的解决方法?(开放定址法、链地址法,其它的没有答出来)
17、布隆过滤器有没有使用过?原理?(提示与哈希相关)
18、数据结构里堆的定义和,基本模型是怎样的?时间复杂度是多少?(最大堆、最小堆)
19、Java和Python哪个用的比较多(答C++,面试官说做大数据C++用的不多吧)
20、设计模式了解过吗?工厂模式主要解决什么问题?(答了一点,然后gg)
21、介绍了一下他们BG的主要工作(文章推荐、部落推荐、提升转化、挖掘群用户信息)
30.请简要说说一个完整机器学习项目的流程
@寒小阳、龙心尘
1 抽象成数学问题
明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。
这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。
2 获取数据
数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。
数据要有代表性,否则必然会过拟合。
而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。
3 特征预处理与特征选择
良好的数据要能够提取出良好的特征才能真正发挥效力。
特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。
筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。
4 训练模型与调优
直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。
5 模型诊断
如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。
过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。
误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……
诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。
6 模型融合
一般来说,模型融合后都能使得效果有一定提升。而且效果很好。
工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。
7 上线运行
这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。
这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。