火影 发表于 2024-8-1 19:18:11

大数据最全算法工程师口试八股(搜广推方向)_算法岗八股,2024年最新网易

https://img-blog.csdnimg.cn/img_convert/3df7f71cf1f5179b7c99f27d85af51a9.png
https://img-blog.csdnimg.cn/img_convert/304cb64b52cc143d12e542bfc94cd3f6.png
网上学习资料一大堆,但如果学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技能提升。
必要这份系统化资料的朋友,可以戳这里获取
一个人可以走的很快,但一群人才华走的更远!不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都接待参加我们的的圈子(技能交换、学习资源、职场吐槽、大厂内推、口试辅导),让我们一起学习成长!
E
w
,
b
=

i
=
1
m
(
y
i

1
1


[*]
e

(
w
T
x
i


[*]
b
)
)
2
E_{w,b}=\sum_{i=1}^{m}\left ( y_{i}-\frac{1}{1+e^{-\left ( w^{T}x_{i}+b \right )}}\right )^2
Ew,b​=∑i=1m​(yi​−1+e−(wTxi​+b)1​)2 ,黑白凸的,不容易求解,会得到局部最优。


[*]如果用最大似然估计,目标函数就是对数似然函数:
l
w
,
b
=

i
=
1
m
(

y
i
(
w
T
x
i


[*]
b
)


[*]
l
n
(
1


[*]
e
w
T
x
i


[*]
b
)
)
l_{w,b}=\sum_{i=1}^{m}\left ( -y_{i}\left ( w^{T}x_{i}+b \right )+ln\left ( 1+e{w{T}x_{i}+b} \right ) \right )
lw,b​=∑i=1m​(−yi​(wTxi​+b)+ln(1+ewTxi​+b)) ,是关于 (w,b) 的高阶一连可导凸函数,可以方便通过一些凸优化算法求解,比如梯度下降法、牛顿法等。
优点:

[*]直接对分类大概性进行建模,无需实现假设数据分布,这样就避免了假设分布禁绝确所带来的题目。
[*]形式简单,模子的可表明性非常好,特征的权重可以看到不同的特征对最后结果的影响。
[*]除了类别,还能得到近似概率预测,这对许多需利用概率辅助决策的任务很有用。
缺点:

[*]准确率不是很高,因为形势非常的简单,很难去拟合数据的真实分布。
[*]本身无法筛选特征。
推导:
https://img-blog.csdnimg.cn/direct/1efca39fdf8340f9856204e69b9cbc08.png
从零开始学会逻辑回归(一)
二分类和多分类的丧失函数

分类题目输出层激活函数丧失函数说明二分类Sigmoid二分类交叉熵丧失函数(binary_crossentropy)sigmoid作为最后一层输出,不能把最后一层的输出看作成一个分布,因为加起来不为1。应将最后一层的每个神经元看作一个分布多分类Softmax多类别交叉熵丧失函数(categorical_crossentropy)Softmax后最后一层输出概率相加为1多标签分类Sigmoid二分类交叉熵丧失函数(binary_crossentropy)计算一个样本各个标签的丧失取平均值。把一个多标签题目转化为在每个标签上的二分类题目

[*]BCE Loss:
L
=
1
N

i
L
i
=
1
N

i
[
y
i
l
o
g
(
p
i
)


[*]
(
1

y
i
)
l
o
g
(
1

p
i
)
]
L=\frac{1}{N}\sum_iL_i=\frac{1}{N}\sum_i
L=N1​∑i​Li​=N1​∑i​


[*]CE Loss:
L
=
1
N

i
L
i
=

1
N

i

c
=
1
M
y
i
c
l
o
g
(
p
i
c
)
L=\frac{1}{N}\sum_iL_i=-\frac{1}{N}\sum_i \sum^M_{c=1}y_{ic}log(p_{ic})
L=N1​∑i​Li​=−N1​∑i​∑c=1M​yic​log(pic​)
二分类和多分类的激活函数和丧失
二分类为什么用交叉熵丧失而不消MSE丧失?



