首页
隐私条例
友情链接
推荐
数据科学社区
pandas教程
github社区
logo设计
favicon社区
Search
1
AI科学空间
979 阅读
2
xgboost笔记
400 阅读
3
机器学习入门笔记
209 阅读
4
科研项目流程
156 阅读
5
pandas学习笔记
128 阅读
AI探索
AI学习
AI知识
论文研读
学术史
兴趣感悟
地理信息系统
地理学
遥感
数据科学
数据挖掘
大数据
计算机视觉
机器学习
数学
自然语言处理
编程语言
python
java
C++
scala
shell
SQL
Search
标签搜索
人工智能
概念
史诗
xgboost
数据科学
科研
论文
机器学习
梦想
正则表达式
numpy
Pandas
语言模型
BP网络
AI学习空间
累计撰写
13
篇文章
累计收到
9
条评论
首页
栏目
AI探索
AI学习
AI知识
论文研读
学术史
兴趣感悟
地理信息系统
地理学
遥感
数据科学
数据挖掘
大数据
计算机视觉
机器学习
数学
自然语言处理
编程语言
python
java
C++
scala
shell
SQL
页面
隐私条例
友情链接
推荐
数据科学社区
pandas教程
github社区
logo设计
favicon社区
搜索到
5
篇与
AI探索
的结果
2021-11-26
反向传播
背景梯度下降给到 $\theta$ (weight and bias)先选择一个初始的 $\theta^0$,计算 $\theta^0$ 的损失函数(Loss Function)设一个参数的偏微分计算完这个向量(vector)偏微分,然后就可以去更新的你 $\theta$百万级别的参数(millions of parameters)反向传播(Backpropagation)是一个比较有效率的算法,让你计算梯度(Gradient) 的向量(Vector)时,可以有效率的计算出来链式法则连锁影响(可以看出x会影响y,y会影响z)BP主要用到了chain rule反向传播损失函数(Loss function)是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的,用L表示。代价函数(Cost function)是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。总体损失函数(Total loss function)是定义在整个训练集上面的,也就是所有样本的误差的总和。也就是平时我们反向传播需要最小化的值。 对于$L(\theta)$就是所有$l^n$的损失之和,所以如果要算每个$L(\theta)$的偏微分,我们只要算每个$l^n$的偏微分,再把所有$l^n$偏微分的结果加起来就是$L(\theta)$的偏微分,所以等下我们只计算每个$l^n$的偏微分。我们先在整个神经网络(Neural network)中抽取出一小部分的神经(Neuron)去看(也就是红色标注的地方):[!取出一个Neuron进行分析 从这一小部分中去看,把计算梯度分成两个部分从这一小部分中去看,把计算梯度分成两个部分计算$\frac{\partial z}{\partial w}$(Forward pass的部分)计算$\frac{\partial l}{\partial z}$ ( Backward pass的Forward Pass那么,首先计算$\frac{\partial z}{\partial w}$(Forward pass的部分):根据求微分原理,forward pass的运算规律就是:$\frac{\partial z}{\partial w_1} = x_1 \\ \frac{\partial z}{\partial w_2} = x_2$这里计算得到的$x_1$和$x_2$恰好就是输入的$x_1$和$Backward Pass(Backward pass的部分)这就很困难复杂因为我们的l是最后一层:那怎么计算 $\frac{\partial l}{\partial z}$ (Backward pass的部分)这就很困难复杂因为我们的$l$是最后一层:计算所有激活函数的偏微分,激活函数有很多,这里使用Sigmoid函数为例这里使用链式法则(Chain Rule)的case1,计算过程如下:$\frac{\partial l}{\partial z} = \frac{\partial a}{\partial z}\frac{\partial l}{\partial a} \Rightarrow {\sigma}'(z)$$\frac{\partial l}{\partial a} = \frac{\partial z'}{\partial a}\frac{\partial l}{\partial z'} +\frac{\partial z''}{\partial a}\frac{\partial l}{\partial z''}$最终的式子结果:但是你可以想象从另外一个角度看这个事情,现在有另外一个神经元,把forward的过程逆向过来,其中${\sigma}'(z)$是常数,因为它在向前传播的时候就已经确定了case 1 : Output layer假设$\frac{\partial l}{\partial z'}$和$\frac{\partial l}{\partial z''}$是最后一层的隐藏层也就是就是y1与y2是输出值,那么直接计算就能得出结果但是如果不是最后一层,计算$\frac{\partial l}{\partial z'}$和$\frac{\partial l}{\partial z''}$的话就需要继续往后一直通过链式法则算下去case 2 : Not Output Layer 对于这个问题,对于这个问题,我们要继续计算后面绿色的$\frac{\partial l}{\partial z_a}$和$\frac{\partial l}{\partial z_b}$,然后通过继续乘$w_5$和$w_6$得到$\frac{\partial l}{\partial z'}$,但是要是$\frac{\partial l}{\partial z_a}$和$\frac{\partial l}{\partial z_b}$都不知道,那么我们就继续往后面层计算,一直到碰到输出值,得到输出值之后再反向往输入那个方向走。对上图,我们可以从最后一个$\frac{\partial l}{\partial z_5}$和$\frac{\partial l}{\partial z_6}$看,因为$\frac{\partial l}{\partial z_a}$和$\frac{\partial l}{\partial z_b}$比较容易通过output求出来,然后继续往前求$\frac{\partial l}{\partial z_3}$和$\frac{\partial l}{\partial z_4}$,再继续求$\frac{\partial l}{\partial z_1}$和$\frac{\partial l}{\partial z_2}$最后我们就得到下图的结果[实际上进行backward pass时候和向前传播的计算量差不多。总结我们的目标是要求计算$\frac{\partial z}{\partial w}$(Forward pass的部分)和计算$\frac{\partial l}{\partial z}$ ( Backward pass的部分 ),然后把$\frac{\partial z}{\partial w}$和$\frac{\partial l}{\partial z}$相乘,我们就可以得到$\frac{\partial l}{\partial w}$,所有我们就可以得到神经网络中所有的参数,然后用梯度下降就可以不断更新,得到损失最小的函数
2021年11月26日
55 阅读
0 评论
3 点赞
2021-04-06
机器学习入门笔记
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能核心,是使计算机具有智能的根本途径。 定义 机器学习是一门多学科交叉专业,涵盖概率论知识,统计学知识,近似理论知识和复杂算法知识,使用计算机作为工具并致力于真实实时的模拟人类学习方式,并将现有内容进行知识结构划分来有效提高学习效率。 111 机器学习有下面几种定义: (1)机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能。 (2)机器学习是对能通过经验自动改进的计算机算法的研究。 (3)机器学习是用数据或以往的经验,以此优化计算机程序的性能标准。 机器学习的分类 几十年来,研究发表的机器学习的方法种类很多,根据强调侧面的不同可以有多种分类方法。 基于学习策略的分类 (1)模拟人脑的机器学习符号学习:模拟人脑的宏现心理级学习过程,以认知心理学原理为基础,以符号数据为输入,以符号运算为方法,用推理过程在图或状态空间中搜索,学习的目标为概念或规则等。符号学习的典型方法有记忆学习、示例学习、演绎学习.类比学习、解释学习等。神经网络学习(或连接学习):模拟人脑的微观生理级学习过程,以脑和神经科学原理为基础,以人工神经网络为函数结构模型,以数值数据为输人,以数值运算为方法,用迭代过程在系数向量空间中搜索,学习的目标为函数。典型的连接学习有权值修正学习、拓扑结构学习。(2)直接采用数学方法的机器学习主要有统计机器学习。 统计机器学习是基于对数据的初步认识以及学习目的的分析,选择合适的数学模型,拟定超参数,并输入样本数据,依据一定的策略,运用合适的学习算法对模型进行训练,最后运用训练好的模型对数据进行分析预测。统计机器学习三个要素:模型(model):模型在未进行训练前,其可能的参数是多个甚至无穷的,故可能的模型也是多个甚至无穷的,这些模型构成的集合就是假设空间。策略(strategy):即从假设空间中挑选出参数最优的模型的准则。模型的分类或预测结果与实际情况的误差(损失函数)越小,模型就越好。那么策略就是误差最小。算法(algorithm):即从假设空间中挑选模型的方法(等同于求解最佳的模型参数)。机器学习的参数求解通常都会转化为最优化问题,故学习算法通常是最优化算法,例如最速梯度下降法、牛顿法以及拟牛顿法等。 基于学习方法的分类(1)归纳学习符号归纳学习:典型的符号归纳学习有示例学习、决策树学习。函数归纳学习(发现学习):典型的函数归纳学习有神经网络学习、示例学习、发现学习、统计学习。(2)演绎学习(3)类比学习:典型的类比学习有案例(范例)学习。(4)分析学习:典型的分析学习有解释学习、宏操作学习。 基于学习方式的分类 (1)监督学习(有导师学习):输入数据中有导师信号,以概率函数、代数函数或人工神经网络为基函数模型,采用迭代计算方法,学习结果为函数。 (2)无监督学习(无导师学习):输入数据中无导师信号,采用聚类方法,学习结果为类别。典型的无导师学习有发现学习、聚类、竞争学习等。 (3)强化学习(增强学习):以环境反惯(奖/惩信号)作为输入,以统计和动态规划技术为指导的一种学习方法。 基于数据形式的分类 (1)结构化学习:以结构化数据为输人,以数值计算或符号推演为方法。典型的结构化学习有神经网络学习、统计学习、决策树学习、规则学习。 (2)非结构化学习:以非结构化数据为输人,典型的非结构化学习有类比学习案例学习、解释学习、文本挖掘、图像挖掘、Web挖掘等。 基于学习目标的分类 (1)概念学习:学习的目标和结果为概念,或者说是为了获得概念的学习。典型的概念学习主要有示例学习。(2)规则学习:学习的目标和结果为规则,或者为了获得规则的学习。典型规则学习主要有决策树学习。(3)函数学习:学习的目标和结果为函数,或者说是为了获得函数的学习。典型函数学习主要有神经网络学习。 (4)类别学习:学习的目标和结果为对象类,或者说是为了获得类别的学习。典型类别学习主要有聚类分析。(5)贝叶斯网络学习:学习的目标和结果是贝叶斯网络,或者说是为了获得贝叶斯网络的一种学习。其又可分为结构学习和多数学习。 常见算法 决策树算法 决策树及其变种是一类将输入空间分成不同的区域,每个区域有独立参数的算法。决策树算法充分利用了树形模型,根节点到一个叶子节点是一条分类的路径规则,每个叶子节点象征一个判断类别。先将样本分成不同的子集,再进行分割递推,直至每个子集得到同类型的样本,从根节点开始测试,到子树再到叶子节点,即可得出预测类别。此方法的特点是结构简单、处理数据效率较高。 朴素贝叶斯算法 朴素贝叶斯算法是一种分类算法。它不是单一算法,而是一系列算法,它们都有一个共同的原则,即被分类的每个特征都与任何其他特征的值无关。朴素贝叶斯分类器认为这些“特征”中的每一个都独立地贡献概率,而不管特征之间的任何相关性。然而,特征并不总是独立的,这通常被视为朴素贝叶斯算法的缺点。简而言之,朴素贝叶斯算法允许我们使用概率给出一组特征来预测一个类。与其他常见的分类方法相比,朴素贝叶斯算法需要的训练很少。在进行预测之前必须完成的唯一工作是找到特征的个体概率分布的参数,这通常可以快速且确定地完成。这意味着即使对于高维数据点或大量数据点,朴素贝叶斯分类器也可以表现良好。 支持向量机算法 基本思想可概括如下:首先,要利用一种变换将空间高维化,当然这种变换是非线性的,然后,在新的复杂空间取最优线性分类表面[8]。由此种方式获得的分类函数在形式上类似于神经网络算法。支持向量机是统计学习领域中一个代表性算法,但它与传统方式的思维方法很不同,输入空间、提高维度从而将问题简短化,使问题归结为线性可分的经典解问题。支持向量机应用于垃圾邮件识别,人脸识别等多种分类问题。 随机森林算法 控制数据树生成的方式有多种,根据前人的经验,大多数时候更倾向选择分裂属性和剪枝,但这并不能解决所有问题,偶尔会遇到噪声或分裂属性过多的问题。基于这种情况,总结每次的结果可以得到袋外数据的估计误差,将它和测试样本的估计误差相结合可以评估组合树学习器的拟合及预测精度。此方法的优点有很多,可以产生高精度的分类器,并能够处理大量的变数,也可以平衡分类资料集之间的误差。 人工神经网络算法 人工神经网络与神经元组成的异常复杂的网络此大体相似,是个体单元互相连接而成,每个单元有数值量的输入和输出,形式可以为实数或线性组合函数。它先要以一种学习准则去学习,然后才能进行工作。当网络判断错误时,通过学习使其减少犯同样错误的可能性。此方法有很强的泛化能力和非线性映射能力,可以对信息量少的系统进行模型处理。从功能模拟角度看具有并行性,且传递信息速度极快。 Boosting与Bagging算法 Boosting是种通用的增强基础算法性能的回归分析算法。不需构造一个高精度的回归分析,只需一个粗糙的基础算法即可,再反复调整基础算法就可以得到较好的组合回归模型。它可以将弱学习算法提高为强学习算法,可以应用到其它基础回归算法,如线性回归、神经网络等,来提高精度。Bagging和前一种算法大体相似但又略有差别,主要想法是给出已知的弱学习算法和训练集,它需要经过多轮的计算,才可以得到预测函数列,最后采用投票方式对示例进行判别。 关联规则算法 关联规则是用规则去描述两个变量或多个变量之间的关系,是客观反映数据本身性质的方法。它是机器学习的一大类任务,可分为两个阶段,先从资料集中找到高频项目组,再去研究它们的关联规则。其得到的分析结果即是对变量间规律的总结。 [3] EM(期望最大化)算法 在进行机器学习的过程中需要用到极大似然估计等参数估计方法,在有潜在变量的情况下,通常选择EM算法,不是直接对函数对象进行极大估计,而是添加一些数据进行简化计算,再进行极大化模拟。它是对本身受限制或比较难直接处理的数据的极大似然估计算法。 深度学习 深度学习(DL,Deep Learning)是机器学习(ML,Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI,Artificial Intelligence)。深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术。深度学习在搜索技术、数据挖掘、机器学习、机器翻译、自然语言处理、多媒体学习、语音、推荐和个性化技术,以及其他相关领域都取得了很多成果。深度学习使机器模仿视听和思考等人类的活动,解决了很多复杂的模式识别难题,使得人工智能相关技术取得了很大进步。 应用 机器学习应用广泛,无论是在军事领域还是民用领域,都有机器学习算法施展的机会,主要包括以下几个方面。 数据分析与挖掘 “数据挖掘”和"数据分析”通常被相提并论,并在许多场合被认为是可以相互替代的术语。关于数据挖掘,已有多种文字不同但含义接近的定义,例如“识别出巨量数据中有效的.新颖的、潜在有用的最终可理解的模式的非平凡过程”,无论是数据分析还是数据挖掘,都是帮助人们收集、分析数据,使之成为信息,并做出判断,因此可以将这两项合称为数据分析与挖掘。 数据分析与挖掘技术是机器学习算法和数据存取技术的结合,利用机器学习提供的统计分析、知识发现等手段分析海量数据,同时利用数据存取机制实现数据的高效读写。机器学习在数据分析与挖掘领域中拥有无可取代的地位,2012年Hadoop进军机器学习领域就是一个很好的例子。 模式识别 模式识别起源于工程领域,而机器学习起源于计算机科学,这两个不同学科的结合带来了模式识别领域的调整和发展。模式识别研究主要集中在两个方面。 (1)研究生物体(包括人)是如何感知对象的,属于认识科学的范畴。 (2)在给定的任务下,如何用计算机实现模式识别的理论和方法,这些是机器学习的长项,也是机器学习研究的内容之一。 模式识别的应用领域广泛,包括计算机视觉、医学图像分析、光学文字识别、自然语言处理、语音识别、手写识别、生物特征识别、文件分类、搜索引擎等,而这些领域也正是机器学习大展身手的舞台,因此模式识别与机器学习的关系越来越密切。
2021年04月06日
209 阅读
1 评论
0 点赞
2021-04-04
数据科学帮助手册
1.pypi 镜像使用帮助pypi 镜像每 5 分钟同步一次。临时使用pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package注意,simple 不能少, 是 https 而不是 http设为默认升级 pip 到最新的版本 (>=10.0.0) 后进行配置:pip install pip -Upip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple如果您到 pip 默认源的网络连接较差,临时使用本镜像站来升级 pip:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U2.误删pip后easy_install pip3.
2021年04月04日
116 阅读
0 评论
0 点赞
2021-04-02
pandas学习笔记
1.pandas从列中的字符串删除不需要的部分data"result""result""result" = data"result""result""result".maplambdax:x.lstrip("+−"lambda x: x.lstrip("+-"lambdax:x.lstrip("+−".rstrip"aAbBcC""aAbBcC""aAbBcC") data"result""result""result".replace(regex=True,inplace=True,to_replace=r"\D";,value=r"")
2021年04月02日
128 阅读
0 评论
1 点赞
2021-04-02
xgboost笔记
1.xgboost对特征缺失敏感吗,对缺失值做了什么操作,存在什么问题?不敏感,可以自动处理,处理方式是将missing值分别加入左节点 右节点取分裂增益最大的节点将missing样本分裂进这个节点 。这种处理方式的问题在xgboost仅仅在特征的非缺失的值上进行分裂然后missing值直接放入其中一个节点,显然当缺失值很多的情况下,比如缺失80%,那么xgb分裂的时候仅仅在20%的特征值上分裂,这是非常容易过拟合的。2.Lightgbm相对于xgboost的优缺点?优点:直方图算法—更高(效率)更快(速度)更低(内存占用)更泛化(分箱与之后的不精确分割也起到了一定防止过拟合的作用); 缺点:直方图较为粗糙,会损失一定精度,但是在gbm的框架下,基学习器的精度损失可以通过引入更多的tree来弥补。3.XGB和lightGBM在节点分裂时候的区别是什么?xgb是level-wise,lgb是leaf-wise,level-wise指在树分裂的过程中,同一层的非叶子节点,只要继续分裂能够产生正的增益就继续分裂下去,而leaf-wise更苛刻一点,同一层的非叶子节点,仅仅选择分裂增益最大的叶子节点进行分裂。4.XGBoost和GBDT的区别有哪些?4.1、算法层面: (1)损失函数的二阶泰勒展开; (2)树的正则化概念的引入,对叶节点数量和叶子节点输出进行了约束,方式是将二者形成的约束项加入损失函数中; (3)二阶泰勒展开与树正则化推出了新的叶子节点输出的计算公式而不是原始gbdt那样的简单平均; (4) a、对于基础学习器的改进,XGBoost和GBDT的区别有哪些【面试题详解】插图分裂的时候自动根据是否产生正增益指导是否进行分裂,因为引入了正则项的概念,分裂的时候这个预剪枝更加严苛; b、对于缺失值的处理,xgboost根据左右子节点的增益大小将缺失值分到增益大的节点中,而sklearn中的gbdt是无法处理缺失值的,因为sklearn中的gbdt是以sklearn中的cart为基学习器的,而sklearn中的cart也并没有实现对缺失值的处理功能。 (5)学习率,Shrinkage,对每一颗树都乘以小于1的学习率,来削弱每一颗树的影响,这样的结果就是会引入更多的树来处理使得基学习器得数量变多,从而降低过拟合,不过其实sklearn中的gbdt也实现了。。。不知道为什么这么多人把这一点也列为不同; (6)引入了随机森林使用的列采样功能,便于降低过拟合; (7)引入了许多近似直方图之类的优化算法来进一步提高树的训练速度与抗过拟合的能力,这个比较复杂,因为实现了很多种算法,后面单独写一篇来总结;4.2、工程层面 (1)对每个特征进行分块(block)并排序(pre_sort),将排序后的结构保存在内存中,这样后续分裂的时候就不需要重复对特征进行排序然后计算最佳分裂点了,并且能够进行并行化计算.这个结构加速了split finding的过程,只需要在建树前排序一次,后面节点分裂时直接根据索引得到梯度信息。5.XGB特征重要性程度是怎么判断的?官网上给出的方案,total_gain就是特征带来的总的分裂增益,也就是我们常规意义上的分裂总增益,weight,被用来作为分裂节点的次数,也就是我们常规意义上的分裂总次数,gain=total_gain/weight,计算的是每一次分裂带来的平均增益,total_cover表示特征分裂的样本数,举个例子,假设初始样本有10000个,第一次分裂的时候使用了特征A,也就是特征A在这10000个样本上分裂,则此时的cover值为10000,假设根据特征A分裂出左枝的样本有1000个,右边有9000个,而在左枝特征B是最优特征根据这1000个样本进行分裂,则B当前的cover是1000,依次类推最后求和。而cover显然就是total_cover/weight,也就是平均每次分裂所“负责”的样本数。6.xgb的预排序算法是怎么做的呢?将原始特征进行排序之后以块的形式保存到内存中,在块里面保存排序后的特征值及对应样本的引用,以便于获取样本的一阶、二阶导数值,但意味着除了保存原始特征之外还要保存原始特征的排序结果,耗内存。7.RF和xgboost哪个对异常点更敏感?xgb明显敏感的多,当然对rf也是有一定影响的,rf的每棵数的生成是独立的,异常点数量不多的情况下异常点常常和正常样本中的某些样本合并在一个分支里。但是xgb不一样,异常样本的t-1轮的预测值和真实标签计算出来的负梯度会一直很大。 假设当到达某一轮的时候,所有正常样本的计算得到的负梯度都很小而异常样本的负梯度很大例如【0.0000001,0.0000001,0.0000001,0.0000001,0.0000001,10】,这个时候新树会可能会继续进行不正常的分裂为0.0000001,0.0000001,0.0000001,0.0000001,0.00000010.0000001,0.0000001,0.0000001,0.0000001,0.00000010.0000001,0.0000001,0.0000001,0.0000001,0.0000001,101010,而这样的分裂是不合理的,因为异常值本身可能是因为某些人为失误导致的数据记录错误,或者异常样本完全是属于另外一种分布,此时强制要进行模型训练会导致模型的结果有偏从而发生过拟合。当然异常样本数量很少比如10个以内的时候而正常样本有100000000个其实基本没什么影响,但是如果占比较高的话是会产生影响的。8.xgb何时停止分裂?人工设定的参数,max_depth,min_data_in_leaf等等,这类通过超参数形式限制树的复杂度的方法都会引发xgb的分裂的停止,也就是常说的预剪枝;人工不限制,自由生长的情况下,当分裂增益小于0则基学习器停止分裂.9.XGB和lightGBM在节点分裂时候的区别是什么?xgb是level-wise,lgb是leaf-wise,level-wise指在树分裂的过程中,同一层的非叶子节点,只要继续分裂能够产生正的增益就继续分裂下去,而leaf-wise更苛刻一点,同一层的非叶子节点,仅仅选择分裂增益最大的叶子节点进行分裂。10.xgb和lgb在特征、数据并行上存在什么差异?1)特征并行 lgbm特征并行的前提是每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。xgb的特征并行与lgbm的最大不同在于xgb每个worker节点中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。二者的区别就导致了lgbm中worker间通信成本明显降低,只需通信一个特征分裂点即可,而xgb中要广播样本索引。2)数据并行 当数据量很大,特征相对较少时,可采用数据并行策略。lgbm中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个直方图算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。xgb中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率贼慢,每个worker间的通信量也就变得很大。3)投票并行(lgbm) 当数据量和维度都很大时,选用投票并行,该方法是数据并行的一个改进。数据并行中的合并直方图的代价相对较大,尤其是当特征维度很大时。大致思想是:每个worker首先会找到本地的一些优秀的特征,然后进行全局投票,根据投票结果,选择top的特征进行直方图的合并,再寻求全局的最优分割点。这个方法我没有找到很好的解释,因此,面试过程中答出前面两种我觉得就ok了吧。11.为什么xgboost不用后剪枝?后剪枝计算代价太高了,合并一次叶节点就要计算一次测试集的表现,数据量大的情况下非常消耗时间,而且也并不是特别必要,因为这样很容易过拟合测试集。12.xgboost如何处理缺失值?通常情况下,我们人为在处理缺失值的时候大多会选用中位数、均值或是二者的融合来对数值型特征进行填补,使用出现次数最多的类别来填补缺失的类别特征。很多的机器学习算法都无法提供缺失值的自动处理,都需要人为地去处理,但是xgboost模型却能够处理缺失值,也就是说模型允许缺失值存在。 原是论文中关于缺失值的处理将其看与稀疏矩阵的处理看作一样。在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。13.XGBoost与GBDT有什么不同?基分类器:XGBoost的基分类器不仅支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的Logistic回归(分类问题)或者线性回归(回归问题)。导数信息:XGBoost对损失函数做了二阶泰勒展开,GBDT只用了一阶导数信息,并且XGBoost还支持自定义损失函数,只要损失函数一阶、二阶可导。正则项:XGBoost的目标函数加了正则项, 相当于预剪枝,使得学习出来的模型更加不容易过拟合。列抽样:XGBoost支持列采样,与随机森林类似,用于防止过拟合。 缺失值处理:对树中的每个非叶子结点,XGBoost可以自动学习出它的默认分裂方向。如果某个样本该特征值缺失,会将其划入默认分支。并行化:注意不是tree维度的并行,而是特征维度的并行。XGBoost预先将每个特征按特征值排好序,存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。14.XGBoost为什么使用泰勒二阶展开?精准性:相对于GBDT的一阶泰勒展开,XGBoost采用二阶泰勒展开,可以更为精准的逼近真实的损失函数。 可扩展性:损失函数支持自定义,只需要新的损失函数二阶可导。15.XGBoost为什么可以并行训练?XGBoost的并行,并不是说每棵树可以并行训练,XGB本质上仍然采用boosting思想,每棵树训练前需要等前面的树训练完成才能开始训练。 XGBoost的并行,指的是特征维度的并行:在训练之前,每个特征按特征值对样本进行预排序,并存储为Block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。16.XGBoost为什么快?分块并行:训练前每个特征按特征值进行排序并存储为Block结构,后面查找特征分割点时重复使用,并且支持并行查找每个特征的分割点候选分位点:每个特征采用常数个分位点作为候选分割点 CPU cache命中优化: 使用缓存预取的方法,对每个线程分配一个连续的buffer,读取每个block中样本的梯度信息并存入连续的Buffer中。Block 处理优化:Block预先放入内存;Block按列进行解压缩;将Block划分到不同硬盘来提高吞吐17.XGBoost防止过拟合的方法 XGBoost在设计时,为了防止过拟合做了很多优化,具体如下: 目标函数添加正则项:叶子节点个数+叶子节点权重的L2正则化. 列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可). 子采样:每轮计算可以不使用全部样本,使算法更加保守. shrinkage: 可以叫学习率或步长,为了给后面的训练留出更多的学习空间. 18.为什么XGBoost相比某些模型对缺失值不敏感?对存在缺失值的特征,一般的解决方法是:离散型变量:用出现次数最多的特征值填充; 连续型变量:用中位数或均值填充;一些模型如SVM和KNN,其模型原理中涉及到了对样本距离的度量,如果缺失值处理不当,最终会导致模型预测效果差。 而树模型对缺失值的敏感度低,大部分时候可以在数据缺失时时使用。原因就是,一棵树中每个结点在分裂时,寻找的是某个特征的最佳分裂点(特征值),完全可以不考虑存在特征值缺失的样本,也就是说,如果某些样本缺失的特征值缺失,对寻找最佳分割点的影响不是很大。 XGBoost对缺失数据有特定的处理方法,详情参考上篇文章第7题。 因此,对于有缺失值的数据在经过缺失处理后: 当数据量很小时,优先用朴素贝叶斯 数据量适中或者较大,用树模型,优先XGBoost 数据量较大,也可以用神经网络 避免使用距离度量相关的模型,如KNN和SVM 19.XGBooost参数调优的一般步骤 首先需要初始化一些基本变量,例如: max_depth = 5 min_child_weight = 1 gamma = 0 subsample, colsample_bytree = 0.8 scale_pos_weight = 1 确定learning rate和estimator的数量 learning rate可以先用0.1,用cv来寻找最优的estimatorsmax_depth和 min_child_weight 我们调整这两个参数是因为,这两个参数对输出结果的影响很大。我们首先将这两个参数设置为较大的数,然后通过迭代的方式不断修正,缩小范围。 max_depth,每棵子树的最大深度,check from range3,10,23,10,23,10,2。 min_child_weight,子节点的权重阈值,check from range1,6,21,6,21,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.120.XGBoost如何选择最佳分裂点?XGBoost在训练前预先将特征按照特征值进行了排序,并存储为block结构,以后在结点分裂时可以重复使用该结构。 因此,可以采用特征并行的方法利用多个线程分别计算每个特征的最佳分割点,根据每次分裂后产生的增益,最终选择增益最大的那个特征的特征值作为最佳分裂点。 如果在计算每个特征的最佳分割点时,对每个样本都进行遍历,计算复杂度会很大,这种全局扫描的方法并不适用大数据的场景。XGBoost还提供了一种直方图近似算法,对特征排序后仅选择常数个候选分裂位置作为候选分裂点,极大提升了结点分裂时的计算效率。21.XGBoost的Scalable性如何体现?基分类器的scalability:弱分类器可以支持CART决策树,也可以支持LR和Linear。目标函数的scalability:支持自定义loss function,只需要其一阶、二阶可导。有这个特性是因为泰勒二阶展开,得到通用的目标函数形式。 学习方法的scalability:Block结构支持并行化,支持 Out-of-core计算。 22.比较LR和GBDT,说说什么情景下GBDT不如LR?先说说LR和GBDT的区别: LR是线性模型,可解释性强,很容易并行化,但学习能力有限,需要大量的人工特征工程 GBDT是非线性模型,具有天然的特征组合优势,特征表达能力强,但是树与树之间无法并行训练,而且树模型很容易过拟合;当在高维稀疏特征的场景下,LR的效果一般会比GBDT好。原因如下: 先看一个例子: 假设一个二分类问题,label为0和1,特征有100维,如果有1w个样本,但其中只要10个正样本1,而这些样本的特征 f1的值为全为1,而其余9990条样本的f1特征都为0在高维稀疏的情况下这种情况很常见在高维稀疏的情况下这种情况很常见在高维稀疏的情况下这种情况很常见。 我们都知道在这种情况下,树模型很容易优化出一个使用f1特征作为重要分裂节点的树,因为这个结点直接能够将训练数据划分的很好,但是当测试的时候,却会发现效果很差,因为这个特征f1只是刚好偶然间跟y拟合到了这个规律,这也是我们常说的过拟合。 那么这种情况下,如果采用LR的话,应该也会出现类似过拟合的情况呀:y = W1f1 + Wifi+….,其中 W1特别大以拟合这10个样本。为什么此时树模型就过拟合的更严重呢? 仔细想想发现,因为现在的模型普遍都会带着正则项,而 LR 等线性模型的正则项是对权重的惩罚,也就是 W1一旦过大,惩罚就会很大,进一步压缩 W1的值,使他不至于过大。但是,树模型则不一样,树模型的惩罚项通常为叶子节点数和深度等,而我们都知道,对于上面这种 case,树只需要一个节点就可以完美分割9990和10个样本,一个结点,最终产生的惩罚项极其之小。 这也就是为什么在高维稀疏特征的时候,线性模型会比非线性模型好的原因了:带正则化的线性模型比较不容易对稀疏特征过拟合。23.GBDT的原理?GBDT是一种基于boosting集成思想的加法模型,训练时采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。 xgboost是基于GBDT的思想上做了一些优化,如下: GBDT以传统CART作为基分类器,而xgboosting支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题); GBDT在优化时只用到一阶导数,xgboost对代价函数做了二阶Talor展开,引入了一阶导数和二阶导数; 当样本存在缺失值是,xgboost能自动学习分裂方向; xgboost借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算; xgboost的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合; xgboost在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间; xgboost工具支持并行,但并不是tree粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,xgBoosting在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行; 可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;24.为什么xgboost不用后剪枝?后剪枝计算代价太高了,合并一次叶节点就要计算一次测试集的表现,数据量大的情况下非常消耗时间,而且也并不是特别必要,因为这样很容易过拟合测试集。25.xgboost.XGBClassifier 分类算法&参数详解?class xgboost.XGBClassifiermaxdepth=3,learningrate=0.1,nestimators=100,silent=True,objective=′binary:logistic′,booster=′gbtree′,njobs=1,nthread=None,gamma=0,minchildweight=1,maxdeltastep=0,subsample=1,colsamplebytree=1,colsamplebylevel=1,regalpha=0,reglambda=1,scaleposweight=1,basescore=0.5,randomstate=0,seed=None,missing=None,∗∗kwargsmax_depth=3, learning_rate=0.1, n_estimators=100, silent=True, objective='binary:logistic', booster='gbtree', n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, **kwargsmaxdepth=3,learningrate=0.1,nestimators=100,silent=True,objective=′binary:logistic′,booster=′gbtree′,njobs=1,nthread=None,gamma=0,minchildweight=1,maxdeltastep=0,subsample=1,colsamplebytree=1,colsamplebylevel=1,regalpha=0,reglambda=1,scaleposweight=1,basescore=0.5,randomstate=0,seed=None,missing=None,∗∗kwargs booster gbtree 树模型做为基分类器(默认) gbliner 线性模型做为基分类器 n_jobs 并行线程数 silent silent=0时,不输出中间过程(默认) silent=1时,输出中间过程 nthread nthread=-1时,使用全部CPU进行并行运算(默认) nthread=1时,使用1个CPU进行运算。 scale_pos_weight 正样本的权重,在二分类任务中,当正负样本比例失衡时,设置正样本的权重,模型效果更好。例如,当正负样本比例为1:10时,scale_pos_weight=10。 n_estimatores 含义:总共迭代的次数,即决策树的个数 调参: max_depth 含义:树的深度,默认值为6,典型值3-10。 调参:值越大,越容易过拟合;值越小,越容易欠拟合。 min_child_weight 含义:默认值为1,。 调参:值越大,越容易欠拟合;值越小,越容易过拟合(值较大时,避免模型学习到局部的特殊样本)。 subsample 含义:训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。 调参:防止overfitting。 colsample_bytree 含义:训练每棵树时,使用的特征占全部特征的比例。默认值为1,典型值为0.5-1。 调参:防止overfitting。 learning_rate 含义:学习率,控制每次迭代更新权重时的步长,默认0.3。 调参:值越小,训练越慢。 典型值为0.01-0.2。 gamma 惩罚项系数,指定节点分裂所需的最小损失函数下降值。 调参: alpha L1正则化系数,默认为1 lambda L2正则化系数,默认为1
2021年04月02日
400 阅读
0 评论
4 点赞