时间:2020-7-22-20:00(1个小时)

1.自我介绍
2.比赛用到wide &&deep 和deepFM 了吗
3.GBDT原理
先用一个初始值去学习一棵树,然后在叶子处得到预测值以及预测后的残差,之后的树则基于之前树的残差不断的拟合得到,从而训练出一系列的树作为模型。

4.GBDT和随机森林的区别
1)随机森林采用的bagging思想,而GBDT采用的boosting思想。这两种方法都是Bootstrap思想的应用,Bootstrap是一种有放回的抽样方法思想。虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练样例赋相等的权重1/n,然后用该算法对训练集训练t轮,每次训练后,对训练失败的样例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的。2)组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由回归树组成。3)组成随机森林的树可以并行生成;而GBDT只能是串行生成。4)对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来。5)随机森林对异常值不敏感;GBDT对异常值非常敏感。6)随机森林对训练集一视同仁;GBDT是基于权值的弱分类器的集成。7)随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。

5.lightgbm和XGB的区别
(1)xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了务必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
(2)lightgbm使用了基于histogram的决策树算法,这一点不同与xgboost中的 exact 算法,histogram算法在内存和计算代价上都有不小优势。1)内存上优势:很明显,直方图算法的内存消耗为(#data* #features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值),而xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。2)计算上的优势,预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为(#data),而直方图算法只需要遍历桶就行了,时间为(#bin)
(3)直方图做差加速,一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
(4)lightgbm支持直接输入categorical 的feature,在对离散特征分裂时,每个取值都当作一个桶,分裂时的增益算的是”是否属于某个category“的gain。类似于one-hot编码。
(5)xgboost在每一层都动态构建直方图,因为xgboost的直方图算法不是针对某个特定的feature,而是所有feature共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图,而lightgbm中对每个特征都有一个直方图,所以构建一次直方图就够了。

6.bagging和boosting的区别
1)取样方式(样本权重):Bagging是均匀选取,样本的权重相等,Boosting根据错误率取样,错误率越大则权重越大。2)训练集的选择:Bagging随机选择训练集,训练集之间相互独立,Boosting的各轮训练集的选择与前面各轮的学习结果有关。3)预测函数:Bagging各个预测函数没有权重,可以并行生成,Boosting有权重,顺序生成。4)Bagging是减少variance,Boosting是减少bias。
Bagging 是 Bootstrap Aggregating的简称,意思就是再取样 (Bootstrap) 然后在每个样本上训练出来的模型取平均,所以是降低模型的 variance. Bagging 比如 Random Forest 这种先天并行的算法都有这个效果。
Boosting 则是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行加权,所以随着迭代不不断进行行,误差会越来越小,所以模型的 bias 会不不断降低。这种算法无法并行。

Bagging中的基模型为强模型(强模型拥有低偏差高方差)。
Boosting中的基模型为弱模型,若不是弱模型会导致整体模型的方差很大。

Bagging是从训练集中进行子抽样组成每个基模型所需要的子训练集,然后对所有基模型预测的结果进行综合操作产生最终的预测结果。
Boosting中基模型按次序进行训练,而基模型的训练集按照某种策略每次都进行一定的转化,最后以一定的方式将基分类器组合成一个强分类器

7.3个GBDT模型融合为何有效
模型融合本来就是追求一个互补的过程,虽然基模行是有强有弱的,但这是针对整体的,强的在某部分数据上的预测不见得比弱的要好,所以通过模型融合,让他们各自表达自己的长处,得到整体更好的模型。所以这也引出了模型融合的前提,就是基模行要体现出差异性,一般考虑数据差异、特征差异、模型差异,有差异才能有更大的可能让它们发挥不同的长处,降低整体偏差,而且基模行的表现相差一般不能太多

8.介绍U-net、介绍Attention机制
https://mp.weixin.qq.com/s?__biz=MzUxNjcxMjQxNg==&mid=2247499231&idx=4&sn=fad308fa3d13db27e41b3f33fddf73ab&chksm=f9a18f50ced60646876fcdf059ab19769a1ca503e77234ae8b4675f859f063d8b0a3af27e3e0&mpshare=1&scene=1&srcid=&sharer_sharetime=1589520377742&sharer_shareid=5d3f32663f1be7e66c0e8997361d3611&key=cbc079077f0681e3a1217ec9d65a915944e1590968e18f5c43b2a8cb8279427784ee25ddb7aca9a8d32635f30342937ce84ed7dcb9ad5917490f12a529ba2f90ab66f0b883d984a34c84e4d9989a5838&ascene=14&uin=MjU1NTAyODYzOQ%3D%3D&devicetype=Windows+10+x64&version=62090070&lang=zh_CN&exportkey=A1o8BWxwtDxIVK9Jf5svcfY%3D&pass_ticket=I4d3%2BiuaE7LuCv3tQWf6dE4SqG%2FaKwD3EVWAiNRalfk%2B5jccux53f40KN6dYx6nb

Attention机制其实就是一系列注意力分配系数,也就是一系列权重参数

9.用了哪些多种损失函数,focal loss是什么,为何有效
图片说明

https://blog.csdn.net/u013841196/article/details/88649197

10.AUC是什么,ROC是什么,思考过比赛的评价指标为何用AUC?
参答:https://blog.csdn.net/u013063099/article/details/80964865
分类任务性能度量:
(1)错误率和精度(准确度)
错误率是分类错误的样本数占样本总数的比例,精度是分类正确的的样本数占样本总数的比例
(2)查准率、查全率
二分类问题,可将样例根据真实类别和学习器预测类别的组合划分为下图,显然有TP+FP+TN+FN=样例总数

图片说明
(3)F1
PR曲线:横轴查全率,纵轴查准率
图片说明
(4)ROC、AUC
AUC是ROC曲线下的面积
ROC是受试者工作特征曲线,横轴是假正例率FPR(FPR=FP/(TN+FP)),纵轴是真正例率TPR(TPR=TP/(TP+FN))
(5)AUC作用
AUC是衡量二分类模型优劣的一种评价指标,表示预测的正例排在负例前面的概率
很多的机器学习模型计算结果都是概率的形式,那么对于概率而言,我们就需要去设定一个阈值来判定分类,那么这个阈值的设定就会对我们的正确率和准确率造成一定程度的影响

11.集成方法了解么
bagging:
boosting:
stacking:
https://www.cnblogs.com/zongfa/p/9304353.html

12.编程题:
给定不同面额的硬币和一个总金额,计算可以凑成总金额的硬币组合数。无限硬币
例:amount = 5, coins = [1, 2, 5]
https://leetcode-cn.com/problems/coin-change/

def main(amount, coins):
  dp=[0]*(amount+1)
  dp[0]=1

  for coin in coins:
    for x in range(coin,amount+1):
      dp[x]+=dp[x-coin]

  return dp[amount]

为何不能写成如下形式:

def main(amount, coins):
  dp=[0]*(amount+1)
  dp[0]=1

  for x in range(amount + 1):
    for coin in coins:
        if x > coin:
          dp[x]+=dp[x-coin]
  return dp[amount]