[*]对概率分布更敏感: 交叉熵丧失更适用于概率分布的比较,而二分类题目通常涉及到概率的预测。交叉熵丧失能够权衡实际概率分布与预测概率分布之间的差别,更加敏感和有用。
[*]梯度更新更好: 在分类题目中,交叉熵丧失函数的梯度更为明白和稳定,相比之下,均方误差丧失大概会导致练习过程中梯度消失或梯度爆炸的题目。
[*]更好地表达分类目标: 交叉熵丧失更加关注准确类别的预测概率,而均方误差对所有类别的预测概率都进行了平方差的计算,大概会导致对错误类别的概率影响不敷明显。
偏差与方差

令y表现数据的label,f(x)表现测试数据的预测值,
f
(
x
)

\overline{f(x)}
f(x)​表现学习算法对所有数据集的期望预测值。则偏差表现期望预测值
f
(
x
)

\overline{f(x)}
f(x)​与标志y之间的差距,差距越大说明偏差越大;而方差是测试预测值f(x)与预测值的期望值
f
(
x
)

\overline{f(x)}
f(x)​之间的差距,差距越大说明方差越大。偏差表征模子对数据的拟合能力;而方差表征数据集的变动导致的学习性能的变化,也就是泛化能力。
Layer Normalization 和 Batch Normalization

“独立同分布”的数据能让人很快地发觉数据之间的关系,因为不会出现像过拟合等题目。为相识决ICS(internal covarivate shift内部协变量漂移)题目,即数据分布会发生变化,对下一层网络的学习带来困难。一般在模子练习之前,必要对数据做归一化。
LayerNorm,对单个样本的所有维度特征做归一化,对模子中每个子层的输入归一化处置惩罚,使得每个特征的均值为0,方差为1。有助于缓解内部协变量偏移的题目,进步模子的练习服从和鲁棒性。
batch normalization是对一批样本的同一纬度特征做归一化。强行将数据转为均值为0,方差为1的正态分布,使得数据分布一致,而且避免梯度消失。而梯度变大意味着学习收敛速度快,能够进步练习速度。设batch_size为m,网络在向前传播时,网络 中每个神经元都有m个输出,BN就是将每个神经元的m个输出进行归一化处置惩罚。


[*]尺度化:求得均值为0,方差为1的尺度正态分布
x
ˉ
i
\bar{x}_{i}
xˉi​


[*]尺度变换和偏移:得到新的分布
y
i
y_i
yi​。均值为 β,方差为 γ(其中偏移 β 和尺度变换 γ 为必要学习的参数)。该过程有利于数据分布和权重的相互和谐。
区别:


[*]从操作上看:BN是对同一个batch内的所有数据的同一个特征数据进行操作;而LN是对同一个样本进行操作。
[*]从特征维度上看:BN中,特征维度数=均值or方差的个数;LN中,一个batch中有batch_size个均值和方差。
关系:


[*]BN 和 LN 都可以比较好的抑制梯度消失和梯度爆炸的环境。BN不适合RNN、transformer等序列网络,不适合文本长度不定和batchsize较小的环境,适合于CV中的CNN等网络;
[*]而LN适合用于NLP中的RNN、transformer等网络,因为sequence的长度大概是不一致的。
[*]如果把一批文本组成一个batch,BN就是对每句话的第一个词进行操作,BN针对每个位置进行缩放就不符合NLP的规律了。
小结:


[*]颠末BN的归一化再输入激活函数,得到的值大部分会落入非线性函数的线性区,导数远离导数饱和区,避免了梯度消失,这样来加速练习收敛过程。
[*]归一化技能就是让每一层的分布稳定下来,让反面的层能在前面层的基础上“安心学习”。BatchNorm就是通过对batch size这个维度归一化来让分布稳定下来(但是BN没有办理ISC题目)。LayerNorm则是通过对Hidden size这个维度归一。
【深度学习】batch normalization和layer normalization区别
SVM

