机器学习数据挖掘面试

欠拟合:模型太简单了,特征是否过少
过拟合:增加样本量,减少特征数,降低模型复杂度等

L1正则化其实就是讲权值的绝对值和加入损失函数,使得权值中0值比重增大,因此得到的权值较为稀疏。L2正则化则是将权重的平方和加入损失函数,使得权值分布更加平均,所以权值较为平滑。

ROC曲线的AUC值是比较重要的内容,要能知道具体ROC曲线是怎么画出来的。回归的话比如MSE,RMSE或和业务相关的加权计算公式等。

数据如何清洗,怎么处理缺失值?

数据清洗主要还是通过分析数据的统计信息、分布情况、缺失情况等来定,在数据质量较好的前提下尽可能保留更多数据。缺失值的处理方法较多,也是根据具体特征和业务来定,可以随机填充、均值填充、或采用简单算法如KNN,聚类进行填充。当然,如果某些特征或某些样本的缺失率太大,可以考虑直接舍弃,是具体情况而定。

bagging,boosting的含义?

bagging主要和随机森林关联,采用有放回的抽样,所以某个样本可能出现在多棵树的训练集中也可能一次也没出现,可以并行。另外每棵树用的特征集也是从原始特征集中随机选择部分特征集作为分裂集合。
boosting主要和adaboosting关联,每棵树都是根据前一棵树训练的残差作为输入的,所以一般是串行跑的,每棵树的训练集都是整个样本集,另外对特征也没做选择。

GDBT和XGBOOST

1 )几种模型( svm , lr , gbdt , em )的原理以及公式推导

svm:支持向量机,在特征空间上的间隔最大的线性分类器。等价于正则化的合页损失函数最小化。
函数间隔(用γ=y(wx+b)来表示分类的正确性和确信度)、几何间隔(对分离超平面的法向量w加某些约束γ^=wx/||w||+b/||w||)、最大间隔法、学习的对偶算法,构建拉格朗日函数,极大极小问题。

训练数据线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机(硬间隔支持向量机);
训练数据近似线性可分时,通过软间隔最大化(软间隔SVM的目标函数形式同硬间隔的形式相同,唯一不同的就在于ai的范围。),学习一个线性分类器,即线性支持向量机;
训练数据不可分时,使用核技巧及软间隔最大化,学习非线性支持向量机。

核函数:输入和输入空间到特征空间的映射的內积。

常用核函数:多项式核函数;高斯核函数;字符串核函数。

lr:逻辑斯特回归,服从逻辑斯特分布,对数似然函数,求极大值(极大似然估计),最优化问题的改进算法有:迭代尺度法、梯度下降法、拟牛顿法;

gdbt:Boost肯定是一个加法模型,它是由若干个基函数及其权值乘积之和的累加,基函数是决策树,首先计算残差,有了残差之后,我们再用(xi,rim)去拟合第m个基函数,假设这棵树把输入空间划分成j个空间R1m,R2m……,Rjm,假设它在每个空间上的输出为bjm,这样的话,第m棵树可以表示如下:下一步,对树的每个区域分别用线性搜索的方式寻找最佳步长,这个步长可以和上面的区域预测值bjm进行合并,最后就得到了第m步的目标函数。当然了,对于GDBT比较容易出现过拟合的情况,所以有必要增加一点正则项,比如叶节点的数目或叶节点预测值的平方和,进而限制模型复杂度的过度提升。

AdaBoost:AdaBoost是用于分类的。然后套路想必你已经非常了解了,前面几步完全和上面的GDBT一样,区别在于AdaBoost给出了损失函数为指数损失函数。

1 第一步假设平均分布,权值都为1/N,训练数据得到分类器。
2 求第一步的分类器预测数据的错误率,计算G(x)的系数alpha。
3 更新权值分布,不过加了归一化因子,使权值满足概率分布。
4 基于新的权值分布建立新的分类器,累加在之前的模型中。
5 重复上述步骤,得到最终的分类器。

xgboost:梯度下降的方法我们都只考虑了一阶信息,根据泰勒展开,我们可以把二阶信息也用上,假如目标函数如下。。新一步函数的损失函数变成了只与上一步相关的一个新的损失函数,这样我们就可以遍历数据中所有的分割点,寻找新的损失函数下降最多的分割点,然后重复上述操作。

