看了下 @王喆 的回答,很赞, 摘一下他回答中提到的一些面试问题:& \. ]! f9 Z7 h; t z6 q" U; u
面试官如何判断面试者的机器学习水平? - 王喆的回答 - 知乎 https://www.zhihu.com/question/62482926/answer/529823808' Z2 L' t* E) I) b! A# }) l8 j
/ h3 ]3 G( N, E, }/ y& E I4 b3 K, L
G6 A2 J! _# H' F; V9 v $ e) O2 j* Z1 e0 M# J
5 H& Q' H: U- x我来试着答一下:$ W6 S2 ?7 |: P" [: r" ^4 l
GBDT的原理 (理论基础)9 o( p8 |% q0 z0 D
(1) M棵树 加权求和(boosting思想): 
) q& p+ u, K& B, j5 J(2)单步求解各回归树(前向分步加法模型) ; 第m步求解: 
7 J& c! Q7 |+ Y5 R4 \(3) loss为mse时拟合残差, 根据公式很容易得到, 以单样本为例: # T: T* w9 M( M& X: a
,
* G4 Q1 }2 n* o& }残差 , 相当于把样做如下处理: , 拟合rm求最小化loss得到第m步的回归树 ;
* H! M) d( z4 u* ~; T) H6 ] n(4)更一般化, 推广到任意一阶可导函数, 根据一阶泰勒展开; 对于关于 的函数损失 , 当 , 8 a) v. D, M6 e! @+ \9 F
loss变化: , loss必减小- B0 w9 a: V1 i" i
这里, loss关于 的负梯度 称为"伪残差", 所以一般化的GBDT, 每一步可看做实在拟合"伪残差", 来生成一棵分布loss最小的树 ; 7 N$ r: q, b n! o1 C( A! j" o
(5)其它都是一些细节了, 比如和adaboost区别, 和xgboost区别, 和随机森林的区别, 比如gbdt能降低偏差(这是显然的, 每一步都在拟合目标和预测值的残差);2 k- E1 ~3 s- }. T
2. 决策树节点分裂时如何选择特征,写出Gini index和Information Gain的公式并举例说明(理论基础)& Q0 E1 l' |8 g$ k; Q
(1)能将有限样本分开的树结构有无穷多种, 决策树核心思想是用"启发式"算法来找最优决策树; # _; ]& u- x- _5 F
(2) 节点分裂时根据不同启发式算法, 特征选择方式不同; : K( E: M6 n5 G0 _- j
(3) 对于特征A, 假设有三个值, 将特征空间分为D1, D2, D3三个区域, gini(D, A) = D1/D gini(D1) + D2/D gini(D2) + D3/D gini(D3), 再假设是个二分类问题, 两个标签, gini(D1) = p1(1-p1)+p2(1-p2) (只关注D1所在的行), 想象一下, 每次计算特征的gini时, 按照各特征的值对样本全局排序, 这样比较好计算;/ K; H; u6 W! N) s5 X/ U
3.分类树和回归树的区别是什么?(理论基础) 5 j3 b& C1 ]1 w- ]( u' l1 A+ B
(1)启发函数不同啊, CART里分类用gini, 回归用平方差;
; w9 P' U( A$ r1 Y% Y/ _(2)结点的值不同啊, 分类存储的是最优分裂特征, 回归存储的是最佳切分点;
! w% d0 g3 `' ^0 ^(3) 回归树也可以解分类问题啊; / B+ @" j) g; v' e
4. 与Random Forest作比较,并以此介绍什么是模型的Bias和Variance(理论基础)8 U: C7 k" I" m+ c
(1) rf:有放回自助采样+列采样, 假设r是相关系数, 根据 , 有放回自助采样增加了各模型的独立性, 一方面, 各模型训练样本完全独立时, 方差 , 降低到原来的1/n; 另一方面, 各模型样本完全一样时, , 方差不变; 一般的rf采样得到的样本, 独立同分布又不完全一样, 所以方差在sigma^2/n和sigma^2之间;
1 ?. A' {2 d2 L0 N* \; w: T7 L(2) rf对分类问题加权投票, 回归问题取均值, , 不会降低偏差;
6 H4 c e+ A7 ^2 z. A/ ^; `(3)gbdt降低偏差是因为每一步都是基于上一轮残差或"伪残差"(loss关于上一棵树的负梯度)拟合样本, 偏差自然会减小; + i% L9 h" B- q6 p. u( B
(4)偏差太大模型欠拟合, 偏差太小模型过拟合, 方差太小模型泛化性能会交叉, 总之就是在做一个trade-off, 来寻求结构风险最小化; 7 E8 g }2 u7 L: V4 u0 i
5. XGBoost的参数调优有哪些经验(工程能力)
, w4 P% ^$ M. L' p(1) 从正则化项来考虑: 调第一项 , 控制叶节点个数, 调 , 平滑叶节点权重; & C# s2 F. z8 N: x; w
(2) 考虑gain, 我们预期C(分列前)-C(分裂后)的gain应该大于0, 但有时候gain会小于0, 此时是否需要early_stopping? (注意虽然当前收益为负, 有可能对后续各步有正向收益), 所以需要加树的深度来做trade-off, 某次split的gain为负时, 是否达到earlystopping条件? 是否达到设定的最小树深度, 如果没有, 就把这个split节点也加进来;
. M5 s0 }- G, G7 T1 w(3) 从shrinkage公式来考虑, , 学习速率可以控制拟合速度, 也就是单步生成的树的权重;
! I ^* p# C3 t. V2 s$ e0 V' A(4) 从随机森林借鉴过来的列采样, 这也算一个参数吧, 可以控制每轮训练样本子集间的相关性(增加非相关性), 降低方差(参考公式: ); 4 ~% z0 S8 G' I3 R3 \
(5) 还有啥? 超参寻优, 参考sklearn的gridsearchcv, randomsearchcv; 做一下k-fold交叉验证, 找一下方差最小的最优参数, 比如迭代次数, 树的深度等
9 g0 M8 h( `- @/ K4 q" [: `: ]) c(6) 借鉴一下kaggle, 做一下EDA, 缺失值填充(xgboost的默认处理方式不一定符合你需求,归一化, 相关性分析;
0 A6 f- H! y1 u(7) 做一下stacking ?
, m* H) c5 \! F1 C" T6. XGBoost的正则化是如何实现的(工程能力)% ~' U6 R. g2 Z9 t, Q
正则化是个很宽泛的概念, 举几个典型的:
- ?! Z+ T$ X6 \& U$ R(1) , 第一个参数控制第m步生成树的叶节点个数, 第二个参数是l2正则, 平滑每个结点权重;
, B% L, W8 i& W* w3 a; C(2) eraly_stopping, 某次叶节点分裂时, 如果gain为负, 是否停止增长? 这也算一种正则; * d/ a& `* d- |6 {. r3 X8 w, a& ^
(3) 后剪枝;
1 f7 u+ H" f$ e+ o8 ]- u+ B(4)学习速率控制优化步长(单棵树的权重); 6 T! h! E' Y# Y0 r" P
7.XGBoost的并行化部分是如何实现的(工程能力)+ h9 X; ] {8 E7 e8 q
寻找结点分裂: : Y" V2 i, g6 h2 @# w$ Q
假设生成f(x)需要m步, 样本特征有d维, 样本个数n个, 则每次寻找最优结点时间复杂度:/ b" Q$ n: D0 i% s s
, 其中每轮对feature values排序部分的时间复杂度 是可以优化的部分, 可以预排序存储好, 直接调用, 这样总的时间复杂度下降到: 
" x. \+ o" g# Z* U8. 为什么预测股票涨跌一般都会出现严重的过拟合现象(业务理解)
2 K+ } T7 T% \这个问题比较任性, 为啥预测股票一定会过拟合? 不太能理解, 如果是问过拟合的原因的话, 无非两个:
6 B1 n5 K) S: s7 E5 n u(1) 数据问题: 数据量太少# D" u( {% }% v/ S
(2) 模型问题: 模型太复杂, 模型学到了噪声: X' j( p @ Q# C* K9 L
M9 `& A7 _$ V# e, S9. 如果选用一种其他的模型替代XGBoost,你会选用什么?(业务理解和知识面)
7 B- W, ?. k# h A(1)特定领域用特定模型, 一般传统机器学习的分类问题最好还是用xgboost这种ensemble方法来解.
1 w9 ?: L& W+ J5 n( b(2)业务理解,特征工程远比对模型做"优中选优"更有收益, 好特征带来的收益都是百分之几, 模型优化, 带来的收益一般在小数点后1-2位, 也就是百分之0.几的样子0 X7 y- ~, W, R Y# Y
3 A: C+ m/ _& l# f) [# }
(后续想到什么再补充.) |