为什么要从原题目转换为对偶题目求解?


[*]不等式约束方程必要写成min max的形式来得到最优解。而这种写成这种形式对x不能求导,这种形式只能对拉格朗日乘子
α
\alpha
α求导,以是我们必要转换成max min的形式,这时候,x就在里面了,这样就能对x求导了。而为了满足这种对偶变换建立,就必要满足KKT条件(KKT条件是原题目与对偶题目等价的必要条件,当原题目是凸优化题目时,变为充要条件)。只用求解
α
\alpha
α系数,而
α
\alpha
α系数只有支持向里才非0,其它全部为0。


[*]对偶题目将原始题目中的约束转为了对偶题目中的等式约束
[*]方便核函数的引入,推广到非线性分类题目
[*]改变了题目的复杂度。由求特征向量w转化为求比例系数a,在原始题目下,求解的复杂度与样本的维度有关,即w的维度。在对偶题目下,只与样本数量有关。
SVM从原始题目到对偶题目的转换及原因
SVM中,高斯核为什么会把原始维度映射到无穷多维?
数据不均衡

数据不均衡(如正例很少,负例很多)办理办法:

[*]欠采样:对负例进行欠采样。一种代表性算法是将负例分成很多份,每次用其中一份和正例一起练习,最后用集成学习综合结果。
[*]过采样:对正例进行过采样。一种代表性方法是对正例进行线性插值来得到更多的正例。
[*]调整丧失函数:练习时正常练习,分类时将数据不均衡题目参加到决策过程中。比方在我做的文本检测项目中,正常练习,但是判断某个像素是否是文本时
L
o
s
s
=

β
Y
l
o
g
Y
^

(
1

β
)
(
1

Y
)
l
o
g
(
1

Y
^
)
Loss=-\beta{Y}log\hat{Y}-(1-\beta)(1-Y)log(1-\hat{Y})
Loss=−βYlogY−(1−β)(1−Y)log(1−Y),其中Y是样本的标志,
Y
^
\hat{Y}
Y^是预测值,β是负样本和总体样本的比值。通过参加 β和1−β使得数量较少的正样本得到更多的关注,不至于被大量的负样本掩盖。
4. 组合/集成学习:比方正负样本比例1:100,则将负样本分成100份,正样本每次有放回采样至与负样本数雷同,然后取100次结果进行平均。
5. 数据加强:单样本加强如多少变换、颜色变换、增加噪声;多样本组合加强如Smote类、SamplePairing、Mixup等方法在特征空间内构造已知样本的邻域值样本;基于深度学习数据加强
特征选择

目标是从原始特征集中选择最相关、最有用的特征,以进步模子性能和泛化能力。常用特征选择方法:


[*]过滤式:独立于学习算法,据特征的统计属性对特征评估和排序。包罗相关系数、卡方查验、信息增益、互信息法等。过滤式方法计算快速、简单,适用于高维数据,但大概忽略特征之间的相互关系。

[*]方差选择:计算特征在数据中的方差来判断是否保存。特征方差低于预先设定的阈值,这个特征大概没有充足的变化,对分类回归任务大概没有太大贡献,可以被移除。
[*]相关系数:用来权衡两个变量之间线性关系强度的指标。计算特征与目标变量之间的相关系数,选择与目标变量具有较高相关性的特征。
[*]卡方查验:适用于分类题目中的特征选择。计算特征与目标变量之间的卡方统计量,来权衡特征和目标之间的独立性。选择卡方值较大的特征,与目标变量更相关。
[*]互信息:权衡两个变量之间相关性的指标。计算特征与目标变量之间的互信息,选择与目标变量具有较高互信息的特征。