em:求期望、求极大;含有隐变量的概率模型参数的极大似然估计。

2 ) rf , gbdt 的区别; gbdt , xgboost 的区别(烂大街的问题最好从底层原理去分析回答)
https://blog.csdn.net/qq_28031525/article/details/70207918

RF和Bagging对比:RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林通常会收敛到更低的泛化误差。随机森林的训练效率也会高于Bagging,因为在单个决策树的构建中,Bagging使用的是‘确定性’决策树,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。

GBDT和XGBoost区别:

  1. 传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
  2. 传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;
  3. XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;
  4. shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
  5. 列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过拟合,还能减少计算;
  6. 对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动学习出它的分裂方向;
  7. XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

3 )决策树处理连续值的方法
决策树对于连续值的特征进行处理的方法主要是将连续性数值特征划分为不同的区间,从而变成离散的数值。C4.5中采用了二分法对连续值进行处理。

二分法的思想为:对于某个属性出现的连续值从小到大排列,取每两个点的中点进行划分(任取两点之间的任意一点不影响划分结果),选取其中信息增益最大的点作为最终划分节点的依据。

因为连续属性的可取值数目不再有限,因此不能像前面处理离散属性枚举离散属性取值来对结点进行划分。因此需要连续属性离散化,常用的离散化策略是二分法,这个技术也是C4.5中采用的策略。

4 )特征选择的方法

1、Filter方法

其主要思想是:对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。

主要的方法有:

  • Chi-squared test(卡方检验)
  • information gain(信息增益)
  • correlation coefficient scores(相关系数)

2、Wrapper方法

其主要思想是:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA,PSO,DE,ABC等,详见“优化算法——人工蜂群算法(ABC)”,“优化算法——粒子群算法(PSO)”。

主要方法有:

  • recursive feature elimination algorithm(递归特征消除算法)

3、Embedded方法

其主要思想是:在模型既定的情况下学习出对提高模型准确性最好的属性。这句话并不是很好理解,其实是讲在确定模型的过程中,挑选出那些对模型的训练有重要意义的属性。

主要方法:

  • 正则化

5 )过拟合的解决方法

  • dropout(随机剔除一些神经元)
  • 减轻迭代次数(学习这东西学了很多遍)
  • 输入噪音
  • L2正则化(减小权重分量,让w更新中逐渐变0)
  • BN层 让数据分布变化别太大

kmeans 的原理,优缺点以及改进

https://wizardforcel.gitbooks.io/dm-algo-top10/content/k-means.html

是将各个聚类子集内的所有数据样本的均值作为该聚类的代表点
算法描述
1、为中心向量c1, c2, …, ck初始化k个种子
2、分组:
(1)将样本分配给距离其最近的中心向量
(2)由这些样本构造不相交( non-overlapping )的聚类
3、确定中心:
用各个聚类的中心向量作为新的中心
4、重复分组和确定中心的步骤,直至算法收敛。
3、算法 k-means算法
输入:簇的数目k和包含n个对象的数据库。
输出:k个簇,使平方误差准则最小。
算法步骤:
1.为每个聚类确定一个初始聚类中心,这样就有K 个初始聚类中心。
2.将样本集中的样本按照最小距离原则分配到最邻近聚类
3.使用每个聚类中的样本均值作为新的聚类中心。
4.重复步骤2.3直到聚类中心不再变化。
5.结束,得到K个聚类

主要优点:

是解决聚类问题的一种经典算法,简单、快速。
对处理大数据集,该算法是相对可伸缩和高效率的。因为它的复杂度是0 (n k t ) , 其中, n 是所有对象的数目, k 是簇的数目, t 是迭代的次数。通常k < <n 且t < <n 。
当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。

主要缺点:

