机器学习经过漫长的发展,算法的数量与类型也比较繁杂.这篇文章用于记载机器学习总共有哪些算法,并进行粗略的简介,随着复习进度,会不断的补充没写上的算法。而博主会针对 NLP 与 推荐方向比较常用的机器学习算法进行深入讲解
关于机器学习的分类,其实有些算法比较难以定义,例如决策树算法可以分类也可以回归,所以在分类上,大家就不必太过于纠结
classification (分类),
regression (回归),
clustering (聚类),
dimensionality reduction (降维)。
关于类别的详细介绍
零 集成算法
集成算法中的 GDBT ,XGBoost 等对于推荐方向和 NLP 方向有着广泛的应用,因此为此特分一个专题
1. boosting 算法
关于boosting(提升算法)的概念,上文有简单介绍过,提升算法(这是一类算法族的称呼,不是指某种具体算法)是通过改变训练样本的权重(如果基分类器不支持则通过调整采样的方式改变基分类器的训练样本分布),学习多个分类器,并将这些分类器进行线性组合,提高分类的性能
1.1 Adaboost(自适应增强算法)
在 boosting 中有两个问题,第一:如何调整每次训练样本权重,第二:如何将得到的 M 个学习器组合成最终学习器
而在 Adaboost 中,选择了以下策略,第一:提高上一轮被错误分类的样本的权值,降低正确分类的样本权值
第二:线性加权求和,误差率小的基学习器有较大的权值,误差率大的基学习器有较小的权值
1.2 梯度下降树 GDBT(GDBT 实际上包含 XGBoost 算法,它是 GDBT 的一个变种,为了区分,GDBT 一般指只用了一阶导数信息的 GDBT 算法)
GDBT 是以 CART 树(回归树)作为基分类器的 boosting 算法。GDBT 算法主要是通过残差拟合目标,也就是根据第一个模型的预估值与真实值的误差,再新建一个分类器,对误差进行拟合
1.3 XGBoost
如果把xgboost对gbdt的所有改进细节列出来,那牵扯的point有点多,所以选择几个点进行阐述。
为了用最容易理解的思路,我们就假设不知道xgboost算法,先去思考GBDT的过程中有哪些点可以改进:
1、基学习器的选择。
GBDT使用CART(回归树)作为基学习器,我们还可以考虑支持其他的基学习器,所以xgboost也支持线性学习器
2、损失函数的选择。
GBDT大多数情况下采用平方误差和作为损失函数,我们还可以考虑更优秀的损失函数,所以xgboost实现了自己的损失函数。
3、特征分裂点及特征选择。
GBDT采用CART树的特征分裂点及特征选择方式,具体为串行遍历所有的特征分裂点和特征,选择平方误差和最小的特征及特征分裂点;
这个过程中,我们注意到各特征及分割点的损失函数的计算可以并行执行,而且如果对样本按照特征排序的结果在全局可以复用,可大大提高计算效率,而xgboost也是这样做的。
另外,GBDT的每棵树的特征选择策略都是相同的,方差较小,多样性不足,我们可以借鉴随机森林中列抽样(随机变量选择)的思想,xgboost也实现了这一点。
4、不同的树对于残差的拟合策略
GBDT采用残差的一阶导数代替残差进行拟合(这里需要说明,许多资料说用一阶导代替残差的原因是残差难以获得,这好扯淡啊,拟合一阶导的优点明明是为了更快地进行拟合,而且当损失函数为平方误差和时,一阶导就等于残差),发散一下我们就想到了梯度下降和牛顿法,那我们能不能使用二阶导来拟合残差呢,答案是肯定的,且xgboost也是这样做的,而且通过二阶导拟合策略计算出了xgboost的损失函数(见步骤2)。损失函数不仅考虑到了经验风险,也考虑到了结构风险,通过结构风险正则化,使得xgboost泛化性能更佳,更不容易过拟合。
1.4 LightGBM
LightGBM 在精度,运行效率,内存消耗上都有提升于 XGBoost
1、boosting过程中,最耗时的就是特征选择及连续特征分裂点选取的问题,xgboost已经通过pre-sorted预排序的方法进行了优化,但是如果样本对应的特征枚举值过多,还是会导致耗时过长的问题。所以我们可以考虑HistoGram(直方图)算法,通过预先对样本的特征进行分桶(bin)的方式,在选择分裂点的时候遍历各个桶,就可以有效地提高运行效率,虽然会稍微损失一点精度,但是可以通过其它的优化进行弥补。
2、结点的分裂策略。GBDT和xgboost在树的分裂过程中,都采用level-wise(类似层序遍历)的分裂方式,这种方式平等地对待了分裂贡献可能相差很大的同一层的不同子结点。lightGBM采用leaf-wise(类似深度优先遍历)分裂策略,每一步都选择最深的贡献最大的子结点进行分裂。
3、采样方法。无论是GBDT还是xgboost,我们都是在不停地训练基学习器去拟合残差,当残差小于某个阈值时停止训练,可能存在这样一种情况,对于大多数样本来讲,其梯度已经较小,而小部分样本的梯度仍较大,所以我们想到可以在每次训练新的基学习器时,保留梯度较大的样本,减少梯度较小的样本数量(随机采样),这便是GOSS方法(Gradient-based One-Side Sampling)。
一 监督学习
1. 监督学习
1.1 分类算法
① 支持向量机 SVM (SMO 序列最小优化算法:解决二次优化问题的算法,可用于优化 SVM 算法)
(这里稍微提一句,感知机算法 是 SVM 和神经网络算法的基础,但因为年代比较久远,想稍微了解下,可转传送门: 感知机)
优点:泛化错误率低,结果易解释。
缺点:对大规模训练样本难以实施,解决多分类问题存在困难,对参数调节和核函数的选择敏感。
应用场景:文本分类、人像识别、医学诊断等。
② 决策树(DT)
信息增益(ID3)、信息增益率(C4.5)、基尼系数(CART)等等。
优点:易于理解和解释,可以可视化分析,容易提取出规则;能够处理不相关的特征。
缺点:对缺失数据处理比较困难。
应用场景:在决策过程应用较多。
③ 朴素贝叶斯(NBC)
p(A|B)= p(B|A)*p(A/p(B)
优点:在数据较少的情况下仍然有效,可以处理多类别问题。
缺点:对输入数据的准备方式较为敏感。
应用场景:文本分类、人脸识别、欺诈检测。
④ K-近邻(K-NN)
优点:简单、易于理解、易于实现,无需估计参数。此外,与朴素贝叶斯之类的算法比,无数据输入假定、准确度高、对异常数据值不敏感。
缺点:对于训练数据依赖程度比较大,并且缺少训练阶段,无法应对多样本。
应用场景:字符识别、文本分类、图像识别等领域。
⑤ 随机森林 Random Forest
⑥ 逻辑回归 (LR)-logistics regression
⑦ 线性回归 (LR)-Linear Regression
1.2 回归算法
① GDBT(梯度下降树)
GDBT 与 随机森林的区别
1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
2、组成随机森林的树可以并行生成;而GBDT只能是串行生成
3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
4、随机森林对异常值不敏感,GBDT对异常值非常敏感
5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
二 非监督学习
2.1 数据降维
① 主成分分析(PCA)
N 维向量降维到 k 维上,优先选取方差最大的地方,
优点:降低数据的复杂性,识别最重要的多个特征。
缺点:主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强;有可能损失有用的信息。
应用场景:语音、图像、通信的分析处理。
② 奇异值分解(SVD)
将复杂矩阵用更小更简单的子矩阵相乘表示,这些矩阵描述的是大矩阵的重要特性
优点:简化数据,去除噪声点,提高算法的结果。
缺点:数据的转换可能难以理解。
应用场景:推荐系统、图片压缩等
③ 文档主题生成模型(LDA)
④ MDS 降维算法
保证降维后距离最近
2.2 聚类算法
① K-均值聚类(K-Means)
迭代求解的聚类分析算法,采用距离作为相似度指标。
优点:算法简单容易实现。
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢。
应用场景:图像处理、数据分析以及市场研究等
② DBSCAN 聚类算法
③ SOM 聚类算法
④ LVQ 聚类算法
三 强化学习
① Q-learning
基于值的强化学习算法,根据动作值函数评估应该选择哪个动作,这个函数决定了处于某一个特定状态以及在该状态下采取特定动作的奖励期望值。
优点:可以接收更广的数据范围。
缺点:缺乏通用性。
应用场景:游戏开发
四 其他算法
4.1 偏数类算法
① GMM
高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一类分布但参数不一样,或者是不同类型的分布,比如正态分布和伯努利分布)
应用场景:图像前景分析
4.2 似然估计算法
① EM 算法(期望最大化算法)【 EM 算法是计算极大似然估计(MLE)的一种特殊算法:含有隐变量的MLE】
是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。
详情:EM 算法
② MLE 算法(极大似然估计)
我写过一篇博文里有介绍,可以切过去
③ MAP (最大后验概率)
④ 隐马尔科夫(HMM)
用于描述含有隐藏变量的马尔科夫过程
4.3 梯度下降算法
(梯度下降是机器学习中最常用的算法,但本身不是机器学习算法,而是一种求解最优化的算法,主要解决求最小值的问题)
① 批量梯度下降(Batch gradient descent)
批量梯度下降又分为小批量梯度下降和批量梯度下降,小批量 是才取少量的数据,一次一次的训练模型
② 随机梯度下降(SGD)
最原始的随机梯度下降算法主要依据当前梯度∂L/∂w乘上一个系数学习率α来更新模型权重w的。