【答】阿里机器学习面经
作者:sosilent
链接:https://www.nowcoder.com/discuss/75360type=2&order=3&pos=216&page=2
根据作者阿里机器学习面经整理
- 1、监督学习非监督学习啥区别,word2vec 属于啥类型
- 2、xgb,gbdt啥区别
- 4、xgb中l1正则怎么用的
- 5、python 中 list 底层怎么实现, list 有什么特点
- 6、list dict有什么区别
- 7、手写对dict排序
- 8.集成学习介绍(boosting bagging stacking原理)
- 9.stacking blending区别
- 10.分析为什么使用xgb(提示,从特征维度,样本维度等进行比较)
- 11.过拟合的判断方法
- 12.过拟合如何解决
- 13.造成过拟合的原因有可以归结为:参数过多或样本过少。那么我们需要做的事情就是减少参数,提供两种办法:
- 14.python 中 key-value的数据结构字典dict
- 15.dict底层如何实现
- 16.如何解决哈希冲突
- 18.解释k-means原理
- 19.距离的计算方法
- 20.监督学习模型如何选取
- 21. 详细分析xgb原理,怎么选分裂点,为什么用二阶泰勒展开,xgb里面正则项怎么表示
- 23.xgb,gbdt区别,gbdt为什么用梯度,用梯度什么好处。
1、监督学习非监督学习啥区别,word2vec 属于啥类型
对比一 : 有标签 vs 无标签
有监督机器学习又被称为“有老师的学习”,所谓的老师就是标签。有监督的过程为先通过已知的训练样本(如已知输入和对应的输出)来训练,从而得到一个最优模型,再将这个模型应用在新的数据上,映射为输出结果。再经过这样的过程后,模型就有了预知能力。
而无监督机器学习被称为“没有老师的学习”,无监督相比于有监督,没有训练的过程,而是直接拿数据进行建模分析,意味着这些都是要通过机器学习自行学习探索。
对比二 : 分类 vs 聚类
有监督机器学习的核心是分类,无监督机器学习的核心是聚类(将数据集合分成由类似的对象组成的多个类)。有监督的工作是选择分类器和确定权值,无监督的工作是密度估计(寻找描述数据统计值),这意味着无监督算法只要知道如何计算相似度就可以开始工作。
对比三 : 同维 vs 降维
有监督的输入如果是n维,特征即被认定为n维,也即y=f(xi)或p(y|xi), i =n,通常不具有降维的能力。而无监督经常要参与深度学习,做特征提取,或者干脆采用层聚类或者项聚类,以减少数据特征的维度。
对比四 :分类同时定性 vs 先聚类后定性
有监督的输出结果,也就是分好类的结果会被直接贴上标签,是好还是坏。也即分类分好了,标签也同时贴好了。无监督的结果只是一群一群的聚类,如果要进一步识别这些小堆,因此,无监督属于先聚类后定性,有点类似于批处理。
对比五 :独立 vs 非独立
对于不同的场景,正负样本的分布可能会存在偏移(可能是大的偏移,也可能偏移比较小)。好比我们手动对数据做标注作为训练样本,并把样本画在特征空间中,发现线性非常好,然而在分类面,总有一些混淆的数据样本。对这种现象的一个解释是,不管训练样本(有监督),还是待分类的数据(无监督),并不是所有数据都是相互独立分布的。或者说,数据和数据的分布之间存在联系。作为训练样本,大的偏移很可能会给分类器带来很大的噪声,而对于无监督,情况就会好很多。可见,独立分布数据更适合有监督,非独立数据更适合无监督。
Word Embedding的训练方法大致可以分为两类:一类是无监督或弱监督的预训练;一类是端对端(end to end)的有监督训练。
无监督或弱监督的预训练以word2vec和auto-encoder为代表。这一类模型的特点是,不需要大量的人工标记样本就可以得到质量还不错的Embedding向量。不过因为缺少了任务导向,可能和我们要解决的问题还有一定的距离。因此,我们往往会在得到预训练的Embedding向量( embedding就是用一个低维的向量表示一个物体,可以是一个词,或是一个商品,或是一个电影等等。这个embedding向量的性质是能使距离相近的向量对应的物体有相近的含义,比如 Embedding(复仇者联盟)和Embedding(钢铁侠)之间的距离就会很接近,但 Embedding(复仇者联盟)和Embedding(乱世佳人)的距离就会远一些。)后,用少量人工标注的样本去fine-tune整个模型。
2、xgb,gbdt啥区别
总的来说,两者之间的区别和联系可以总结成以
下几个方面。
(1)GBDT是机器学习算法, XGBoost是该算法的工程实现。
(2)在使用CART作为基分类器时, XGBoost显式地加入了正则项
来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
(3)GBDT在模型训练时只使用了代价函数的一阶导数信息
XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
(4)传统的GBDT采用CART作为基分类器, XGBoost支持多
种类型的基分类器,比如线性分类器。
(5)传统的GBDT在每轮迭代时使用全部的数据, XGBoost则
采用了与随机森林相似的策略,支持对数据进行采样。
(6)传统的GBDT没有设计对缺失值进行处理, XGBoost能够自动学习出缺失值的处理策略。
4、xgb中l1正则怎么用的
树的复杂度定义为:
xgb中l1表示对叶节点个数的约束项的系数,而l2则是叶子节点权重的约束项系数。
5、python 中 list 底层怎么实现, list 有什么特点
- 确定数据类型的意义在于确定一个数据在内存中占据的空间大小以及如何解释一段内存的含义;
- 同类型数据在内存中连续存储时采用固定的偏移量来定位;
- 不同类型数据需要采用元素外置的方式,在顺序表里面只存储外置元素的指针;
- 顺序表需要保存【容量】以及【已占用】数据,这个“表头”可以放在顺序表中,也可以分离出来;
- 当顺序表的容量不够或者过多时,会自动扩容或者缩容。
Python中的列表是由对其它对象的引用组成的连续数组。指向这个数组的指针及其长度被保存在一个列表头结构中。这意味着,每次添加或删除一个元素时,由引用组成的数组需要该标大小(重新分配)。
list有以下几个特点:
- 元素有位置下标,以索引就可以直接取到元素 --> 连续的存储空间,以偏移量计算取得元素,不必遍历所有元素
- 元素无论如何改变,表对象不变,也就是其id不变 --> 分离式结构,表头和元素内容分开储存,这样在更改list时,表对象始终是同一个,只是其指向的地址不同
- 元素可以是任意类型 --> 既要要求是连续存储,又可以存储不同类型的数据,那么其用的就是元素外置的方式,存储的只是地址的引用
- 可以任意添加新元素 --> 要能不断地添加新元素,其使用了动态扩充的策略
6、list dict有什么区别
Dict是字典类型,里面是key和value的映射关系,无序。list是列表,是一个可变序列,有续,索引是下标。字典内部实现应该是一个hash表 所以查找效率很高
dict有以下几个特点:
1. 查找和插入的速度极快,不会随着key的增加而变慢;
2. 需要占用大量的内存,内存浪费多。
而list相反:
1. 查找和插入的时间随着元素的增加而增加;
2. 占用空间小,浪费内存很少。
字典是通过哈希表实现的。也就是说,字典是一个数组,而数组的索引是经过哈希函数处理后得到的。哈希函数的目的是使键均匀地分布在数组中。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。
7、手写对dict排序
对下面的Dict:
aps = {}
for key in T.keys():
ap = average_precision(T[key], P[key])
aps[key] = ap
如果用value从大到小排序:
aps = sorted(aps.items(), key=lambda d:d[1], reverse = True)
如果对key排序,用d[0];默认的是从小到大排序,如果是从大到小,需要用reverse = True.
注意返回的是一个List,不再是Dict.
8.集成学习介绍(boosting bagging stacking原理)
https://blog.csdn.net/Shingle_/article/details/81953564
9.stacking blending区别
stacking是k折交叉验证,元模型的训练数据等同于基于模型的训练数据,该方法为每个样本都生成了元特征,每生成元特征的模型不一样(k是多少,每个模型的数量就是多少);测试集生成元特征时,需要用到k(k fold不是模型)个加权平均;
blending是holdout方法,直接将训练集切割成两个部分,仅10%用于元模型的训练;
1.stacking过程读解
stacking的主要思想是训练模型来学习使用底层学习的预测结果,下图是一个5折stacking中基模型在所以数据集上生成预测结果的过程,次学习器会基于模型的预测结果在进行训练,单个基模型生成预测的过程是:
首先,将数据集生成测试集和训练集(假如训练集10000,测试2000),那么上层会进行5折交叉检验,使用训练集中的8000条作为喂养集,剩余2000条作为验证集(橙色)
每次验证,相当于使用了8000调数据训练出一个模型,使用模型对验证集进行验证得到的2000调数据,并对测试集进行预测,得到2500条数据,这样经过5次交叉验证,可以得到中间橙色的52000条验证集的结果(相当于每条数据的预测结果),52000条测试集的预测结果。
接下来会将验证集的5*2000条预测结果拼接成10000行长的矩阵,标记为A1,而对于5 *2500行的测试集的预测结果进行加权平均的到一个2500一列的矩阵,标记为B1.
上面得到一个基模型在数据集上的预测结果A1、B1,这样当我们对3个基模型进行集成的话,相当于得到了A1,A2,A3,B1,B2,B3六个矩阵
之后我们会将A1、A2、 A3并列在一起10000行3列的矩阵作为raining data,B1、B2、 B3合并在一起成2500行3列的矩阵作为testing data ,让下层学习器基于这样的数据进行再训练。
再训练是基于每个基础模型的预测结果作为特征(三个特征) , 次学习器会学习训练如果往这样的基学习的预测结果上赋予权重w,来使得最后的预测最为准确。
2.Stacking特点
使用stacking ,组1000多个模型,有时甚至要计算几十个小时。 但是,这些怪物般的集成方法同样有着它的用处:
(1)它可以帮你打败当前学术界性能最好的算法
(2)我们有可能将集成的知识迁移到到简单的分类器上
(3)自动化的大型集成策略可以通过添加正则项有效的对抗过拟合,而且并不需要太多的调参和特征选择。所以从原则上讲, stacking
(4)这是目前提升机器学习效果最好的方法,或者说是最效率的方法human ensemble learning。
3.Blending
Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集,例如10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。
4.Stacking和Blending对比
1.Blending方式和Stacking方式很类似,相比Stacking更简单点,两者区别是:
blending是直接准备好一部分10%留出集只在留出集 上继续预测,用不相交的数据训练不同的Base Model ,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。
**2.blending的优点是:**比stacking简单,不会造成数据穿越(所谓数据创越,就比如训练部分数据时候用了全局的统计特征,导致模型效果过分的好) , generaliers和Istackers使用不同的数据,可以随时添加其他模型到blender中。
3.缺点在于: blending只使用了一部分数据集作为留出集进行验证 ,而stacking使用多折交叉验证,比使用单-留出集更加稳健
4.两个方法都挺好,看偏好了, 可以一部分做Blending.-部分做Stacking。
补充一张Stacking训练阶段和测试阶段的图片,便于理解
10.分析为什么使用xgb(提示,从特征维度,样本维度等进行比较)
XGBoost不是绝对的精确,但它绝对够快:
1、 xgBoosting借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算;
2、xgBoosting的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合;
3、XGBoost可并行:提升树算法最消耗时间片的是对连续型特征排序(如你每天开车上班有多远?),稀疏数据结构和聪明的实现方式让XGBoost可为每个列独立排序,通过这种方法,排序工作在CPU的并行线程之间可以分离执行。
4、XGBoost支持近似分类:为了在连续型特征上找到最佳分类点,梯度提升树需要将所有数据放入内存进行排序,对小数据集来说不会存在什么问题,但当数据集大小超过内存时这个方法就行不通了,XGBoost可以对这些数据使用容器进行粗糙排序而不是完整排序,XGBoost论文作者表示,只要容器数量足够多,分类表现可以接近于精确分类。
11.过拟合的判断方法
模型欠拟合,即高偏差(high bias),是指模型未训练出数据集的特征,导致模型在训练集、测试集上的精度都很低。如图1左图所示。
模型过拟合,即高方差(high variance),是指模型训练出包含噪点在内的所有特征,导致模型在训练集的精度很高,但是应用到新数据集时,精度很低。如图1右图所示。
2、模型过拟合
12.过拟合如何解决
判断方法
过拟合(over-fitting),机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在验证数据集以及测试数据集中表现不佳。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。
过拟合问题,根本的原因则是特征维度(或参数)过多,导致拟合的函数完美的经过训练集,但是对新数据的预测结果则较差。
1)建模样本选取有误,如样本数量太少,选样方法错误,样本标签错误等,导致选取的样本数据不足以代表预定的分类规则;
2)样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则;
3)假设的模型无法合理存在,或者说是假设成立的条件实际并不成立;
4)参数太多,模型复杂度过高;
5)对于决策树模型,如果我们对于其生长没有合理的限制,其*生长有可能使节点只包含单纯的事件数据(event)或非事件数据(no event),使其虽然可以完美匹配(拟合)训练数据,但是无法适应其他数据集。
6)对于神经网络模型:
a)对样本数据可能存在分类决策面不唯一,随着学习的进行,,BP算法使权值可能收敛过于复杂的决策面;
b)权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征。
解决方法
1)在神经网络模型中,可使用权值衰减的方法,即每次迭代过程中以某个小因子降低每个权值。
2)选取合适的停止训练标准,使对机器的训练在合适的程度;
3)保留验证数据集,对训练成果进行验证;
4)获取额外数据进行交叉验证;
5)正则化,即在进行目标函数或代价函数优化时,在目标函数或代价函数。
解决过拟合问题,则有2个途径:
- 减少特征维度; 可以人工选择保留的特征,或者模型选择算法
- 正则化; 保留所有的特征,通过降低参数θ的值,来影响模型
13.造成过拟合的原因有可以归结为:参数过多或样本过少。那么我们需要做的事情就是减少参数,提供两种办法:
1、回想下我们的模型,假如我们采用梯度下降算法将模型中的损失函数不断减少,那么最终我们会在一定范围内求出最优解,最后损失函数不断趋近0。那么我们可以在所定义的损失函数后面加入一项永不为0的部分,那么最后经过不断优化损失函数还是会存在。其实这就是所谓的“正则化”。
一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀)。
下面这张图片就是加入了正则化(regulation)之后的损失函数。这里m是样本数目,表示的是正则化系数。
当过大时,则会导致后面部分权重比加大,那么最终损失函数过大,从而导致欠拟合。
当过小时,甚至为0,导致过拟合。
2、对于神经网络,参数膨胀原因可能是因为随着网路深度的增加,同时参数也不断增加,并且增加速度、规模都很大。那么可以采取减少神经网络规模(深度)的方法。也可以用一种叫dropout的方法。dropout的思想是当一组参数经过某一层神经元的时候,去掉这一层上的一部分神经元,让参数只经过一部分神经元进行计算。注意这里的去掉并不是真正意义上的去除,只是让参数不经过一部分神经元计算而已。
13.手写代码 两排序链表合并
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
# write code here
p1 = pHead1
p2 = pHead2
ret = ListNode(0)
p3 = ret
while (p1 and p2):
if p1.val < p2.val:
p3.next = ListNode(p1.val)
p1 = p1.next
else:
p3.next = ListNode(p2.val)
p2 = p2.next
p3 = p3.next
if p1:
p3.next = p1
if p2:
p3.next = p2
return ret.next
14.python 中 key-value的数据结构字典dict
字典这个概念就是基于现实生活中的字典原型,生活中的使用名称-内容对数据进行构建,Python中使用键(key)-值(value)存储,也就是C++中的map。dict的显著特征
- 字典中的数据必须以键值对的形式出现
- 键不可重复,值可重复
- 键若重复字典中只会记该键对应的最后一个值
- 字典中键(key)是不可变的,为不可变对象,不能进行修改;而值(value)是可以修改的,可以是任何对象。
- 在dict中是根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。
dict的增删查改
1. 可以采用“键值对”的方法和update()方法向字典中添加元素,删除可以使用关键字del以及pop()方法
2.查询采用如查询列表元素的索引方式,使用键作为索引查找值
若元素不存在会报错,在进行查找前,可以通过以下两种方法判断key是否存在:
① 成员资格运算符–in运算符
② get()方法(值不存在时返回NULL,也可指定返回的值)
>>> test={'Mon':1}
>>> 'Fri' in test
False>>> test.get('Fri')
>>> test.get('Fri',-1)
-1
3.对值得修改可以采用直接覆盖原值的方法
4.dict中的元素是无序的,不可以采用分片。
dict函数
可以使用dict,通过其他映射或者(键,值)对的序列建立字典。
>>> test=[('name','Sakura'),('age',20)]
>>> d = dict(test)
>>> d
{'name': 'Sakura', 'age': 20}
dict也可以使用关键字参数创建字典,也可用映射作为dict参数,dict若不带任何参数,将返回一个空字典
>>> d = dict(name='Sakura',age=20)
>>> d
{'name': 'Sakura', 'age': 20}
>>> a=dict()
>>> a
{}
15.dict底层如何实现
字典也被称为关联数组,还称为哈希数组等。也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值。哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。Python中并不包含这样高级的哈希函数,几个重要(用于处理字符串和整数)的哈希函数是常见的几个类型。
字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用。所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket。下面通过存储与获取数据的过程介绍字典的底层原理。
16.如何解决哈希冲突
一、拉链法
上篇博文我们举的例子,HashMap,HashSet其实都是采用的拉链法来解决哈希冲突的,就是在每个位桶实现的时候,我们采用链表(jdk1.8之后采用链表+红黑树)的数据结构来去存取发生哈希冲突的输入域的关键字(也就是被哈希函数映射到同一个位桶上的关键字)
二、开发地址法
开放地址法有个非常关键的特征,就是所有输入的元素全部存放在哈希表里,也就是说,位桶的实现是不需要任何的链表来实现的,换句话说,也就是这个哈希表的装载因子不会超过1。它的实现是在插入一个元素的时候,先通过哈希函数进行判断,若是发生哈希冲突,就以当前地址为基准,根据再寻址的方法(探查序列),去寻找下一个地址,若发生冲突再去寻找,直至找到一个为空的地址为止。所以这种方法又称为再散列法。
三、再散列法
再散列法其实很简单,就是再使用哈希函数去散列一个输入的时候,输出是同一个位置就再次散列,直至不发生冲突位置
缺点:每次冲突都要重新散列,计算时间增加。
17.非监督学习举例
18.解释k-means原理
K-Means是典型的聚类算法,K-Means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。
K-Means步骤
1. 创建k个点作为起始质心。
2. 计算每一个数据点到k个质心的距离。把这个点归到距离最近的哪个质心。
3. 根据每个质心所聚集的点,重新更新质心的位置。
4. 重复2,3,直到前后两次质心的位置的变化小于一个阈值。
K值的确定
K-Means算法一般都只有一个超参数,就是K。那我们拿到一个数据后,要吧数据分成几类呢?我们就来讨论下这个问题。
1. 首先一个具体的问题肯定有它的具体的业务场景,K值需要根据业务场景来定义。
2. 如果业务场景无法确定K值,我们也有技术手段来找一个合适的K。这个方法就是手肘法。
手肘法
K-Means算法中每一步都可以计算出loss值又称为SSE。loss值的计算方式就是每个聚类的点到它们质心的距离的平方。
指定一个Max值,即可能的最大类簇数。然后将类簇数K从1开始递增,一直到Max,计算出Max个SSE。根据数据的潜在模式,当设定的类簇数不断逼近真实类簇数时,SSE呈现快速下降态势,而当设定类簇数超过真实类簇数时,SSE也会继续下降,当下降会迅速趋于缓慢。通过画出K-SSE曲线,找出下降途中的拐点,即可较好的确定K值。
K-Means与KNN
K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。
当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。
19.距离的计算方法
1、欧氏距离
两个点的所有维度的坐标差的平方和最后开根号;
2、曼哈顿距离
两个点的坐标差的绝对值求和;
两个点在标准坐标系上的绝对轴距总和;
dis=abs(x1-x2)+(y1-y2)
3、切比雪夫
各个坐标距离(绝对值)的最大值;
坐标差的绝对值的最大值;
dis=max(abs(x1-x2),abs(y1-y2))
20.监督学习模型如何选取
监督学习主要包括分类和回归
当输出被限制为有限的一组值(离散数值)时使用分类算法
当输出可以具有范围内的任何数值(连续数值)时使用回归算法
相似度学习是和回归和分类都密切相关的一类监督学习,它的目的是使用相似函数从样本中学习,这个函数可以度量两个对象之间的相似度或关联度
模型选择:
1、过拟合和欠拟合
过拟合:特征集过大,把噪声数据的特征也学习到了,不能很好地识别数据,不能正确的分类
欠拟合:特征集过小,导致模型不能很好地拟合数据【对数据的特征学习得不够】
2、正则化和交叉验证
a、正则化(防止过拟合):将结构风险最小化(Structural rick Minimization SRM )的过程。
在经验风险上加上表示模型复杂度的正则化项(regularizer),或者叫惩罚项。
正则化项:一般是模型复杂度的单调递增函数,即模型越复杂,正则化值越大。
b、交叉验证:数据集不足时,可以重复地利用数据。
简单交叉验证
S折交叉验证
留一交叉验证
21. 详细分析xgb原理,怎么选分裂点,为什么用二阶泰勒展开,xgb里面正则项怎么表示
选分裂点XGBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点
为什么用二阶泰勒展开
泰勒展开的本质是拟合一个函数,二阶泰勒展开可以近似大量的损失函数,比如回归的平方损失函数,分类的对数似然损失函数。通过二阶泰勒展开推导出来的最终式子(叶子结点的得分和分裂标准),具有通用性,也就是说,任何一个损失函数,只要它能够二阶求导,就能够使用这套分裂标准和叶子的score来构造xgboost模型,也就是自定义损失函数。
xgboost官网上说,用泰勒级数展开是因为损失函数的梯度并不总是容易求得。方便实现应该是最直接的原因。
一个附加的好处是可能收敛更快。以logloss为例, 其二阶导为h(x)(1-h(x) ,显然在中值0.5附近变化最为剧烈。按照结构得分公式G^2/(H+λ),一阶导接近的情况下,拟合更偏向二阶导变化剧烈的特征,从而加快收敛。有点类似于梯度下降法和牛顿法。
xgb里面正则项怎么表示
目标函数由两部分构成,第一部分用来衡量预测分数和真实分数的差距,另一部分则是正则化项。正则化项同样包含两部分,T表示叶子结点的个数,w表示叶子节点的分数。γ可以控制叶子结点的个数,λ可以控制叶子节点的分数不会过大,防止过拟合。
22.L1,L2正则区别(我用概率跟最优化理论分析完,总监大佬又让我从梯度下降解释为什么L1稀疏),L1正则如何求梯度
1.假设原先损失函数是C0,那么在L2和L1正则条件下对参数求导分别是:
可以想象到用梯度下降的方法,当W小于1的时候,L2正则项的惩罚效果越来越小,而L1正则项的惩罚效果依然很大,L可以惩罚到0 ,而L2很难。
23.xgb,gbdt区别,gbdt为什么用梯度,用梯度什么好处。
提升树利用加法模型和前向分步算法实现学习的优化过程。当损失函数时平方损失和指数损失函数时,每一步的优化很简单,如平方损失函数学习残差回归树。但对于一般的损失函数,往往每一步优化没那么容易,如上图中的绝对值损失函数和Huber损失函数。针对这一问题,Freidman提出了梯度提升算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。
推荐阅读
-
【答】阿里机器学习面经
-
成都-阿里Java研发工程师面经
-
应届生拿下京东小米Java岗offer,学习笔记都在这里了(年薪28w的面经)
-
阿里巴巴大数据产品最新特性介绍--机器学习PAI 阿里巴巴算法框架金融
-
一次阿里 P7 的面经,分享给大家
-
八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享
-
最新阿里蚂蚁金服四面(已拿offer)Java技术面经总结
-
啃完这些Spring知识点,我竟吊打了阿里面试官(附面经+笔记)
-
3年Java开发经验从阿里、美团、滴滴面试回来,想和Java程序员谈一谈感悟及面经
-
天猫精灵业务如何使用机器学习PAI进行模型推理优化 阿里巴巴算法google框架