在簇的平均值被定义的情况下才能使用,这对于处理符号属性的数据不适用。
必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。
它对于“躁声”和孤立点数据是敏感的,少量的该类数据能够对平均值产生极大的影响。
K-Means算法对于不同的初始值,可能会导致不同结果。解决方法:
1.多设置一些不同的初值,对比最后的运算结果)一直到结果趋于稳定结束,比较耗时和浪费资源
2.很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。这也是 K-means 算法的一个不足。有的算法是通过类的自动合并和分裂,得到较为合理的类型数目 K.
2、k-means算法的改进方法——k-prototype算法
k-Prototype算法:可以对离散与数值属性两种混合的数据进行聚类,在k-prototype中定义了一个对数值与离散属性都计算的相异性度量标准。
K-Prototype算法是结合K-Means与K-modes算法,针对混合属性的,解决2个核心问题如下:
1.度量具有混合属性的方法是,数值属性采用K-means方法得到P1,分类属性采用K-modes方法P2,那么D=P1+a*P2,a是权重,如果觉得分类属性重要,则增加a,否则减少a,a=0时即只有数值属性
2.更新一个簇的中心的方法,方法是结合K-Means与K-modes的更新方法。
3、k-means算法的改进方法——k-中心点算法
k-中心点算法:k -means算法对于孤立点是敏感的。为了解决这个问题,不采用簇中的平均值作为参照点,可以选用簇中位置最中心的对象,即中心点作为参照点。这样划分方法仍然是基于最小化所有对象与其参照点之间的相异度之和的原则来执行的。

常见分类模型( svm ,决策树,贝叶斯等)的优缺点,适用场景以及如何选型

svm 为啥要引入拉格朗日的优化方法;

10 )海量的 item 算文本相似度的优化方法;

11 )梯度下降的优缺点;

12 ) em 与 kmeans 的关系;

13 ) L1 与 L2 的区别以及如何解决 L1 求导困难;

14 )如何用尽可能少的样本训练模型同时又保证模型的性能;

解释 word2vec 的原理以及哈夫曼树的改进;

https://zhuanlan.zhihu.com/p/31319965

word2vec的最基础功能就是通过训练将每个词映射成K维实数向量。

word2vec产生词向量的过程:
其采用一个三层的神经网络,输入层-隐层-输出层。核心的技术是根据词语出现的频率用Huffman编码,使得所有词频相似的词隐藏层激活的内容基本一致,出现频率越高的词语,他们激活的隐藏层数目越少,这样有效的降低了计算的复杂度。这个三层神经网络本身是对语言模型进行建模 ,但也同时获得一种单词在向量空间上的表示,获得单词在向量空间上的表示才是Word2vec的真正目标。

(1) 分词/词干提取和词形还原。 中文和英文的nlp各有各的难点,中文的难点在于需要进行分词,将一个个句子分解成一个单词数组。而英文虽然不需要分词,但是要处理各种各样的时态,所以要进行词干提取和词形还原。

(2) 构造词典,统计词频。这一步需要遍历一遍所有文本,找出所有出现过的词,并统计各词的出现频率。

(3) 构造树形结构。依照出现概率构造Huffman树。

(4) 生成节点所在的二进制码。

(5) 初始化各非叶节点的中间向量和叶节点中的词向量。树中的各个节点,都存储着一个长为m的向量,但叶节点和非叶结点中的向量的含义不同。叶节点中存储的是各词的词向量,是作为神经网络的输入的。而非叶结点中存储的是中间向量,对应于神经网络中隐含层的参数,与输入一起决定分类结果。

(6) 训练中间向量和词向量。

输入层读入窗口内的词,将它们的向量(K维,初始随机)加和在一起,形成隐藏层K个节点。输出层是一个巨大的二叉树,叶节点代表语料里所有的词(语料含有V个独立的词,则二叉树有|V|个叶节点)。而这整颗二叉树构建的算法就是Huffman树。

对推荐算法的未来看法;

在模型的训练迭代中,怎么评估效果

https://blog.csdn.net/sinat_33761963/article/details/54910447

评估模型的方法:

  • 留出法(hold-out)留出法直接将数据集D拆分成互斥的两个集合,其中一个作为训练集S,另一个作为测试集T。在S上训练模型,在T上测试,并得到测试误差来近似泛化误差。

  • 交叉验证法(cross validation)交叉验证法是将数据集D划分成k个大小相似的互斥子集(D1,D2,…,DK),每个子集Di都使用分层采样尽可能保持数据分布的一致性。
    每次使用k-1个子集作为训练集,余下的那个子集作为测试集。如此便得到了k组训练/测试集,进行k次模型的训练与测试,得到k个结果,将这k个结果的平均作为这次交叉验证的最终结果。
    k一般取10

  • 验证集调参
    大多数机器学习的模型都有超参数需要人为设定,参数配置的不同,学得的模型性能也会有显著差别。如何尽可能正确地确定超参数呢?
    常见的方法,将训练集S进行k折交叉验证,取k-1部分作为训练集进行模型的训练,将余下的部分成为验证集(validation set), 作为对模型的验证。从而选择出当超参数设置为多少的时候模型的性能最佳。