[*]嵌入式(Embedded):特征选择与学习算法的练习过程联合,特征选择作为学习算法的一部分。在学习算法中直接思量特征的紧张性,通过正则化、惩罚项或决策树剪枝等方式选择特征。嵌入式方法包罗L1正则化(Lasso)、决策树的特征紧张性、正则化的线性模子等。嵌入式方法可以在模子练习过程中主动选择特征,镌汰了特征选择的额外计算开销。
[*]包裹式(Wrapper):利用机器学习模子评估特征的紧张性。在特征子集上进行交叉验证,选择性能最好的特征子集进行特征选择。基于树模子的方法(如决策树和随机森林)可以评估特征的紧张性。树模子通过计算特征在树中的分裂次数宁静均分裂增益权衡特征对模子的贡献。它直接利用最终学习算法对每个特征子集进行评估,可以更好地捕获特征之间的相互作用。包裹式方法包罗递归特征消除和遗传算法等。包裹式方法计算开销大、耗时长,适用于小规模数据和特定题目。
排序模子

旨在根据用户偏好和上下文信息,预测每个项目的相关性或排名,为用户提供最相关和个性化的结果。模子输入包罗:


[*]特征:描述每个项目的属性和上下文信息,如项目标签、关键词、评分、发布时间、用户特征等。特征可以是离散的、一连的或文本类型的。
[*]用户信息:包罗用户汗青行为、爱好偏好、地理位置等,用于个性化保举和排序。
[*]上下文信息:指在排序过程中大概影响用户偏好的其他因素,如时间、设备类型、欣赏环境等。
常见排序模子包罗:


[*]点击率预测模子:通过预测用户点击每个项目的概率进行排序。包罗逻辑回归、梯度提升树、神经网络等。
[*]排序神经网络:利用神经网络来学习项目之间的相对排名关系。包罗RankNet、LambdaRank和ListNet等。
[*]线性模子和特征工程:基于线性模子联合特征工程技能学习特征权重和组合。包罗线性回归、排序SVM等。
[*]排序树模子:利用决策树排序,如LambdaMART和GBDT等。
模子练习中常用丧失函数包罗交叉熵丧失函数、均方误差丧失函数、排序丧失函数(如NDCG)等。为进步排序模子性能,可以接纳特征选择、特征组合、正则化等技能。
树模子进行特征工程的原因



[*]改善模子性能: 特征工程有助于提取更具预测性的特征,可以资助模子更好地拟合数据,提升模子的预测性能。
[*]降低过拟合风险: 符合的特征工程可以资助模子更好地泛化到新的数据集上,降低过拟合的风险,进步模子的稳定性和泛化能力。
[*]镌汰计算复杂度: 特征工程有助于镌汰特征空间的维度,从而镌汰计算复杂度,并加速模子的练习和预测过程。
[*]进步可表明性: 通过合理的特征工程,可以使得模子更易于表明和理解,有助于深入理解数据特征对模子预测的影响。
[*]办理特征相关性和噪音题目: 特征工程有助于发现和处置惩罚特征之间的相关性和噪音,使模子更加健壮。
GBDT

一种基于boosting加强策略的加法模子,练习时接纳前向分布算法进行贪心学习,迭代地练习一系列弱学习器,并将它们组合成一个强大的集成模子。每次迭代都学习一棵CART树来拟合之前t-1棵树的预测结果与练习样本真实值的残差。
LR和GBDT

LR是线性模子,可表明性强,很容易并行化,但学习能力有限,必要大量的人工特征工程。GBDT黑白线性模子,具有天然的特征组合优势,特征表达能力强,但是树与树之间无法并行练习,且树模子很容易过拟合;当在高维希罕特征的场景下,LR的效果一般会比GBDT好。
RF和GBDT

雷同点:都是由多棵树组成,最终的结果都是由多棵树一起决定。
不同点:


[*]集成学习:RF属于bagging头脑,而GBDT是boosting头脑
[*]偏差-方差权衡:RF不停的降低模子的方差,而GBDT不停的降低模子的偏差
[*]练习样本:RF每次迭代的样本是从全部练习集中有放回抽样形成的,而GBDT每次利用全部样本
[*]并行性:RF的树可以并行生成,而GBDT只能次序生成(必要等上一棵树完全生成)
[*]最终结果:RF最终是多棵树进行多数表决(回归题目是取平均),而GBDT是加权融合
[*]数据敏感性:RF对非常值不敏感,而GBDT对非常值比较敏感
[*]泛化能力:RF不易过拟合,而GBDT容易过拟合
XGBoost

