各算法优缺点
# 1、回归
## 1.1 线性回归
线性回归是用于回归的,它不像Logistic回归那样用于分类,其基本思想是用**梯度下降法**对最小二乘法形式的误差函数进行优化,当然也可以用normal equation直接求得参数的解,结果为:$\hat{w}=\left(X^{T} X\right)^{-1} X^{T} y$
> **优点:** 实现简单,计算简单;
>
> **缺点:**
>- 对复杂数据拟合不好,**欠拟合**
>- 对**异常值**非常敏感
## 1.2 多项式回归(Polynomial Regression)
当我们要创建适合处理非线性可分数据的模型时,我们需要使用多项式回归。在这种回归技术中,最佳拟合线不是一条直线,而是一条符合数据点的曲线。
> **优点:** 能够模拟非线性可分的数据;线性回归不能做到这一点。它总体上更灵活,可以模拟一些相当复杂的关系。
>
> **缺点:**
>- 需要仔细的设计。需要一些数据的先验知识才能选择**最佳指数**。
>- 如果指数选择不当,容易**过拟合**。
## 1.3 Lasso回归(L1正则化)
>**特点:**
>- Lasso回归更容易使得**权重变为 0** ,可以用来做 **feature selection**,而 ridge 不行
>- Lasso回归的**计算量**将远远小于岭回归
## 1.4 岭回归(L2正则化)
>**使用场景:**
ridge 更容易使得权重接近 0
## 1.5 ElasticNet回归
> **使用场景**
ElasticNet在我们发现用Lasso回归太过(太多特征被稀疏为0),而岭回归也正则化的不够(回归系数衰减太慢)的时候,可以考虑使用ElasticNet回归来**综合**,得到比较好的结果。
参考:[岭回归,lasso回归,ElasticNet回归的使用场景](https://blog.csdn.net/weixin_42034031/article/details/105757640)
# 2、KNN
KNN即最近邻算法,其主要过程为:
1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
2. 对上面所有的距离值进行排序(升序);
3. 选前k个最小距离的样本;
4. 根据这k个样本的标签进行投票,得到最后的分类类别;
如何选择一个最佳的K值,这取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响,但会使类别之间的界限变得模糊。一个较好的K值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。近邻算法具有较强的一致性结果,随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的K值,K近邻保证错误率不会超过贝叶斯理论误差率。
> **优点:**
>- 既可以用来做分类也可以用来做回归;
>- 可用于非线性分类;
>- **训练时间复杂度为O(n);**
>- 对数据没有假设,准确度高,**对outlier不敏感;**
>- KNN是一种在线技术,新数据可直接加入数据集而不必重新训练;
>- **理论简单,容易实现;**
>
> **缺点:**
>- **样本不平衡**时效果差;
>- 需要**大量内存**;
>- 对于样本容量大的数据集**计算量比较大**(体现在距离计算上);
>- KNN每一次分类都会重新进行一次全局运算;
>- **k值大小的选择没有理论选择最优**,往往是结合K-折交叉验证得到最优k值选择;
# 3、决策树
决策树的一大优势就是易于解释。它可以毫无压力地处理特征间的交互关系并且是非参数化的,因此你不必担心异常值或者数据是否线性可分(举个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)。它的缺点之一就是不支持在线学习,于是在新样本到来后,决策树需要全部重建。另一个缺点就是容易出现过拟合,但这也就是诸如随机森林RF(或提升树boosted tree)之类的集成方法的切入点。另外,随机森林经常是很多分类问题的赢家(通常比支持向量机好上那么一丁点),它训练快速并且可调,同时你无须担心要像支持向量机那样调一大堆参数,所以在以前都一直很受欢迎。
> **优点:**
>- 决策树**易于理解和解释**,可以可视化分析,容易提取出规则;
>- 可以**同时处理标称型和数值型数据**;
>- 比较适合**处理有缺失属性的样本**;
>- 能够处理不相关的特征;
>- 测试数据集时,运行速度比较快;
>- 在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
> **缺点:**
>- **容易发生过拟合**(可以对决策树进行剪枝;可以采用交叉验证法和加入正则化的方法;随机森林可以很大程度上减少过拟合);
>- 容易忽略数据集中属性的**相互关联**;
>- 对于那些各类别样本数量不一致的数据,在决策树中,进行属性划分时,不同的判定准则会带来不同的属性选择倾向;信息增益准则对可取数目较多的属性有所偏好(典型代表ID3算法),而增益率准则(CART)则对可取数目较少的属性有所偏好,但CART进行属性划分时候不再简单地直接利用增益率尽心划分,而是采用一种启发式规则)(只要是使用了信息增益,都有这个缺点,如RF)。
>- ID3算法计算信息增益时结果偏向数值比较多的特征。
注:[为什么树模型不适合高维稀疏特征](https://blog.csdn.net/papaaa/article/details/79910449)
## 3.1 ID3、C4.5算法
ID3算法是以信息论为基础,以**信息增益**和**信息增益率**为衡量标准,从而实现对数据的归纳分类。ID3算法计算每个属性的信息增益,并选取具有最高增益的属性作为给定的测试属性。C4.5算法核心思想是ID3算法,是ID3算法的改进,改进方面有:
- 用信息增益率来选择属性,**克服了用信息增益选择属性时偏向选择取值多的属性的不足;**
- 在树构造过程中进行剪枝;
- 能处理非离散的数据;
- 能处理不完整的数据。
> **优点:** 产生的分类规则**易于理解,准确率较高**。
>
> **缺点:**
>- 在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致**算法的低效**;
>- C4.5只适合于能够驻留于内存的数据集,当**训练集大**得无法在内存容纳时程序无法运行。
## 3.2 CART分类与回归树
是一种决策树分类方法,采用基于最小距离的基尼指数估计函数,用来决定由该子数据集生成的决策树的拓展形。如果目标变量是标称的,称为分类树;如果目标变量是连续的,称为回归树。分类树是使用树结构算法将数据分成离散类的方法。
> **优点:**
>- 非常灵活,可以允许有部分错分成本,还可指定先验概率分布,可使用自动的成本复杂性剪枝来得到归纳性更强的树。
>- 在面对诸如存在缺失值、变量数多等问题时CART 显得非常稳健。
>
> **缺点:**
# 4、SVM支持向量机
支持向量机,一个经久不衰的算法,**主要二分类领域**,高准确率,为避免过拟合提供了很好的理论保证,而且就算数据在原特征空间线性不可分,只要给个合适的核函数,它就能运行得很好。**在动辄超高维的文本分类问题中特别受欢迎**。可惜内存消耗大,难以解释,运行和调参也有些烦人,而**随机森林却刚好避开了这些缺点,比较实用。**
> **优点:**
>- 可以**解决高维问题**,即大型特征空间;
>- 解决**小样本**下机器学习问题;
>- 能够处理非线性特征的相互作用;
>- 无局部极小值问题;(相对于神经网络等算法)
>- 无需依赖整个数据;
>- 泛化能力比较强;
>
> **缺点:**
>- 当观测**样本很多时,效率并不是很高**;
>- **对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数**;
>- 对于核函数的高维映射解释力不强,尤其是径向基函数;
>- 常规SVM只支持**二分类**;
>- **对缺失数据敏感**;
对于核的选择也是有技巧的(libsvm中自带了四种核函数:线性核、多项式核、RBF以及sigmoid核):
- 第一,如果样本数量小于特征数,那么就没必要选择非线性核,简单的使用线性核就可以了;
- 第二,如果样本数量大于特征数目,这时可以使用非线性核,将样本映射到更高维度,一般可以得到更好的结果;
- 第三,如果样本数目和特征数目相等,该情况可以使用非线性核,原理和第二种一样。
对于第一种情况,也可以先对数据进行降维,然后使用非线性核,这也是一种方法。
# 5、人工神经网络
> **优点:**
>- 分类的**准确度高**;
>- 并行分布处理能力强,分布存储及学习能力强,
>- 对噪声神经有较强的**鲁棒性和容错能力**;
>- 具备联想记忆的功能,能充分逼近复杂的**非线性关系**;
>
> **缺点:**
>- 神经网络需要**大量的参数**,如网络拓扑结构、权值和阈值的初始值;
>- 黑盒过程,不能观察之间的学习过程,**输出结果难以解释**,会影响到结果的可信度和可接受程度;
>- **学习时间过长**,有可能陷入**局部极小值**,甚至可能达不到学习的目的。
# 6、聚类算法
## 6.1 K-Means聚类
> **优点:**
>- **算法简单,容易实现** ;
>- 算法**速度很快**;
>- 对处理大数据集,该算法是**相对可伸缩的和高效率的**,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法**通常局部收敛**。
>- 算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。
>
> **缺点:**
>- 对数据类型要求较高,适合**数值型数**据;
>- 可能收敛到局部最小值,在**大规模数据上收敛较慢**
>- 分组的数目k是一个输入参数,**不合适的k可能返回较差的结果**。
>- **对初值的簇心值敏感**,对于不同的初始值,可能会导致不同的聚类结果;
>- 不适合于发现非凸面形状的簇,或者大小差别很大的簇。
>- **对于”噪声”和孤立点数据敏感**,少量的该类数据能够对平均值产生极大影响。
## 6.2 K-中心点聚类
> **优点:**
>- 减少某些孤立数据对聚类过程的影响。从而使得最终效果更接近真实划分。
>
> **缺点:**
>- 相对K-Means大约增加O(n)的计算量,因此一般情况下K-中心算法更加适合小规模数据运算。
## 6.3 DBSCAN聚类
DBSCAN是一种**基于密度**的聚类算法,可以通过样本分布的紧密程度决定,同一类别的样本之间是紧密相连的,不同样本是是分离的。
> **优点:**
>- 可以对**任意形状**的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
>- 可以在聚类的同时发现异常点,对数据集中的**异常点不敏感**。
>- 聚类结果**没有偏倚**,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
>
> **缺点:**
>- 如果样本集的**密度不均匀、聚类间距差相差很大时**,聚类质量较差,这时用DBSCAN聚类一般不适合。
>- 如果**样本集较大时,聚类收敛时间较长**,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
>- **调参**相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值R,邻域样本数阈值MinPts联合调参,**不同的参数组合对最后的聚类效果有较大影响。**
## 6.4 二者对比
均值聚类K-Means是基于划分的聚类, DBSCAN是基于密度的聚类。区别为:
>- K-Means需要指定聚类簇数k,并且且**初始聚类中心对聚类影响很大**。k-means把任何点都归到了某一个类,**对异常点比较敏感**。DBSCAN能**剔除噪声**,需要指定邻域距离阈值eps和样本个数阈值MinPts,可以**自动确定簇个数**。
>- K均值和DBSCAN都是将每个对象指派到单个簇的划分聚类算法,但是K均值一般**聚类所有对**象,而DBSCAN**丢弃被它识别为噪声的对象**。
>- K均值**很难处理非球形的簇和不同大小的簇**。DBSCAN**可以处理不同大小或形状的簇,并且不太受噪声和离群点的影响**。当簇具有很不相同的密度时,两种算法的性能都很差。
>- K均值只能用于具有明确定义的质心(比如均值或中位数)的数据。DBSCAN要求密度定义(基于传统的欧几里得密度概念)对于数据是有意义的。
>- K均值算法的**时间复杂度是O(m)**,而DBSCAN的**时间复杂度是O(m^2)**。
>- DBSCAN多次运行**产生相同的结果**,而K均值通常使用随机初始化质心,**不会产生相同的结果**。
>- K均值DBSCAN和都寻找使用所有属性的簇,即它们都不寻找可能只涉及某个属性子集的簇。
>- K均值可以发现不是明显分离的簇,即便簇有重叠也可以发现,但是DBSCAN会合并有重叠的簇。
>- K均值可以用于**稀疏的高维数据**,如文档数据。DBSCAN通常在这类数据上的**性能很差**,因为对于高维数据,传统的欧几里得密度定义不能很好处理它们。
# 7、贝叶斯
## 7.1 朴素贝叶斯分类器(NB:naive Bayes classifiers)
顾名思义,其适用于分类任务、并且假设每个属性独立地对分类结果发生影响,然而现实中各个因素往往并不独立,那是否就无法解决问题呢?
事实上并非如此,相反,朴素贝叶斯分类器在很多情况下都能获得相当好的性能,一种解释是:无需精准概率值即可导致正确分类结果;另一种解释是:若属性间依赖对所有类别影响相同,或依赖关系的影响能相互抵消,则属性条件独立性假设在降低计算开销的同时,不会对性能产生负面影响。
> **优点:**
>- **计算量较小**
>- 支持懒惰学习、增量学习
>- 对**缺失数据不太敏感**
>- 推断即查表,**速度极快**
>
> **缺点:**
>- **没有考虑属性间依赖**
>- 通过类先验概率产生模型
## 7.2 半朴素贝叶斯分类器(SNB:semi-naive Bayes classifiers)
相比NB的不考虑依赖,SNB则是考虑了一个(独依赖估计策略:ODE)或多个(多依赖估计策略:kDE)属性依赖
> **优点:**
>- 考虑了一个或多个比较强的**属性依赖关系**,**泛化性能可能得到提升**
>- **计算开销不大**
>- 同样支持懒惰学习、增量学习
>
> **缺点:** 通过类先验概率产生模型
## 7.3 贝叶斯网(信念网)
贝叶斯网借助有向无环图刻画属性之间的依赖关系,通过吉布斯采样或者变分推断等方式来近似推断后验概率。
> **优点:**
>- 更加完整地考虑了属性间依赖关系,**泛化性能将进一步提升**
>- 近似估算后验概率
>- 可用于**推测属性缺失的样本**
>- 良好的**可解释性**
>- 常用于语音识别、机器翻译等
>
> **缺点:**
>- 结构学习NP难,通过评分搜索方法缓解
>- 推断算法的**收敛速度较慢**
# 8、集成学习
## 8.1 随机森林(Bagging)
> **优点:**
>- 具有**极高的准确率**
>- 随机性的引入,使得随机森林**不容易过拟合**,有很好的**抗噪声能力**,对**异常点离群点不敏感**
>- **能处理很高维度的数据,并且不用做特征选择**
>- 既能处理**离散型数据**,也能处理**连续型数据**,数据集无需规范化(归一化)
>- **实现简单,训练速度快,可以得到变量重要性排序**(计算每个特征在分裂时被选到的次数或者某个特征不纯度平均下降了多少)
>- 容易实现并行化
>- 在创建随机森林的时候,对generlization error使用的是无偏估计,不需要额外的验证集
>- 如果有很大一部分的特征遗失,用RF算法仍然可以维持准确度
>- 对于不平衡数据集来说,随机森林可以平衡误差。当存在分类不平衡的情况时,随机森林能提供平衡数据集误差的有效方法
>
> **缺点:**
>- 随机森林已经被证明**在某些噪音较大的分类或回归问题上会过拟合**
>- 对于有不同取值的属性的数据,**取值划分较多的属性**会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
>- 随机森林模型还有许多不好解释的地方,有点算个**黑盒模型**。
>- **对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类**。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)
>- **执行数据虽然比boosting等快**(随机森林属于bagging),但比单只决策树慢多了。
**适用场景:** 数据维度相对低(几十维),同时对准确性有较高要求时。因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。
## 8.2 AdaBoost (Boosting)
Adaboost是一种加和模型,每个模型都是基于上一次模型的错误率来建立的,过分关注分错的样本,而对正确分类的样本减少关注度,逐次迭代之后,可以得到一个相对较好的模型。
> **优点:**
>- 很好的利用了弱分类器进行级联;
>- 可以将不同的分类算法作为弱分类器,非常灵活。
>- 泛化错误率低,**精度高,无需调整参数。**
>- 相对于bagging算法和Random Forest算法,AdaBoost**充分考虑的每个分类器的权重;**
>- 可用于**特征选择**(feature selection)
>
> **缺点:**
>- AdaBoost**迭代次数**也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定;
>- **数据不平衡**导致分类精度下降;
>- 训练比较**耗时**,每次重新选择当前分类器最好切分点;
>- **对离群点敏感**,在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰
## 8.3 GBDT (Boosting)
> **优点:**
>- 可以灵活处理各种类型的数据,包括**连续值和离散值**。
>- 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
>- 使用一些健壮的损失函数,对**异常值的鲁棒性非常强**。比如 Huber损失函数和Quantile损失函数。
>- **不需要归一化**。树模型都不需要,**梯度下降算法才需要**
>- GBDT可以**构造新特征**,然后融合LR模型
>
> **缺点:**
>- 由于弱学习器之间存在依赖关系,**难以并行训练数据**。不过可以通过子采样的SGBT来达到部分并行
>- 不适合**高维稀疏特征**
### 8.3.1 XGBoost (GBDT)
之所以XGBoost可以成为机器学习的大杀器,广泛用于数据科学竞赛和工业界,是因为它有许多优点:
> **优点:**(与GBDT相比)
>- **精度更高**:GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost 引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
>- **灵活性更强**:GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,使用线性分类器的 XGBoost 相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;
>- **正则化**:XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的 L2 范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合,这也是XGBoost优于传统GBDT的一个特性。
>- **Shrinkage(缩减)**:相当于学习速率。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。传统GBDT的实现也有学习速率;
>- **列抽样**:XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算。这也是XGBoost异于传统GBDT的一个特性;
>- **缺失值处理**:对于特征的值有缺失的样本,XGBoost 采用的稀疏感知算法可以自动学习出它的分裂方向;
>- **XGBoost工具支持并行**:boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
>- **可并行的近似算法**:树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以XGBoost还提出了一种可并行的近似算法,用于高效地生成候选的分割点。
>
> **缺点:**(与lightGBM相比)
>- XGBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,**数据量大时,贪心法耗时**;LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低。
>- XGBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了**不必要的开销**;LightGBM采用深度优化,leaf-wise生长策略,每次从当前叶子中选择增益最大的结点进行分裂,循环迭代,但会生长出更深的决策树,产生过拟合,因此引入了一个阈值进行限制,防止过拟合。
---
参考:
[机器学习算法优缺点对比及选择(汇总篇)](https://zhuanlan.zhihu.com/p/46831267?from_voters_page=true)
[机器学习 集成学习各算法-gbdt,xgboost,lightgbm比较及优缺点特征总结](https://blog.csdn.net/a1272899331/article/details/104714892?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-2-104714892.nonecase&utm_term=%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E7%9A%84%E4%BC%98%E7%BC%BA%E7%82%B9)
[深入理解XGBoost](https://zhuanlan.zhihu.com/p/83901304)
[各类机器学习算法的优缺点和适用场景汇总](https://blog.csdn.net/u010921136/article/details/90668382?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-6-90668382.nonecase&utm_term=%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E7%9A%84%E4%BC%98%E7%BC%BA%E7%82%B9)