决策树
分类回归都可以。返回的是类别/数据。
优点:可解释性、可以处理数值类和类别类的特征
缺点:不稳定(鲁棒性差)、结点太多导致过拟合、构建树是顺序化的过程,不好被并行。
随机森林
分别独立训练多个决策树,提升稳定性。
随机森林的随机来自于哪里?——①bagging:每次训练,有放回地随机采样②随机采样特征列
GBDT(Gradient Boosting Decision Trees)
顺序训练多棵树,这些树合成一个大的模型。只能用作回归。
假设之前
t
−
1
t - 1
t−1棵树训练的结果加起来是
F
t
(
x
)
F_t(x)
Ft(x):
在残差数据上训练树
f
t
f_t
ft:特征值不变,原预测值要减去
F
t
(
x
)
F_t(x)
Ft(x)
如果采用均方误差,相当于每一次训练一个树去拟合我梯度的负数。(这个巨好理解!就是平方差求导的负数)
缺点:①弱学习器之间存在依赖关系,难以并行训练数据 ②高维稀疏数据上表现一般
Xgboost
改进/特点为如下:
①GBDT损失函数只对误差部分做负梯度(一阶泰勒)展开;Xgboost对损失函数进行了二阶泰勒展开,同时使用一阶二阶导数。
②损失函数添加正则化项,限制了【叶子结点数,叶子结点权值大小】
③分裂方式不是MSE,而是最大化损失函数【和一阶导和二阶导有关】的差值:遍历所有特征,寻找使损失函数前后相差最大的分裂方式。
④缺失值:GBDT没有专门针对缺失值进行处理;Xgboost枚举所有缺失值在当前节点是进入左子树,还是进入右子树更优来决定缺失值默认的方向
⑤GBDT使用CART作为基分类器;XGB支持多种类型的基分类器,如线性分类器
⑥xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),能降低过拟合,减少计算。GBDT在每轮迭代时使用全部的数据;XGB则采用了类似RF的策略,支持对数据进行采样。
⑦并行化处理:Xgboost在训练之前,对每个特征内部进行了排序,找出候选切割点,保存为block结构,减小计算量。在进行节点的分裂时,需要选选择增益最大的那个特征去分裂,那么各个特征的增益计算就可以多线程进行。
聚类
K均值
初始化K个中心(随机选K个样本初始化),距离是平方差,然后划分——不断迭代。
确定K的方法:
①自己感受一下(?)
②手肘法
k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大。
k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减。
SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。
③轮廓系数法
选择使系数较大所对应的k值。
簇内不相似度 簇间不相似度…求一个系数,分母是max(a(i),min(bi)),分子是两个相减。
LVQ(学习向量量化算法)
假设数据样本带有类别标记,学习过程利用样本的这些监督信息来辅助聚类。
初始化K个原型向量。每一轮选代随机选取一个有标记训练样本,找出与其距离最近的原型向量,根据两者的类别标记是否一致来对原型向量进行相应的更新。
高斯混合聚类
采用概率模型来表达聚类原型。
高斯混合聚类的基本假设是:样本的生成过程是由高斯混合分布给出的,聚类问题转化为判断样本主要是由哪个高斯分布产生的。
最大化极大似然常采用EM算法。
DBSCAN(密度聚类)
假设聚类结构能通过样本分布的紧密程度确定。
任选数据集中的一个核心对象为"种子" (seed) ,再由此出发确定相应的聚类簇,算法先根据给定的邻域参数找出所有核心对象,然后以任一核心对象为出发点,找出由其密度可达的样本生成聚类簇,直到所有核心对象均被访问过为止。
线性回归
y
=
<
w
,
x
>
+
b
y = <w,x> + b
y=<w,x>+b 来学习w和b
损失函数:均方误差
如何用线性回归做分类?——假设有m个类别,类别用长度为m的one-hot向量表示。设计m组w、m组b,做m次
o
i
=
w
i
x
+
b
i
(
i
=
1
,
.
.
.
,
m
)
o_i = w_ix+b_i(i = 1, ...,m)
oi=wix+bi(i=1,...,m)
损失函数为
1
m
∣
o
−
y
∣
2
2
\frac {1}{m} |o - y|^2_2
m1∣o−y∣22
问题是过分关心别的类。
更好的办法是将其j结果变为概率进softmax,然后使用交叉熵。
∑
i
−
y
i
l
o
g
y
^
i
\sum_{i}-y_ilog \hat y_i
∑i−yilogy^i
梯度下降
反向传播去看王木头好吧…他好牛
SGD(小批量随机梯度下降)
在一个mini-batch中计算梯度,迭代更新参数
g
t
=
∇
θ
t
−
1
f
(
θ
t
−
1
)
g_t=\nabla_{\theta_{t-1}}{f(\theta_{t-1})}
gt=∇θt−1f(θt−1)
Δ
θ
t
=
−
η
∗
g
t
\Delta{\theta_t}=-\eta*g_t
Δθt=−η∗gt
缺点:学习率选择困难,容易到达局部最优
(学习率太大可能会震荡)
动量
m
t
=
μ
∗
m
t
−
1
+
g
t
m_t=\mu*m_{t-1}+g_t
mt=μ∗mt−1+gt
Δ
θ
t
=
−
η
∗
m
t
\Delta{\theta_t}=-\eta*m_t
Δθt=−η∗mt
μ \mu μ是动量因子。特点:该加速加速该减小减小。更新幅度增大、防止震荡,跳出陷阱。
Adagrad
约束学习率
n
t
=
n
t
−
1
+
g
t
2
n_t=n_{t-1}+g_t^2
nt=nt−1+gt2
Δ
θ
t
=
−
η
n
t
+
ϵ
∗
g
t
\Delta{\theta_t}=-\frac{\eta}{\sqrt{n_t+\epsilon}}*g_t
Δθt=−nt+ϵη∗gt
此处,对
g
t
g_t
gt从1到t进行一个递推形成一个约束项regularizer,
−
1
∑
r
=
1
t
(
g
r
)
2
+
ϵ
-\frac{1}{\sqrt{\sum_{r=1}^t(g_r)^2+\epsilon}}
−∑r=1t(gr)2+ϵ1,
ϵ
\epsilon
ϵ用来保证分母非0。
前期g_t较小的时候, regularizer较大,能够放大梯度
后期g_t较大的时候,regularizer较小,能够约束梯度
适合处理稀疏梯度
Adadelta
Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。不用依赖全局学习率。
RMSprop
趋于上述两者之间。累加梯度平方和的平均数。再求根变为均方根。
Adam
带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
m t = μ ∗ m t − 1 + ( 1 − μ ) ∗ g t n t = ν ∗ n t − 1 + ( 1 − ν ) ∗ g t 2 m t ^ = m t 1 − μ t n t ^ = n t 1 − ν t Δ θ t = − m t ^ n t ^ + ϵ ∗ η m_t=\mu*m_{t-1}+(1-\mu)*g_t \\ n_t=\nu*n_{t-1}+(1-\nu)*g_t^2 \\ \hat{m_t}=\frac{m_t}{1-\mu^t} \\ \hat{n_t}=\frac{n_t}{1-\nu^t} \\ \Delta{\theta_t}=-\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\epsilon}*\eta mt=μ∗mt−1+(1−μ)∗gtnt=ν∗nt−1+(1−ν)∗gt2mt^=1−μtmtnt^=1−νtntΔθt=−nt^+ϵmt^∗η
①估计一阶矩、二阶矩 ②校正,这样可以近似为对期望的无偏估计
神经网络
隐藏层的作用:
升维的隐藏层:让模型变得更复杂,把数据映射到高维空间更容易分类。
降维的隐藏层:对上一层进行抽象。
低层次的隐藏层作用:让底层的特征更容易被复用(更细粒度)(拿了MNIST手写数据集做例子)
隐藏层代表可以对数据进行抽象的程度,越深抽象程度越高
反向传播,其实可以看成w是自变量,因变量是loss的函数图。梯度指向上升最快的方向,所以w要往梯度反方向走。
损失函数
最小二乘法
m i n ∑ i = 1 n 1 2 ( x i − y i ) 2 min \sum_{i = 1}^n\frac{1}{2}(x_i -y_i)^2 min∑i=1n21(xi−yi)2
为什么使用平方项而不使用绝对值?——绝对值在一些点是不可导的
缺点——在梯度下降的时候很麻烦
极大似然估计法
极大似然:概率的反向运用。知道结果反推最大可能出现的概率模型。
有时候假设概率模型是高斯分布?
妈的结果展开之后竟然变成了交叉熵…
交叉熵
Focal Loss
Focal Loss主要关注难易样本的不平衡问题,可根据对高置信度§样本进行降权。
GMD loss
既不要关注那些容易学的样本,也不要关注那些离群点特别难分的样本。
定义了梯度密度,表示单位梯度模长g部分的样本个数,作为损失函数的分母。