eXtreme Gradient Boosting用于办理分类和回归题目。基于梯度提升框架,集成多个弱学习器(决策树)渐渐改善模子的预测能力。原理:


[*]丧失函数:回归题目常用平方丧失函数;分类题目常用对数丧失函数。
[*]弱学习器:用决策树作弱学习器。决策树是一种基于特征的分层划分,每个节点对应一个特征及其划分条件。XGBoost中决策树通过贪心算法生成,每次选择最大程度降低丧失函数的特征和划分点。
[*]梯度提升:利用梯度提升法集成多个弱学习器。每轮迭代中根据当前模子的预测结果计算丧失函数的梯度,并将其作为新目标练习。新弱学习器通过拟合当前目标渐渐改进模子预测能力。为控制每个弱学习器的贡献,引入了学习率缩小每轮迭代的步长。
[*]正则化:防止模子过拟合。正则化项由两部分组成:L1正则化(Lasso)和L2正则化(Ridge)。L1正则化使部分特征权重变零,实现特征选择;L2正则化对权重惩罚,降低模子的复杂度。
[*]树剪枝:构建决策树接纳主动树剪枝策略。计算每个叶节点的分数与正则化项比较,决定是否剪枝。剪枝过程从树的底部开始,渐渐向上剪除对模子贡献较小的分支。
[*]特征紧张性评估:提供一种度量特征紧张性的方法,评估每个特征对模子预测的贡献程度。练习中会跟踪每个特征被用于划分的次数及划分后带来的增益。计算特征的紧张性得分。
二阶泰勒展开优势



[*]xgboost是以MSE为基础推导出来的,xgboost的目标函数展开就是一阶项(残差)+二阶项的形式,而其他类似logloss这样的目标函数不能表现成这种形式。为了后续推导的同一,将目标函数进行二阶泰勒展开,就可以直接自定义丧失函数了,只要二阶可导即可,加强了模子的扩展性。
[*]二阶信息能够让梯度收敛的更快更准确,类似牛顿法比SGD收敛更快。一阶信息描述梯度变化方向,二阶信息可以描述梯度变化方向是怎样变化的。
xgboost是用二阶泰勒展开的优势在哪?
为什么快



[*]分块并行:练习前每个特征按特征值进行排序并存储为Block布局,反面查找特征分割点时重复利用,而且支持并行查找每个特征的分割点
[*]候选分位点:每个特征接纳常数个分位点作为候选分割点
[*]CPU cache 命中优化: 利用缓存预取的方法,对每个线程分配一个一连的buffer,读取每个block中样本的梯度信息并存入一连的Buffer中。
[*]Block 处置惩罚优化:Block预先放入内存;Block按列进行解压缩;将Block划分到不同硬盘来进步吞吐
防止过拟合



[*]目标函数添加正则项:叶子节点个数+叶子节点权重的L2正则化
[*]列抽样:练习的时候只用一部分特征(不思量剩余的block块即可)
[*]子采样:每轮计算可以不利用全部样本,使算法更加保守
[*]shrinkage: 可以叫学习率或步长,为了给反面的练习留出更多的学习空间
处置惩罚缺失值



[*]XGBoost答应特征存在缺失值。在特征k上探求最佳 split point 时,不会对该列特征 missing 的样本进行遍历,而只对该列特征值为 non-missing 的样本上对应的特征值进行遍历,通过这个本领来镌汰了为希罕离散特征探求 split point 的时间开销。
[*]在逻辑实现上,为了保证完备性,会将该特征值missing的样本分别分配到左叶子结点和右叶子结点,两种情形都计算一遍后,选择分裂后增益最大的谁人方向(左分支或是右分支),作为预测时特征值缺失样本的默认分支方向。
树停止生长条件