评估模型的性能度量:

  • 错误率与精度
    错误率是分类错误的样本数量占总样本数量的比例;
    精度是分类正确的样本数量占总样本数量的比例。
    错误率与精度相加为1.

  • 查准率,查全率与F1
    查全率与查准率的计算
    查准率: P = TP/(TP + FP) 预测正确的正例占所有预测正例的比例
    查全率: R = TP/(TP + FN) 预测正确的正例占所有真实正例的比例

查全率也叫作“召回率”recall 或“敏感度”sensitivity

  • ROC 与 AUC
    在逻辑回归或者神经网络分类问题中,往往会输出一个概率值,将这个概率值与预先设定的阀值进行比较,大于阀值则为正例,小于阀值则为反例。等价于,按照概率将所有样本从大到小排列,设置某个“截断点”将样本分成前后两部分,前面的为正例,后面的为负例。如果更关注查准率则将截断点设置地大一点,若更关注查全率则将截断点设置地小一下。因此排序本省的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的还坏。ROC曲线就是从这个角度来研究学习器的泛化能力的。

ROC全称“受试者工作特征”(Receiver Operation Characteristic)曲线。

根据ROC曲线评估模型 :

a.若一个学习器的ROC曲线被另一个学习器的曲线完全包住,则后者优于前者。

b.若两个学习器的ROC曲线发生交叉,则可根据曲线下方的面积大小来比较,ROC曲线下方的面积为AUC(Area Under ROC Curve).

有几个 G 的文本,每行记录了访问 ip 的 log ,如何快速统计 ip 出现次数最高的 10 个 ip ;如果只用 linux 指令又该怎么解决;

访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。

算法思想:分而治之+Hash1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址; 3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;

100w个数中找最大的前100个数。

用一个100个元素大小的最小堆即可。

堆:适用范围:海量数据前n大,并且n比较小,堆可以放入内存  基本原理及要点:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。  扩展:双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。

一个绳子烧完需要 1 个小时,假设所有绳子的材质都不一样,也不均匀,怎么取出 1 小时加 15 分钟;

假设有个 M*N 的方格,从最左下方开始往最右上方走,每次只能往右或者往上,问有多少种走法,假设中间有若干个格子不能走,又有多少种走法

实现 hmm 的状态转移代码;

最短路径代码;

23 )拼车软件是如何定价的以及如何优化;

24 ) 100 张牌,每次只能抽一张,抽过的牌会丢掉,怎么选出最大的牌;

25 )怎么预测降雨量;

26 ) kmeans 代码;

27 ) mr 方案解决矩阵相乘的代码;

28 ) sql 语句的一些优化技巧;

29 )关于集群调度的一些经验 trick 掌握多少;

30 )设计一个系统可以实时统计任意 ip 在过去一个小时的访问量;

31 )设计 LRU 系统;

bayes公式

事件A、B,

P(A|B) = P(A,B)/P(B)
P(B|A) = P(A,B)/P(A)
P(A|B) = P(A)*P(B|A)/P(B)

为什么lr处理的是线性问题?什么时候用lr?

Lr 处理的是广义线性问题。

lr还是特征的线性组合后通过非线性函数映射

https://www.zhihu.com/question/30726036

Z就是分界的地方,Z大于等于0.5,就是1,而z等于wx,Z是x的多维空间的一条直线,或者你看它的定义,几率这个概念,P/(1-P) 取log的形式的结果,好像是wx,他们把这个当作广义的线性,或者你这么想像,假设特征只有2维度,X1,x2,如果z是x1+ x2的形式,那么x1+x2==0.5这个直线把特征空间分成2半,而且分界面是条直线。

https://www.zhihu.com/question/21704547?utm_source=wechat_session&utm_medium=social&utm_oi=1042761941252562944

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值