机器学习记录1

SVM的一些问题

https://zhuanlan.zhihu.com/p/76946313 

一. 简单概括一下SVM:

SVM 是一种二类分类模型。它的基本思想是在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类,具体来讲,有三种情况(不加核函数的话就是个线性模型,加了之后才会升级为一个非线性模型):

  • 当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
  • 当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
  • 当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。

二. SVM 为什么采用间隔最大化(与感知机的区别):

当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强。

十三. SVM的优缺点:

优点:

  1. 由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优。
  2. 不仅适用于线性线性问题还适用于非线性问题(用核技巧)。
  3. 拥有高维样本空间的数据也能用SVM,这是因为数据集的复杂度只取决于支持向量而不是数据集的维度,这在某种意义上避免了“维数灾难”。
  4. 理论基础比较完善(例如神经网络就更像一个黑盒子)。

缺点:

  1. 二次规划问题求解将涉及m阶矩阵的计算(m为样本的个数), 因此SVM不适用于超大数据集。(SMO算法可以缓解这个问题)
  2. 只适用于二分类问题。(SVM的推广SVR也适用于回归问题;可以通过多个SVM的组合来解决多分类问题)

SVM和LR区别和联系?

https://zhuanlan.zhihu.com/p/80714877

 

PCA

PCA,主成分析,用于数据降维

SVD

 

我们可以看到S矩阵里面的特征值(已经排序好了),我们可以选取前r个,同时修改U,V矩阵的维度,那么我们就可以对原矩阵进行降维了

 

为什么说bagging是减少variance,而boosting是减少bias?

https://www.zhihu.com/question/26760839

集成学习介绍

这篇文章主要讲解集成学习三种方法。集成学习(Emsemble Learning)是通过结合几个模型的元算法(meta-algorithm),使得最后的表现比任何一个模型好。在Kaggle,集成学习是取得高排名的不二法宝。本文介绍集成学习的三种模式,以便帮助读者对自己的最后模型进行决策。这三种方法以及他们的效果分别是:

  1. Bagging:减少 variance
  2. boosting: 减少 bias

1.bagging

Bagging 是 bootstrap aggregation的缩写。依据有放回的随机抽样构造的n个采样集,我们就可以对他们分别进行训练,得到n个弱分类器,然后根据每个弱分类器返回的结构,我们可以采用一定的组合策略得到我们需要的强分类器。

Bagging已经有很广泛的应用,例如random forest就是把n个decision tree进行bagging,然后通过投票选出最可能的结果。

 

2.boosting

boosting是一个迭代的过程,用来自适应的改变训练样本的分布,使得弱分类器聚焦到那些很难分类的样本上,它的做法是给每个训练样本赋予一个权重,在每一轮的训练结束时自动调整权重。

boosting方法代表的算法有Adaboost, GBDT, XGBoost算法

boosting的算法流程如图:

最常用的方法是AdaBoost[1],是adaptive boosting的简称,为了使得本文可读性增加,我把这Adaboost单独写一篇文章,具体可以参考

桔了个仔:AdaBoost算法以及公式傻瓜式一步一步超详细讲解带示例​zhuanlan.zhihu.com

比喻一下,大家做过作业吧,有收集过错题本吗?今天考试我这道题做错了,我把它记在错题本里,下次考试前,我就单独翻开错题本单独做一遍。如果下次考试做对了,就从错题本里删除,否则,在错题本里把这道题再做一次。这样每次下去,你的考试成绩就很可能提高。Boosting就是这样的原理。

3.Stacking

stacking的算法如上图。其实和和bagging不同的是,stacking通常是不同的模型。

第一步,有T个不同模型,根据数据,各自独立训练。每个模型输出结果为 [公式] ,其中t= 1,2,3...T

第二步,根据每个模型预测,创建新的『训练集』,训练集的数据(X)是预测结果,Y是实际结果。

第三步,再训练一个classifier,这里叫meta-classifier,来从各个预测中再生成最后预测。

和bagging有点相似,不一样的是:

  1. bagging每个classifier其实是同一种模型
  2. bagging每个bag用部分数据训练,stacking每个classifier都用了全部训练数据

个人实践,如果第三步没有足够训练数据,可以取平均。如果有足够数据,可以用线性回归,毕竟数据维度有点太低。如果有读者有更好实践,请大声在评论区喊出来。

 

boosting和bagging的区别:

  • 解决的问题不一样。boosting是解决基学习器欠拟合的问题,bagging是解决基学习器过拟合的问题。所以,Boosting的基学习器都是弱学习器,而bagging的学习器都是强学习器。
  • Bagging的各个基学习器是独立的,可以并行计算,而Boosting是串行的,不可以并行计算。
  • Bagging的最终的结果是平均的,Boosting对每一个基学习器权重不同。

AdaBoost(Adaptive Boosting)训练过程

  1. 刚开始训练时对每一个训练样本赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重。 也就是让学习算法在每次学习以后更注意学错的样本。
  2. 基于调整后的样本训练下一个基学习器,如此反复,直到基学习器数量达到事先制定的值T。
  3. 将这T个基学习器进行线性加权组合。

指数损失函数。