[*]当新引入的一次分裂所带来的增益Gain<0时,放弃当前的分裂。这是练习丧失和模子布局复杂度的博弈过程。
[*]当树到达最大深度时,停止建树,树深度太深容易过拟合,必要设置一个超参数max_depth。
[*]引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值,也会放弃此次分裂。这涉及到一个超参数:最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细。
处置惩罚不平衡数据



[*]如接纳AUC评估模子性能,可以通过设置scale_pos_weight参数来平衡正样本和负样本的权重。如正负样本比例为1:10时,scale_pos_weight可以取10;
[*]如果在意预测概率(预测得分的合理性),不能重新平衡数据集(会破坏数据的真实分布),应该设置max_delta_step参数为一个有限数字(如1)来资助收敛。max_delta_step参数通常不进行利用,二分类下的样本不均衡题目是这个参数唯一的用途。
树剪枝



[*]在目标函数中增加了正则项:利用叶子结点的数目和叶子结点权重的L2模的平方,控制树的复杂度。
[*]在结点分裂时,定义了一个阈值,如果分裂后目标函数的增益小于该阈值,则不分裂。
[*]当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值(最小样本权重和),也会放弃此次分裂。
[*]XGBoost 先从顶到底建立树直到最大深度,再从底到顶反向检查是否有不满足分裂条件的结点,进行剪枝。
选择最佳分裂点

XGBoost在练习前预先将特征按照特征值进行了排序,并存储为block布局,以后在结点分裂时可以重复利用该布局。因此,可以接纳特征并行的方法利用多个线程分别计算每个特征的最佳分割点,根据每次分裂后产生的增益,最终选择增益最大的谁人特征的特征值作为最佳分裂点。
如果在计算每个特征的最佳分割点时,对每个样本都进行遍历,计算复杂度会很大,这种全局扫描的方法并不适用大数据的场景。
XGBoost提供了一种直方图近似算法,利用weighted quantile sketch算法近似地找到best split,对特征排序后仅选择常数个候选分裂位置作为候选分裂点。
按比例来选择,从n个样本中抽取k个样本来进行计算,取k个样本中的最优值作为split value,这样就大大镌汰了运算数量。按样本均分会导致loss分布不匀称,取到的分位点会有偏差。我们要均分的是loss,而不是样本的数量。将样本对应的残差二阶导h作为划分依据,将同范围h占比的特征值划分到同一范围内。残差二阶导差别越大的地方,样本分布越希罕,反之则稠密。加权意义在于把候选节点选取的时机更多地让于二阶导更大的地方,同时忽略导数差别小的节点。
Scalable性



[*]基分类器的scalability:弱分类器可以支持CART决策树,也可以支持LR和Linear。
[*]目标函数的scalability:支持自定义loss function,只必要其一阶、二阶可导。有这个特性是因为泰勒二阶展开,得到通用的目标函数形式。
[*]学习方法的scalability:Block布局支持并行化,支持Out-of-core计算。
当数据量太大不能全部放入主内存的时候,为了使得out-of-core计算称为大概,将数据划分为多个Block并存放在磁盘上。计算时利用独立的线程预先将Block放入主内存,因此可以在计算的同时读取磁盘。但是由于磁盘IO速度太慢,通常更不上计算的速度。因此,必要提升磁盘IO的销量。Xgboost接纳了2个策略:


[*]Block压缩(Block Compression):将Block按列压缩,读取的时候用别的的线程解压。对于行索引,只保存第一个索引值,然后只保存该数据与第一个索引值之差(offset),一共用16个bits来保存offset,因此,一个block一般有2的16次方个样本。
[*]Block拆分(Block Sharding):将数据划分到不同磁盘上,为每个磁盘分配一个预取(pre-fetcher)线程,并将数据提取到内存缓冲区中。然后,练习线程交替地从每个缓冲区读取数据。这有助于在多个磁盘可用时增加磁盘读取的吞吐量。
特征紧张性



