赞
踩
自我介绍说得好,一定会给面试官留下深刻的好印象,而且这一块全是自己来措辞,要突出的重点也是你自己来把控,所以从你的叙述中,面试官是可以听得出你对这个项目的熟悉程度以及你的思考深度的,所以,提前准备就尤为重要了,面试的时候要把每一个项目按照一定的逻辑叙述出来,在算法项目里面最为重要的当然是数据、特征、模型、效果,按照这个框架给讲清楚了,面试官听得轻松,接下来的面试阶段也会更流畅一些,因为面试官是会捕捉你的自我介绍里面的关键词的,以待之后的问答环节向你连环提问,这就暗含了一个tip,就是你所讲出来的,一定要做到比面试官更懂,那些做的含糊的东西就不要搬进来了,否则迟早会露馅。
这是重中之重,项目会体现一个面试者的综合素质。那我们这种没有实习经历的该咋办呢?好办,去参加比赛,争取拿比赛的名次,然后把比赛里用到的算法搞的滚瓜烂熟的,面试官必然会对你项目中的细节展开,让你解剖一些他有疑问的点,比如正负样本的选取、特征处理、模型的细节,再比如你的比赛中用到了树模型,就得知道所有树模型相关的知识点,我随便举几个例子:XGBoost为什么对缺失值不敏感?相比普通的GBDT,XGBoost怎么处理缺失值?为什么xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度? 等等这种细节式的提问,一旦你回答的含糊其辞,面试官就必然会扣分的,所以千万不要怀着侥幸心理,觉得面试官不会问到,墨菲定理告诉我们,凡是可能出错的事就一定会发生,这些都是可以准备的,明明几乎是开卷考试了,为啥不提前去想好怎么回答,而要去考场上绞尽脑汁想个四不像的回答出来呢。比赛平台的话,大家肯定知道,像阿里天池、kaggle等等都是大家常参加比赛的平台。
面试官除了考察在项目中出现的算法的细节之外,还会就你的机器学习算法基础进行提问,我这里大概总结下比较重要的一些,传统算法: 逻辑回归、朴素贝叶斯、树模型(random forest/Adaboost/xgboost/lightgbm)、SVM、PageRank、聚类;一些机器学习的理论,非平衡问题、过拟合问题,交叉验证问题,模型选择问题;推荐系统:协同过滤、FM/FFM、LS-PLM、Wide&Deep、DeepFM、DIN、DIEN、ESMM、Embedding、召回、EE、性能评估;这些算是算法岗的核心,此外,一些代码语言的考察,也会是有一些面试官很看重的,比如C++/python/Spark等,当时为了准备这一项,我把我能想到的题都转化为了问答的形式,自问自答地去做准备,我在文章的最后把所有的题都列了出来。大家可以按照这个去准备,或者选择其中的一些。因为我面的是推荐算法岗位,所以会比较偏重这方面,后期如果我有时间,可以拓展到其他的领域,比如自然语言处理、计算机视觉等等。推荐的书的话,也是牛客上大神的一些经验,李航《统计学习方法》、《百面机器学习》、《百面深度学习》、《深度学习推荐系统》、周志华的《机器学习》。当然看完这些书是绝对不够的,看了不等于你掌握了,你循着我给你列出来的问题清单去过一遍,自己心里回答一遍,或者直接写出来,这样效果绝对顶,我在秋招的时候,真的几乎可以秒答,尽在自己的掌握之中。我也会在我的公众号陆续发布这些问题的解答,基本上已经写完了,大家也可以看我的网站,网站、公众号介绍在下面中有,欢迎大家一起交流。
这个也相当关键,有的公司甚至会根据你在这个方面的表现优劣决定你的去留,像头条是出了名的动态规划大师,老喜欢考一些中等或者hard的题,让人头疼。很多非计算机出身的因为本身没有基础,练习的不到位,就可能当场思路不清晰。我的建议是先按照专题来刷,比如像动态规划、滑动窗口专题、双指针、快慢指针、topK等等,刷个200题左右,然后就可以随机去刷了,一定要多刷题,这是强调一百遍都不为过的面试法则。推荐的书的话有《剑指offer》,网站的话可以找leetcode中文网。
一、机器学习百问百答
1.逻辑回归
可以输出预测值:
最大似然估计:
条件:假设样本独立同分布;
目标:估计出这个分布中的参数theta;
方法:这一组样本的概率最大时就对应了该模型的参数值。
推导一下逻辑回归的损失函数,并解释其含义。
对于二分类问题的损失函数可以写成如下形式:
如果是计算 m 个样本的平均的损失函数,只要将 m 个 Loss 叠累加取平均就可以了:
这就在最大似然法推导出的lr的学习目标——交叉熵损失(或对数损失函数),也就是让最大化使模型预测概率服从真实值的分布,预测概率的分布离真实分布越近,模型越好。可以关注到一个点,如上式逻辑回归在交叉熵为目标以sigmoid输出的预测概率,概率值只能尽量趋近0或1,同理loss也并不会为0。
LR需要得到最大似然估计,即模型得到的预测分布应该与数据的实际分布情况尽可能相近。
KL散度(相对熵)是用来衡量两个概率分布之间的差异。模型需要得到最大似然估计,乘以负Log以后就相当于求最小值,此时等价于求最小化KL散度(相对熵)。所以得到KL散度就得到了最大似然。又因为KL散度中包含两个部分,第一部分是交叉熵,第二部分是信息熵,即KL=交叉熵−信息熵。信息熵是消除不确定性所需信息量的度量,简单来说就是真实的概率分布,而这部分是固定的。所以优化KL散度就是近似于优化交叉熵。
在机器学习中我们有损失函数的概念,其衡量的是模型预测错误的程度。如果取整个数据集上的平均对数似然损失,我们可以得到:
即在逻辑回归模型中,我们最大化似然函数和最小化损失函数实际上是等价的
在深度学习中常用到的 Sigmoid 函数就是 Logistic 的分布函数在服从标准正态分布的特殊形式。
从LR的目的上来看,在选择函数时,有两个条件是必须要满足的:
伯努利分布就是只有两个取值且给定期望值为下的熵最大的分布,伯努利分布也属于指数分布族。
https://blog.csdn.net/saltriver/article/details/57531963
支持向量(Support Vetor):就是离分隔超平面最近的那些点。
寻找最大间隔:就是寻找最大化支持向量到分隔超平面的距离,在此条件下求出分隔超平面。
工作流程:
当SVM线性不可分的时候:
使用核函数:通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间。在机器学习中常用的核函数
线性: 内积
松弛变量(软间隔):
之前讨论的情况都是建立在样例线性可分的假设上,当样例线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办呢,我们需要将模型进行调整,以保证在不可分的情况下,也能够尽可能地找出分隔超平面。
软间隔:引入非负参数 后(称为松弛变量),就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,样本点在对方的区域中。而放松限制条件后,我们需要重新调整目标函数:
目标函数后面加上 的后,就可以使得离群点越多,目标函数值越大,而我们要求的是尽可能小的目标函数值。
相同:
Linear SVM和LR都是线性分类器
都是分类模型,本质都是在找最佳分类超平面;
都是判别式模型,判别式模型不关系数据是怎么生成的,只关心数据之间的差别,然后用差别来简单对给定的一个数据进行分类;
都是监督学习算法;
都可以增加不同的正则项。
Linear SVM 和 LR 分别在什么情况下使用
两种方法都是常见的分类算法,从目标函数来看,区别在于逻辑回归采用的是logistical loss,svm采用的是hinge loss。这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。两者的根本目的都是一样的。此外,根据需要,两个方法都可以增加不同的正则化项,如l1,l2等等。所以在很多实验中,两种算法的结果是很接近的。但是逻辑回归相对来说模型更简单,好理解,实现起来,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些。但是SVM的理论基础更加牢固,有一套结构化风险最小化的理论基础,虽然一般使用的人不太会去关注。还有很重要的一点,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算量。
为什么LR不适合用MSE?
为什么逻辑回归需要先对特征离散化?
并行LR的实现
逻辑回归(Logistic regression)在金融领域有什么应用呢?
朴素贝叶斯
先验概率(prior probability):指根据以往经验和分析。在实验或采样前就可以得到的概率。
后验概率(posterior probability):指某件事已经发生,想要计算这件事发生的原因是由某个因素引起的概率。后验概率可以被看做是对先验概率的一种“更加细致的刻画和更新“,因为此时我们观测到了X,有了额外的信息。后验概率无法直接获得,因此我们需要找到方法来计算它,而解决方法就是引入贝叶斯公式。
条件概率:一般写作p(A|B),即仅当B事件发生时A发生的的概率:
变形后得到
同理: ,故
就得到了贝叶斯公式:
我们把P(A)称为"先验概率"(Prior probability),也就是在不知道B事件的前提下,我们对A事件概率的一个主观判断。
P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,也就是新信息B带来的调整,作用是将先验概率(之前的主观判断)调整到更接近真实概率。
如何计算调整因子: 可以通过全概率求得
如果"可能性函数"P(B|A)/P(B)>1,意味着"先验概率"被增强,事件A的发生的可能性变大;
如果"可能性函数"=1,意味着B事件无助于判断事件A的可能性;
如果"可能性函数"<1,意味着"先验概率"被削弱,事件A的可能性变小。
贝叶斯的前提是特征独立,
NB其分类
NB的伯努利模型,特征是布尔变量,符合0/1分布,在文本分类中,特征就是词是否出现;
NB的多项式模型,特征是离散值,符合多项式分布,在文本分类中,特征就是词出现的次数;
NB的高斯模型,特征是连续值,符合高斯分布(高斯分布又名正态分布),在文本分类中,特征就是词的TF-IDF值。
NB的优缺点
优点:
算法原理简单;
所估计的参数少;
假设条件概率计算是彼此独立的,因此可以用于分布式计算;
属于生成式模型,收敛速度比判别式模型要快;
对缺失数据不太敏感;
天然可以处理多分类问题。
缺点:
假设各个特征之间相互独立这一条件在实际应用中往往是不能成立的;
不能学习到特征之间的相互作用;
对输入数据的表达形式敏感。
树模型
1)信息熵:编码方案完美时,最短平均编码长度的是多少。
2)交叉熵:编码方案不一定完美时(由于对概率分布的估计不一定正确),平均编码长度的是多少。 平均编码长度 = 最短平均编码长度 + 一个增量
3)相对熵:编码方案不一定完美时,平均编码长度相对于最小值的增加值。(即上面那个增量)KL散度是一种衡量两个分布差异的方法
决策树和随机森林的区别
决策树 + Bagging + 随机选择特征 = 随机森林,随机森林可以有效防止过拟合。
随机森林里面用的哪种决策树
CART 决策树或其他
随机森林的原理?如何进行调参?树的深度一般如何确定,一般为多少?
原理:RF是一种集成算法,属于bagging类,它通过集成多个决策树模型,通过对基模型的结果采用投票法或者取平均来获得最终结果,使得最终模型有较高的准确度和泛化性能。
调参:
还是看刘建平老师的这篇:https://www.cnblogs.com/pinard/p/6160412.html
RF和GBDT调参过程类似,可以对比记忆:
无参数拟合–>n_estimators调参–>max_depth, min_sample_split–>min_sample_split, min_samples_leaf–>max_features
如何确定树的深度:当训练样本多,数据特征维度多的时候需要限制这个参数,具体取决于数据分布,一般在10-100之间。
3. Bagging 和 Boosting的区别
样本选择:Bagging有放回的选取训练集,并且从原始数据集中选取的各轮训练集之间相互独立;Boosting每次都使用全部数据,只是每个样例的权重不同。
样例权重:Bagging采用均匀采样,每个样例的权重相同;Boosting每轮训练都依据上一轮训练结果更新样例权重,错误率越大的样例,权重越大。
预测函数:Bagging每个基函数的预测结果权重相同;Boosting中预测误差越小的基模型有更大的权重。
偏差和方差:Bagging得出的结果低方差,Boosting低偏差。
并行计算:Bagging可以并行生成基模型,Boosting各个预测函数只能顺序生成,后一轮模型的参数需要前一轮的预测结果。
4. GBDT调参
我觉得啊,一般面试官如果问我们这种题目,一定是要求我们使用过这个算法,如果使用过就要理解记住,没使用过就坦诚的说没用过,大家可以跟着下面这个链接的刘建平老师学习一遍。
具体实例:https://www.cnblogs.com/pinard/p/6143927.html
参数分类:
Boosting框架参数:n_estimators, learning_rate, subsample
CART回归树参数(与决策树类似):max_features, max_depth, min_sample_split, min_samples_leaf
大致步骤:
无参数拟合–>固定learning_rate,estimators调参–>max_depth, min_sample_split–>min_sample_split, min_samples_leaf–>拟合查看–>max_features–>subsample–>不断减小learning_rate,加倍estimators来拟合
5. RF、GBDT之间的区别(重要)
此问题充分理解,你需要这些:
https://blog.csdn.net/data_scientist/article/details/79022025
https://blog.csdn.net/xwd18280820053/article/details/68927422
https://blog.csdn.net/m510756230/article/details/82051807
相同点:都是由多棵树组成,结果由多棵树共同决定。
不同点:
GBDT是回归树,RF可以是回归树也可以是分类树;
GBDT对异常值特别敏感,RF则没有;
GBDT只能串行生成多个模型,RF可以并行;
GBDT的结果有多个结果求和或者加权求和,RF是由投票选出结果;
GBDT是通过减少偏差来提高模型性能,RF是通过减少方差;
RF对所有训练集一视同仁,GBDT是基于权值的弱分类器。
6. 随机森林的优缺点
优点:
相比于其他算法,在训练速度和预测准确度上有很大的优势;
能够处理很高维的数据,不用选择特征,在模型训练完成后,能够给出特征的重要性;
可以写成并行化方法;
缺点:在噪声较大的分类回归问题上,容易过拟合。
降维
实例
以这个为例,我们用PCA的方法将这组二维数据降到一维
因为这个矩阵的每行已经是零均值,所以我们可以直接求协方差矩阵:
然后求其特征值和特征向量,求解后的特征值为:
λ1=2,λ2=2/5
其对应的特征向量分别是:
由于对应的特征向量分别是一个通解,c1和c2可取任意实数。那么标准化后的特征向量为:
因此我们的矩阵P是:
可以验证协方差矩阵C的对角化:
最好我们用P的第一行乘数据矩阵,就得到了降维后的数据表示:
降维后的投影结果如下图:
LDA
原理:投影后类内方差最小,类间方差最大
工作流程:
LDA vs PCA:
相同点:1)两者均可以对数据进行降维。
2)两者在降维时均使用了矩阵特征分解的思想。
3)两者都假设数据符合高斯分布(正态分布)。
不同点:1)LDA是有监督的降维方法,而PCA是无监督的降维方法
2)LDA降维最多降到类别数k-1的维数,而PCA没有这个限制。
3)LDA除了可以用于降维,还可以用于分类。
4)LDA选择分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。
回归问题
EM算法
重复以上两步,直到聚类中心不发生变化为止。
KMeans
K-means 的原理,时间复杂度,优缺点以及改进
原理:对于给定样本集,按照样本之间的距离大小,将样本划分为若干个簇,使簇内距离尽可能小,簇间距离尽可能大;
步骤:
随机选择k个样本作为初始聚类中心;
计算样本到各聚类中心的距离,把它划到距离最小的簇;
计算新的聚类中心;
迭代,直至聚类中心未更新或到达最大次数。
时间复杂度:O(knd*t) | k:类别,n:样本数,d:计算样本之间距离的时间复杂度,t:迭代次数;
优缺点:
优点:1. 原理易懂、实现简单、收敛速度快、效果好 2. 可解释性强 3. 可调参数只有少,只有k;
缺点:1. 聚类效果受k值影响大 2. 非凸数据集难以收敛=离散的数据比较难受连 3. 隐含类别不均衡时,效果差 4. 迭代算法,得到的只是局部最优 5. 对噪音和异常数据敏感。
改进:随机初始化K值影响效果 + 计算样本点到质心的距离耗时这两方面优化
KMeans++算法
KMeans随机选取k个点作为聚类中心,而KMeans++采用如下方法:
假设已经选取好n个聚类中心后,再选取第n+1个聚类中心时,距离这n个聚类中心越远的点有越大的概率被选中;选取第一个聚类中心(n=1)时也是需要像KMeans一样随机选取的。
高斯混合模型
联合概率分布简称联合分布,是两个及以上随机变量组成的随机向量的概率分布。打靶时命中的坐标(x,y)的概率分布就是联合概率分布(涉及两个随机变量)。
变量X和Y的联合分布完全决定X的概率分布和Y的概率分布(称作联合分布的边缘分布):
高斯分布(正态分布)遵从下方概率密度函数(Probability Density Function):
高斯混合模型可以看作是由 K 个单高斯模型组合而成的模型,这 K 个子模型是混合模型的隐变量(Hidden variable)。一般来说,一个混合模型可以使用任何概率分布,这里使用高斯混合模型是因为高斯分布具备很好的数学性质以及良好的计算性能。
步骤:首先随机的给参数赋值
E:根据当前的参数计算每个点属于各个子模型的概率
M:根据上一步获得的概率改进方差、均值和模型的权重
Kmeans和Gmm的异同:
相同:GMM和K-means很相似,相似点在于两者的分类受初始值影响;两者可能限于局部最优解;两者类别的个数都要靠猜测。
不同:K-means属于硬聚类,要么属于这类,要么属于那类,而GMM属于混合式软聚类,一个样本70%属于A,30%属于B;同时多维的GMM在计算均值和方差时使用了协方差,应用了不同维度之间的相互约束关系。
Kmeans考虑的是最小化k点和xi点之间的距离。
Gmm考虑的是xi属于某个类的概率,当概率都为100%的时候,gmm就退化成kmeans。
可以计算概率,可以生成新样本。
从欧式距离和马氏距离来说,K-means是欧式距离,而GMM是马氏距离,当协方差非对角线元素为0时,马氏距离也就变成了欧式距离。见下图K-means和GMM的优化函数:
优化算法
梯度下降: 1.根据梯度(导数)的符号来判断最小值点x在哪;
2. 让函数值下降(变小)。
梯度下降作用是找到函数的最小值所对应的自变量的值(曲线最低点对应x的值)。记住我们目的是为了找x.
凸函数就是一个定义在某个向量空间的凸子集C(区间)上的实值函数。
从几何意义上看,凸函数就是任意两点之间的弦(即这两点构成的线段)都在该函数图像(此处是指这两点之间的函数图像,而非全部的函数图像)的上方。
损失函数
请解释一下损失函数的定义
损失函数(Loss function)是用来估量你模型的预测值 f(x)与真实值 Y 的不一致程度,它是一个非负实值函数,通常用 L(Y,f(x))来表示。损失函数越小,模型的鲁棒性就越好。
请说说你对逻辑回归损失函数的理解
请说说你对平方损失函数的理解。
请谈谈你对指数损失函数的了解。
请谈谈你对Hinge合页损失函数的了解。
请你对逻辑斯谛回归和SVM的损失函数进行一下对比。
对于逻辑回归,为什么说平方损失函数是非凸的?
如何把SVM的推导和损失函数联系起来?
神经网络如何设计自己的loss function,如果需要修改或设计自己的loss,需要遵循什么规则?
softmax和cross-entropy是什么关系?
神经网络的损失函数为什么是非凸的?
深度学习中有哪些常用损失函数(优化目标函数)?
神经网络中,设计loss function有哪些技巧?
神经网络中,为何不直接对损失函数求偏导后令其等于零,求出最优权重,而要使用梯度下降法(迭代)计算权重?
在用交叉熵损失函数时,只希望惩罚 0.4~0.6 这样模糊的值,应该怎么改?
神经网络
1.卷积层
正则化
请解释正则化的含义。
正则化也叫惩罚、规则化,加入正则项是为了避免过拟合.加入正则化项相当于加了先验知识。在数据少的时候,先验知识可以防止过拟合。
对于alpha =0,也就是不添加正则化约束,则相当于参数的高斯先验分布有着无穷大的协方差,那么这个先验约束则会非常弱,模型为了拟合所有的训练数据,w可以变得任意大不稳定。alpha越大,表明先验的高斯协方差越小,模型约稳定, 相对的方差也越小
拉普拉斯:
AUC
请解释一下AUC。
、预测为正例的概率值大于预测为负的概率值的可能性,ROC曲线下的面积AUC=∫y(t)dx(t)
AUC和准确率一定是正相关的吗?有什么内在关系吗?
精确率是基于某个阈值进行计算的,AUC是基于所有可能的阈值进行计算的,具有更高的健壮性。AUC不关注某个阈值下的表现如何,综合所有阈值的预测性能,所以精确率高,AUC不一定大,反之亦然。
二分类时,为什么AUC比accuracy更常用?为什么AUC对样本类别比例不敏感?
计算accuracy,需要把概率转换为类别,这就需要手动设置一个阈值。高于该阈值放入A类,低于该阈值放入B类。该阈值很大程度上影响accuracy的计算。AUC可以避免将概率转换成类别。
Roc曲线:
以真正例率为纵坐标,假正例率为横坐标绘制的曲线,auc越大越好,但是肯定小于等于1.
TPR = TP /(TP + FN)真
FPR = TN / ( TN + FP) 假
精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
准确率(Accuracy)。顾名思义,就是所有的预测正确(正类负类)的占总的比重。
精确率(Precision),查准率。即正确预测为正的占全部预测为正的比例。个人理解:真正正确的占所有预测为正的比例。
召回率(Recall),查全率。即正确预测为正的占全部实际为正的比例。个人理解:真正正确的占所有实际为正的比例。
F1值(H-mean值)。F1值为算数平均数除以几何平均数,且越大越好,将Precision和Recall的上述公式带入会发现,当F1值小时,True Positive相对增加,而false相对减少,即Precision和Recall都相对增加,即F1对Precision和Recall都进行了加权。
Else
判别式和生成式的算法各有哪些,区别是什么
区别:二者最本质的区别是建模对象的不同。
判别式模型的评估对象是最大化条件概率P(Y|X)并对此进行建模,特点是准确率高;
生成式模型的评估对象是最大化联合概率P(X,Y)并对此进行建模,特点是收敛速度快。
判别式模型:线性回归、决策树、支持向量机SVM、k近邻、神经网络等;
生成式模型:隐马尔可夫模型HMM、朴素贝叶斯模型、高斯混合模型GMM、LDA。
非均衡数据
三、深度学习
四、C++百问百答
基础
数组
函数
指针
结构体
内存
引用
重载
封装
初始化
五、python百问百答
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。