利用泰勒公式去逼近任何函数,在GBDT一阶导数的基础上引入二阶导更加精确,同时在二阶导的基础上可以转化为关于叶子结点权重的一元二次方程,在顺序扫描计算增益损失时更加精准,因为本身二阶导在推导过程中可以更精确的反应梯度是如何变化的,从而更精确的实现loss下降(无放回训练,因为中间有梯度下降)
同时因为xgboost的损失函数是基于MSE的,这样有更好的扩展性,任何可以进行二阶泰勒展开的都可以自定义其损失函数,既可分类也可回归。
1、第一点利用泰勒展开本质上上是去模拟逼近函数,二阶展开可以进一步拟合精度,二阶信息可以描述梯度变化方向是如何变化的。
2、第二点为了xgboost的可扩展性,使xgboost能够【自定义loss function】,只要损失函数二阶可导就可套用推导结果,即可分类也可回归。
XGBoost官网上有说,当目标函数是 MSE
时,展开是一阶项(残差)+二阶项的形式,而其它目标函数,如 logistic loss
的展开式就没有这样的形式。为了能有个统一的形式,所以采用泰勒展开来得到二阶项,这样就能把 MSE
推导的那套直接复用到其它自定义损失函数上。简短来说,就是为了统一损失函数求导的形式以支持自定义损失函数。
至于为什幺要在形式上与 MSE
统一?是因为 MSE
是最普遍且常用的损失函数,而且求导最容易,求导后的形式也十分简单。所以理论上只要损失函数形式与 MSE
统一了,那就只用推导 MSE
就好了。
Xgboost相对于GBDT的不同
1、GBDT是机器学习方法,xgboost是该算法的工程实现
2、在使用CART作为基分类器时,XGBoost显式地加入正则化项来控制模型的复杂度,有利于防止过拟合,提高模型的泛化能力
3、GBDT在模型训练时只采用了代价函数的一阶导数信息,XGBoost进行二阶展开,可以同时采用一阶二阶导数
4、传统GBDT采用CART作为基分类器,XGBoost支持多种类型分类器,比如线性分类器
5、GBDT会采用全部的数据,XGBoost支持下采样,同时设置了缺失值的处理方式,通过左右两轮遍历办证稀疏值处于左右子树
6、分裂算法,线性排列后进行扫描特征,确定节点的增益损失大小,以确定最好的分割点。
重新清洗样本,增加样本数量进行样本集扩充,最简单淳朴的方法,在项目中对图片数据进行平移翻转、扩充等各种方法将数据集扩充
降低模型复杂度,引入L2正则化系数,利用early stopping,减少迭代次数,
在树模型中可以进行剪枝等相关操作,在数据层面也可以进一步减少特征项,降低拟合的复杂度
可以进行数据集的扩充,对大类样本欠采样,小类样本进行过采样(基于聚类的过采样策略---SMOTE算法、图片样本扩充),插值等方法,引入新的评价指标,不单单使用P,R值,利用F1值,ROC曲线进行描述拟合,也可以进一步更新损失函数,比如在医学图像分割中提出的dice函数,iou交并比其实就是小样本占比比较小的一种策略
同时改变训练策略,可以引入RF等集成学习的策略,选择小类样本和相同数目的大类样本并行跑小模型最后集成学习
2*3*3的感知野相当于5*5,但是每个卷积核后边都会接relu函数,这样的话可以引入更多的非线性,相当于引入更多的正则化项
同时小尺寸的卷积核所需要调参的数目也不大尺寸卷积核要少。
1*1卷积:https://zhuanlan.zhihu.com/p/40050371
1、1*1卷积用来降维,调整网络深度,使网络结构更紧凑,同时需要调节的参数也会减小,增加非线性
2、实现跨通道的交互和信息整合(改变channel数)
inception+ResNet
inception不用我们选择,而是把4个选项给神经网络,让它自由选择,自己选择最合适的解决方案
蓝色卷积块的作用就是为了让网络根据需要灵活的控制数据的depth,GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一
Inception模块采用不同尺寸的卷积核,可以不同时考虑区域和通道的问题
1、AlexNet:双GPU运行,Relu为激活函数,LRN局部归一化,Droupot随机化乘以系数p,在池化过程中z>s
2、VGGNet:卷积核3*3,最大池化 2*2 ,1*1的卷积在于线性变化
两个3*3卷积核串联相当于5*5,同理3个3*3串联相当于7*7
3、GoogleNet:同一层中卷积核大小不同,可以进行不同尺度的特征融合
LSTM的基本网络结构:https://www.jianshu.com/p/9dc9f41f0b29
遗忘门+输入门+输出门
遗忘门:
确定更新信息:
更新细胞状态:
输出信息:
LSTM的核心,使用隐藏状态保存已经通过它的输入信息。
单向LSTM仅保留过去的信息,因为它看到的唯一输入来自过去。
使用双向将以两种方式运行输入,一种从过去到未来,一种从未来到过去,这种方法与单向的不同之处在于,在向后运行的LSTM中,您保留来自 future的信息并且使用两种隐藏状态,您可以在任何时间点保存过去和未来的信息。
用-F参数项指定列的分隔符。
关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。
KNN本质上是有监督学习,数据是带有label的多分类算法,通过选取与样本点相近的k个样本的最多所属类别作为样本点的类别,主要有距离度量,k值选择,分类决策机制几部分构成,常见的分类机制有构建kd树进行划分。
k-means是无监督学习方法,用于聚类的算法,其他聚类方法还有层次聚类、密度聚类等。但是受离群点的影响比较大,需要进行数据归一化处理,同时利用手肘法等确定合理的拐点,找到合适的K值。
KNN
K-means
SVM核函数的主要作用是将低维空间中的样本映射到高维空间中,将原来不可分的两类点转换成线性可分的,因为svm本质上是将相似的样本划分到一类,同时在对偶问题的求解中会出现xi*xj的形式,这样引入核函数,将其中xi和xj的形式替换成(xi)的形式,这样学习是在特征空间上隐式的学习,而不用显式的定义特征空间和映射函数,其中正定核的条件内积大于等于0,从向量空间到内积空间再到希尔伯特空间。
避免了低维空间大量样本做内积的维数灾难,解决的根本问题是非线性不可分问题,SVM本身的思想是间隔最大化,寻找确定分隔边界使得所有间隔最大化。进一步引入对偶问题,对偶问题有拉格朗日函数更好求解,同时自然引入核函数,推广到非线性问题。
知乎专栏:https://zhuanlan.zhihu.com/p/93715996
把原问题转换为对偶问题?因为原问题是凸二次规划问题,转换为对偶问题更加高效。为什么求解对偶问题更加高效?因为只用求解alpha系数,而alpha系数只有支持向量才非0,其他全部为0.alpha系数有多少个?样本点的个数
在机器学习中常用的核函数,一般有这么几类,也就是LibSVM中自带的这几类:
一般用线性核和高斯核,也就是Linear核与RBF核
需要注意的是需要对数据归一化处理,很多使用者忘了这个小细节
然后一般情况下RBF效果是不会差于Linear,但是时间上RBF会耗费更多
下面是吴恩达的见解:
工作中,最常用的是Linear核与RBF核。
由泰勒公式展开,可以发现高斯核是一种特殊的多项式核函数,即n趋向于无穷时的解,因此高斯核是一种映射到无穷维的核函数,以保证VC维一定可以找到超平面把数据类别很好的分开。
多分类可以采用一对一,一对多的方法,构建多个分类器,最后投票决定,libsvm中采用的是一对一法,在任意两个样本之间构建SVM分类器。
支持向量回归SVR,转化为回归问题,即在确定的fx两侧存在一定间隔带,落入间隔带的样本点不计较损失。
增加margin,我们人为定义在margin内部的点我们直接不计算在distance^2里面,仍可以利用松弛变量来减小margin的负面影响
1、SVM算法对大规模训练样本难以实施,涉及到大量矩阵运算,引入SMO算法
2、解决多分类问题存在困难
源网址:https://www.cnblogs.com/nowgood/p/sigmoidcrossentropy.html
一般的attention机制在编码阶段对不同时刻的隐藏状态进行加权平均得到背景向量CT,在解码时要调整attention权重关注不同时刻的背景向量C,中间的背景向量ca是不断变化的,等于对每一个词的加权累加,权重系数的计算就是引入softmax函数它将解码器ht-1和编码器0到T时刻的所有状态作为输入来计算不同时刻a的值,本质可以模拟软件系统中的软寻址,哈希表通过构造函数来表征查询值与键值之间的相似性然后再乘以values进行加权求和
词向量嵌入和word2vec:https://zhuanlan.zhihu.com/p/26306795
Enbedding最广泛的应用是在词嵌入向量领域,核心思想是将向量映射成低维空间上的稠密向量,k维空间的每一维都可以看成一个隐含的主题。
利用网络优化参数(低维表示且自学习参数),在词向量中对应乘以权值矩阵的时候,同时在深度学习模型中每个隐层对应着不同抽象层次的特征。
链接:https://zhuanlan.zhihu.com/p/26306795
看看 Skip-gram 的网络结构了,x 就是上面提到的 one-hot encoder 形式的输入,y 是在这 V 个词上输出的概率,我们希望跟真实的 y 的 one-hot encoder 一样。
首先说明一点:隐层的激活函数其实是线性的,相当于没做任何处理(这也是 Word2vec 简化之前语言模型的独到之处),我们要训练这个神经网络,用反向传播算法,本质上是链式求导
当模型训练完后,最后得到的其实是神经网络的权重,比如现在输入一个 x 的 one-hot encoder: [1,0,0,…,0],对应刚说的那个词语『吴彦祖』,则在输入层到隐含层的权重里,只有对应 1 这个位置的权重被激活,这些权重的个数,跟隐含层节点数是一致的,从而这些权重组成一个向量 vx 来表示x,而因为每个词语的 one-hot encoder 里面 1 的位置是不同的,所以,这个向量 vx 就可以用来唯一表示 x。
注意:上面这段话说的就是 Word2vec 的精髓!!
此外,我们刚说了,输出 y 也是用 V 个节点表示的,对应V个词语,所以其实,我们把输出节点置成 [1,0,0,…,0],它也能表示『吴彦祖』这个单词,但是激活的是隐含层到输出层的权重,这些权重的个数,跟隐含层一样,也可以组成一个向量 vy,跟上面提到的 vx 维度一样,并且可以看做是词语『吴彦祖』的另一种词向量。而这两种词向量 vx 和 vy,正是 Mikolov 在论文里所提到的,『输入向量』和『输出向量』(对应输入层的embeding和输出层的embeding矩阵),一般我们用『输入向量』。
词向量的维度(与隐含层节点数一致)一般情况下要远远小于词语总数 V 的大小,所以 Word2vec 本质上是一种降维操作——把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示。
分层softmax函数:赫夫曼树,和树的深度有关,出现频率高的词更靠近根节点
负样本采样:在正确但粗以外进行负采样,随机生成【0,M-1】的int型
模型的可学习型,只与数据量与模型复杂度有关----https://wizardforcel.gitbooks.io/ntu-hsuantienlin-ml/content/8.html
在这张图里,纵轴是错误率(1-精度),横轴是VC维,out-of-sample指的是测试集错误率,越小越好。in-sample-error指的是训练集错误率。
我们可以看出:
VC维的定义:
一个假设空间H的VC dimension,是这个H最多能够shatter掉的点的数量,记为dvc(H)。
VC维的大小:与学习算法A无关,与输入变量X的分布也无关,与我们求解的目标函数f 无关。它只与模型和假设空间有关。
工业实践中通过引入正则对模型复杂度(VC维)进行控制,平衡这两个问题的矛盾。
VC Dimension就是某假设集H能够shatter的最多inputs的个数,即最大完全正确的分类能力。(注意,只要存在一种分布的inputs能够正确分类也满足)。
shatter的英文意思是“粉碎”,也就是说对于inputs的所有情况都能列举出来。例如对N个输入,如果能够将种情况都列出来,则称该N个输入能够被假设集H shatter。
根据之前break point的定义:假设集不能被shatter任何分布类型的inputs的最少个数。则VC Dimension等于break point的个数减一。
首先从统计学意义上,观察均方差,3原则,落在3之外的应该是属于异常离群点;
箱型图,四分位数的上下两侧存在异常值予以剔除,计算第一第四分位数
密度聚类,DBSCAN,存在核心点和边界点,不属于任何团簇的点属于噪声点的范畴。
孤立森林,孤立数是孤立数据点所需的拆分数,异常值与非异常点相比具有更低的孤立数。因此,如果数据点的孤立数低于阈值,则将数据点定义为异常值。
##python直接可以调用
clf = IsolationForest(max_samples=100, random_state=42)
置信区间是我们所计算出的变量存在的范围,置信水平就是我们对于这个数值存在于我们计算出的这个范围的可信程度。
举例来讲,有95%的把握,真正的数值在我们所计算的范围里。
在这里,95%是置信水平,而计算出的范围,就是置信区间。
如果置信度为95%, 则抽取100个样本来估计总体的均值,由100个样本所构造的100个区间中,约有95个区间包含总体均值。
基于距离度量和在更新过程中用到梯度更新的模型都需要进行模型归一化和离群点处理等预处理操作。
其中合理选择K值的方法包括:
PCA是一种线性、非监督、全局的降维方法,对应最大方差投影与最小回归误差。
最大化投影方差就是让数据在主轴上投影的方差最大,即找到一个投影方向,使得各变量在w的投影方差尽可能大。
而且投影存在内积形式,对应协方差矩阵的前n个特征值和特征向量。将n维样本映射到d维实现降维去噪。
PCA最小平方误差,其目标是求解一个线性函数使得对应直线能够更好地拟合样本集合。本质上和最大方差理论是一致的。
LDA是一种有监督的降维方法,最大化类间散度,最小化类内散度,但是存在一些强假设:要求类内数据服从高斯分布且各个类的协方差相等,主要但仍然可以压制噪声。
对应矩阵是最大的特征值,投影方向就是这个特征值对应的特征向量。类内散度矩阵,类间散度矩阵,全局散度矩阵。
Linear SVM和LR都是线性分类器,但LR可以给出对应类别的输出概率
从目标函数来看,区别在于逻辑回归采用的是logistical loss,svm采用的是hinge loss
Linear SVM不直接依赖数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance一般需要先对数据做balancing。线性SVM主要依赖于支持向量的作用
Linear SVM依赖数据表达的距离测度,所以需要对数据先做normalization归一化;LR其影响不大,只是为了在梯度更新的过程中防止陷入局部最优解而归一化。
Linear SVM依赖penalty的系数,实验中需要做validation,数据集规模Kernel SVM 在大规模数据集的情况下基本不实用,但是如果数据集本身比较小而且维度高的的话一般 SVM 表现更好。
Linear SVM和LR的performance都会收到outlier的影响,其敏感程度而言,SVM 的优点在于,通过忽略已经分类正确的点,最后训练出来的模型更加稳健,对 outlier 不敏感
LR Model 专场:https://www.jianshu.com/p/dce9f1af7bc9
逻辑回归本质上是线性回归,只是在特征到结果的映射中加入了一层逻辑函数g(z),即先把特征线性求和,然后使用函数g(z)作为假设函数来预测。g(z)可以将连续值映射到0 和1。g(z)为sigmoid function.
则
sigmoid function 的导数如下:
逻辑回归用来分类0/1 问题,也就是预测结果属于0 或者1 的二值分类问题。这里假设了二值满足伯努利分布,也就是
其也可以写成如下的形式:
对于训练数据集,特征数据x={x1, x2, … , xm}和对应的分类标签y={y1, y2, … , ym},假设m个样本是相互独立的,那么,极大似然函数为:
log似然为:
如何使其最大呢?与线性回归类似,我们使用梯度上升的方法(求最小使用梯度下降),那么
如果只用一个训练样例(x,y),采用随机梯度上升规则,那么随机梯度上升更新规则为:
损失函数:
LR加正则化项:
LR解决线性不可分问题:
(1)利用特殊核函数,对特征进行变换:把低维空间转换到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。
(2)扩展LR算法,提出FM算法。
LR model 用于特征组合:
把特征离散化,然后做组合特征,可以实现一定程度的非线性
在LR中,我们可以通过在基本线性回归模型的基础上引入交叉项,来实现非线性分类,如下:
但是这种直接在交叉项xixj的前面加上交叉项系数wij的方式在稀疏数据的情况下存在一个很大的缺陷,即在对于观察样本中未出现交互的特征分量,不能对相应的参数进行估计。
即,在数据稀疏性普遍存在的实际应用场景中,二次项参数的训练是很困难的。其原因是,每个参数 wij的训练需要大量xi和 xj都非零的样本;由于样本数据本来就比较稀疏,满足xi 和 xj都非零”的样本将会非常少。训练样本的不足,很容易导致参数 wij 不准确,最终将严重影响模型的性能。
为什么LR可以用来做CTR预估
1. LR是线性模型,具有很好的可解释性,分布式计算迭代速度快。
2. LR可以很好的利用正则化解决稀疏性问题,尤其特征维数非常大,大到千亿级别。。
3. LR可以输出概率,天然适合Ranking.
4. 离散特征比较好,LR也可以做特征选择
逻辑回归与线性回归
都是一种广义线性模型(generalized linear model)。逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布。 因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。可以说,逻辑回归是以线性回归为理论支持的,但是逻辑回归通过Sigmoid函数引入了非线性因素,因此可以轻松处理0/1分类问题
LR满足伯努利分布,而伯努利分布可以转化为指数分布,只要类条件概率满足指数分布的,其后验都可以写成sigmoid函数的形式
朴素贝叶斯:https://zhuanlan.zhihu.com/p/107725697
避免陷入局部最优解:
1、学习率调整:重新把已经调整的很小的学习率数值放大,强行逼迫优化算法跳出此刻找到的鞍点或者极值点
2、以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数,这相当于从多个不同的初始化点开始搜索,从而可能寻找全局最优。
3、使用模拟退化技术,模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。在每步迭代过程中,接受“次优解”的概率随着时间的推移而逐渐降低,从而保证算法的稳定。
https://zhuanlan.zhihu.com/p/50741970
1、视频数据的二八效应和长尾原则,利用优酷这些大平台电视剧的播放收益都交给制片方,但是像抖音快手这样的短视频app提供的优质内容都比较分散,但是最终的蚂蚁视频聚合起来,播放量就会特别大,包括蚂蚁金服,其实长尾原则更能体现平台的重要性和网站的相对优势地位。
如何处理:对数变化,box-cox变化,因为数据足够多的时候倾向于正态分布,因为本身公司的数据源是足够多的,但由中心极限定理可知是不用处理的。取对数是为了使数据尽量服从正态分布,其次是为了避免模型构建后出现异方差问题
2、趋势部分经过预处理(取对数和差分平稳的方法),再次通过ARIMA模型进行建模仿真,最后预测数据由趋势部分的建模结果累加周期部分。
ARIMA模型的思想就是从历史的数据中学习到随时间变化的模式,学到了就用这个规律去预测未来。
ARIMA(p,d,q)模型,其中 d 是差分的阶数,用来得到平稳序列:
AR:当前值只是过去值的加权求和。
MA:过去的白噪音的移动平均。
ARMA:AR和MA的综合。
https://www.zhihu.com/people/ju-zhen-li-lun-he-ji-suan-fang-fa
香农提出了熵的定义:无损编码事件信息的最小平均编码长度。如果熵比较大(即平均编码长度较长),意味着这一信息有较多的可能状态,相应的每个状态的可能性比较低;因此每当来了一个新的信息,我们很难对其作出准确预测,即有着比较大的混乱程度/不确定性/不可预测性。
上文中已知一个离散变量 i 的概率分布P(i),熵的公式可以表示为:
在熵的公式中,对于离散变量和连续变量,我们都是计算了 负的可能性的对数 的期望,代表了该事件理论上的平均最小编码长度,所以熵的公式也可表示如下,公式中的x~P代表我们使用概率分布P来计算期望,熵又可以简写为H:
交叉熵利用观测到的假设分布去预估拟合真实分布,因此给出了观测和真实分布之间的差距
在二分类模型中,标签只有是和否两种;这时,可以使用二分类交叉熵作为损失函数。假设数据集中只有猫和狗的照片,则交叉熵公式中只包含两种可能性:
又因为:
所以交叉熵可以表示为:
使用如下定义:
二分类的交叉熵可以写作如下形式,看起来就熟悉多了。
xgboost引入L2正则化,在叶子结点的打分函数上会输出L2的平滑项。更多的一般是xgboost的优点,没有免费的午餐,没有一种模型是绝对意义上的优势,gbdt因为只利用一阶导数,而xgboost需要二阶展开,计算二阶海森矩阵的收敛过程,如果目标损失函数在一阶导对收敛的速度远远高于二阶导的情况下,那么在计算二阶导带来的增益远远不够支付额外计算海森矩阵带来的开销的话,可以选择一阶残差拟合网络GBDT。
同时一般的优势在于GBDT对于硬件的要求也会低一些,收敛和训练速度更快一些,不需要预排序和block的存储情况。
(二)XGBOOST正则项里包含了树的叶子节点个数、叶子节点权重的 范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合
这个公式形式上跟ID3算法、CART算法是一致的,都是用分裂后的某种值减去分裂前的某种值,从而得到增益。为了限制树的生长,我们可以加入阈值,当增益大于阈值时才让节点分裂,上式中的gamma即阈值,它是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝。另外,上式中还有一个系数lambda,是正则项里leaf score的L2模平方的系数,对leaf score做了平滑,也起到了防止过拟合的作用,这个是传统GBDT里不具备的特性。
GBDT还有一个缺点是不能利用mini_batch的方式进行训练,这样的话需要将所有数据进行全部加载,对内存的要求过高。
LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;
优点在于决策树生长策略上:leaf-wise生长策略、histogram 做差加速、直接支持类别特征(一vs多)
特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
模型融合:Lightgbm在特征和数据尺度上都有并行的机制存在,同时有特征直方图的构建以及深度扩展和父节点做差策略的存在,可以保证树的快速分裂,但是在构建直方图的时候在特征尺度上会损失一定的精度,因此在前期特征量很大的时候可以选择gbm模型预测,而后对特征进行筛选后在后面模型中选择xgb进行贪心算法的分类。
同时对于跨模型的重复特征应用也是在stacking模型融合时可以改进的一个点。
CART是后剪枝,损失函数是带正则化的对数似然函数,后剪枝的a对应正则化过程,也有控制树的深度和过拟合的机制在的
分类树采用基尼指数,回归树采用均方差来计算,分类和回归任务不同,一个是离散值,一个是连续值
1)无论是ID3, C4.5还是CART,在做特征选择的时候都是选择最优的一个特征来做分类决策,但是大多数,分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的。这样决策得到的决策树更加准确。这个决策树叫做多变量决策树(multi-variate decision tree)。在选择最优特征的时候,多变量决策树不是选择某一个最优特征,而是选择最优的一个特征线性组合来做决策。这个算法的代表是OC1,这里不多介绍。
2)如果样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习里面的随机森林之类的方法解决。
泛化能力强也是选择决策树作为基分类器的一个重要原因。