[*]weight :该特征在所有树中被用作分割样本的特征的总次数。
[*]gain :该特征在其出现过的所有树中产生的平均增益。
[*]cover :该特征在其出现过的所有树中的平均覆盖范围。
注意:覆盖范围这里指的是一个特征用作分割点后,其影响的样本数量,即有多少样本颠末该特征分割到两个子节点。
调参步调

首先需初始化一些基本变量,如:max_depth = 5, min_child_weight = 1, gamma = 0, subsample, colsample_bytree = 0.8, scale_pos_weight = 1,确定learning rate和estimator的数量 lr可先用0.1,用xgboost.cv()来探求最优的estimators。


[*]max_depth, min_child_weight: 首先将这两个参数设置为较大的数,通过迭代方式不停修正,缩小范围。max_depth每棵子树的最大深度,check from range(3,10,2)。min_child_weight子节点的权重阈值,check from range(1,6,2)。 如果一个结点分裂后,它的所有子节点的权重之和都大于该阈值,该叶子节点才可以划分。
[*]gamma: 最小划分丧失min_split_loss,check from 0.1 to 0.5,对于一个叶子节点,当对它接纳划分之后,丧失函数的降低值的阈值。如果大于该阈值,则该叶子节点值得继承划分。如果小于该阈值,则该叶子节点不值得继承划分。
[*]subsample, colsample_bytree: subsample是对练习的采样比例,colsample_bytree是对特征的采样比例,both check from 0.6 to 0.9
[*]正则化参数。alpha 是L1正则化系数,try 1e-5, 1e-2, 0.1, 1, 100。lambda 是L2正则化系数
[*]降低学习率:降低学习率的同时增加树的数量,通常最后设置学习率为0.01~0.1
过拟合办理方案

有两类参数可以缓解:

[*]用于直接控制模子的复杂度。包罗max_depth,min_child_weight,gamma 等参数
[*]用于增加随机性,从而使得模子在练习时对于噪音不敏感。包罗subsample,colsample_bytree
直接减小learning rate,但必要同时增加estimator参数。
对缺失值不敏感

对存在缺失值的特征,一般的办理方法是:


[*]离散型变量:用出现次数最多的特征值添补;
[*]一连型变量:用中位数或均值添补;
一些模子如SVM和KNN,其模子原理中涉及到了对样本距离的度量,如果缺失值处置惩罚不妥,最终会导致模子预测效果很差。而树模子对缺失值的敏感度低,大部分时候可以在数据缺失时时利用。原因是,一棵树中每个结点在分裂时,探求的是某个特征的最佳分裂点(特征值),完全可以不思量存在特征值缺失的样本,如果某些样本缺失的特征值缺失,对探求最佳分割点的影响不是很大。
XGBoost对缺失数据有特定的处置惩罚方法, 因此,对于有缺失值的数据在颠末缺失处置惩罚后:


[*]当数据量很小时,优先用淳厚贝叶斯
[*]数据量适中大概较大,用树模子,优先XGBoost
[*]数据量较大,也可以用神经网络
[*]避免利用距离度量相关的模子,如KNN和SVM
XGBoost和RF单棵树哪个更深?

RF单颗树更深。Boosting紧张关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging紧张关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
Bagging算法会并行地练习很多不同的分类器来降低方差variance:
E
[
h

E
(
h
)
]
E
E,因为接纳了相互独立的基分类器多了以后,h的值自然就会靠近E(h)。以是对于每个基分类器来说,目标就是降低偏差bias,以是会接纳深度很深乃至不剪枝的决策树。对于Boosting来说,每一步会在上一轮的基础上更加拟合原数据,以是可以保证偏差bias,以是对于每个基分类器来说,题目就在于怎样选择variance更小的分类器,即更简单的分类器,以是我们选择了深度很浅的决策树。
XGBoost和GBDT