最常用的基分类器是决策树,为什么?

  1. 决策树可以较为方便地将样本的权重整合到训练过程中,而不需要使用过采样的方法来调整样本权重。
  2. 决策树的表达能力和泛化能力,可以通过调节树的层数来做折中。
  3. 数据样本的扰动对于决策树的影响较大,因此不同子样本集合生成的决策树基分类器随机性较大,这样的“不稳定学习器”更适合作为基分类器。此外, 在决策树节点分裂的时候,随机地选择一个特征子集,从中找出最优分裂属性, 很好地引入了随机性。

除了决策树外,神经网络模型也适合作为基分类器,主要由于神经网络模型 也比较“不稳定”,而且还可以通过调整神经元数量、连接方式、网络层数、初始 权值等方式引入随机性。

GBDT

GBDT的优点:

  1. 预测阶段基模型是并行计算的。
  2. 它在分布稠密的数据集上,表达能力和泛化能力都很好(拟合能力强和方差小)。
  3. 它的基模型是决策树,具有较强可解释性,且不需要对数据归一化等预处理。

GBDT的缺点:

  1. 它的训练过程是串行的,无法并行,速度问题。
  2. 在高维稀疏数据集上,不如神经网络。
  3. 在文本分类的时候表现不太好。

GBDT和XGBOOST的区别和联系:

  1. GBDT是一个算法,XGBOOST是GBDT的工程实现。
  2. 当使用CART作为基模型时,XGBOOST显式地加入了正则项。
  3. GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代 价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
  4. GBDT的基学习器只能是CART,但XGBOOST还可以使用线性分类器等多种类型的基分类器。
  5. GBDT训练时直接使用全部数据集,XGBOOST则使用了类似随机森林的采样策略。
  6. GBDT对缺失值没有进行处理,XGBOOST能自动学习出缺失值的处理策略。

xgboost相比传统gbdt有何不同?xgboost为什么快?xgboost如何支持并行?

https://www.zhihu.com/question/41354392/answer/98658997

看了陈天奇大神的文章和slides,略抒己见,没有面面俱到,不恰当的地方欢迎讨论:

  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  • xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  • Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
  • 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  • 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
  • xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  • 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

BP反向传播

https://zhuanlan.zhihu.com/p/22473137

 K近邻算法

一.k近邻算法的基本概念,原理以及应用

k近邻算法是一种基本分类和回归方法。本篇文章只讨论分类问题的k近邻法。

K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(这就类似于现实生活中少数服从多数的思想)根据这个说法,咱们来看下引自维基百科上的一幅图:

                                   

如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。这也就是我们的目的,来了一个新的数据点,我要得到它的类别是什么?好的,下面我们根据k近邻的思想来给绿色圆点进行分类。

  • 如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
  • 如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。

从上面例子我们可以看出,k近邻的算法思想非常的简单,也非常的容易理解,那么我们是不是就到此结束了,该算法的原理我们也已经懂了,也知道怎么给新来的点如何进行归类,只要找到离它最近的k个实例,哪个类别最多即可。

如何解决机器学习中样本不均衡问题?


https://www.zhihu.com/question/66408862/answer/245813803

通过过抽样和欠抽样解决样本不均衡

抽样是解决样本分布不均衡相对简单且常用的方法,包括过抽样和欠抽样两种。

过抽样

过抽样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本特征少而可能导致过拟合的问题;经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本,例如SMOTE算法。

欠抽样

欠抽样(也叫下采样、under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息。

总体上,过抽样和欠抽样更适合大数据分布不均衡的情况,尤其是第一种(过抽样)方法应用更加广泛。

通过正负样本的惩罚权重解决样本不均衡

通过正负样本的惩罚权重解决样本不均衡的问题的思想是在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。

使用这种方法时需要对样本本身做额外处理,只需在算法模型的参数中进行相应设置即可。很多模型和算法中都有基于类别参数的调整设置,以scikit-learn中的SVM为例,通过在class_weight
: {dict, 'balanced'}中针对不同类别针对不同的权重,来手动指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为:n_samples / (n_classes * np.bincount(y))。

如果算法本身支持,这种思路是更加简单且高效的方法。

通过组合/集成方法解决样本不均衡

组合/集成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。

例如,在数据集中的正、负例的样本分别为100和10000条,比例为1:100。此时可以将负例样本(类别中的大量样本集)随机分为100份(当然也可以分更多),每份100条数据;然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的数据集。如此反复可以得到100个训练集和对应的训练模型。

这种解决问题的思路类似于随机森林。在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小树”组合形成的“森林”具有良好的模型预测能力。

如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。

通过特征选择解决样本不均衡

上述几种方法都是基于数据行的操作,通过多种途径来使得不同类别的样本数据行记录均衡。除此以外,还可以考虑使用或辅助于基于列的特征选择方法。

一般情况下,样本不均衡也会导致特征分布不均衡,但如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。

提示 上述几种方法的思路都是基于分类问题解决的。实际上,这种从大规模数据中寻找罕见数据的情况,也可以使用非监督式的学习方法,例如使用One-class SVM进行异常检测。分类是监督式方法,前期是基于带有标签(Label)的数据进行分类预测;而采用非监督式方法,则是使用除了标签以外的其他特征进行模型拟合,这样也能得到异常数据记录。所以,要解决异常检测类的问题,先是考虑整体思路,然后再考虑方法模型。

发布了102 篇原创文章 · 获赞 117 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/pursuit_zhangyu/article/details/102469301