[*]梯度提升决策树:都属于梯度提升决策树算法。集成学习方法,组合多个决策树渐渐减小预测误差,进步模子性能。
[*]目标函数:利用雷同的目标函数,通过最小化残差的平方和优化模子。每一轮迭代中,都会构建一个新的决策树来拟合前面模子的残差,以改正之前模子的预测误差。
[*]特征工程:都支持类别型特征和缺失值的处置惩罚。在构建决策树时能主动处置惩罚类别型特征,不必要独热编码等转换。
区别:


[*]基分类器:XGBoost基分类器不但支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的Logistic回归(分类题目)大概线性回归(回归题目)。
[*]正则化策略:XGBoost引入正则化防止过拟合,包罗L1和L2正则化控制模子的复杂度。
[*]算法优化:XGBoost利用近似贪心算法选择最佳分裂点,利用二阶导数信息更精准逼近真实的丧失函数,来进步模子的拟合能力。支持自定义丧失函数,只要丧失函数一阶、二阶可导,可扩展性好。
[*]样本权重:XGBoost引入样本权重概念,对不同样本赋予不同权重,从而对模子练习产生不同影响。在处置惩罚不平衡数据集或处置惩罚样本噪声时非常有用。
[*]并行计算:XGBoost在多个线程上同时进行模子练习,利用并行计算和缓存优化加速练习过程。不是tree维度的并行,而是特征维度的并行。XGBoost预先将每个特征按特征值排好序,存储为块布局,分裂结点时可以接纳多线程并行查找每个特征的最佳分割点,极大提升练习速度。GBDT通常是次序练习的,无法直接进行并行化。
[*]列抽样:XGBoost支持列采样,与随机森林类似,用于防止过拟合。
XGBoost和LightGBM



[*]梯度提升决策树:都属于梯度提升决策树算法。集成学习方法,组合多个决策树渐渐减小预测误差,进步模子性能。
[*]特征工程:都支持类别型特征和缺失值的处置惩罚。在构建决策树时能主动处置惩罚类别型特征,不必要独热编码等转换。还能处置惩罚带缺失值的数据。
[*]分布式练习:都支持分布式练习,可在分布式计算框架(如Spark)上运行。
区别:


[*]算法速度:LightGBM在练习和预测速度上更快。LightGBM接纳基于梯度的直方图决策树算法来加速练习过程,镌汰内存利用和计算复杂度。
[*]内存占用:LightGBM具有更低的内存占用,适用于处置惩罚大规模数据集。利用了互斥特征捆绑算法和直方图算法来镌汰内存利用,进步了算法的扩展性。
[*]正则化策略:都支持正则化策略来防止过拟合。XGBoost接纳基于树的正则化(如最大深度、最小子样本权重等),LightGBM接纳基于叶子节点的正则化(如叶子数、最小叶子权重等)。
[*]数据并行和特征并行:XGBoost利用数据并行化,将数据划分为多个子集,每个子集在不同的计算节点上进行练习。LightGBM利用特征并行化,将特征划分为多个子集,每个子集在不同的计算节点上进行练习。

[*]树生长策略:XGB接纳level-wise(按层生长)的分裂策略,LGB接纳leaf-wise的分裂策略。XGB对每一层所有节点做无差别分裂,但是大概有些节点增益非常小,对结果影响不大,带来不必要的开销。Leaf-wise是在所有叶子节点中选取分裂收益最大的节点进行的,但是很容易出现过拟合题目,以是必要对最大深度做限定 。
[*]分割点查找算法:XGB利用特征预排序算法,LGB利用基于直方图的切分点算法,优势如下:

[*]镌汰内存占用,比如离散为256个bin时,只必要用8位整形就可以保存一个样本被映射为哪个bin(这个bin可以说就是转换后的特征),对比预排序的exact greedy算法来说(用int_32来存储索引+ 用float_32保存特征值),可以节省7/8的空间。
[*]计算服从进步,预排序的Exact greedy对每个特征都必要遍历一遍数据,并计算增益,复杂度为
页: [1]
查看完整版本: 大数据最全算法工程师口试八股(搜广推方向)_算法岗八股,2024年最新网易