一.KNN算法

1.既可用于分类也可用于回归

2.主要思想是找到预测样本中最近的K个邻居(一般通过欧式距离或者曼哈顿距离公式计算),用K个邻居的目标值中占多数的目标代表预测样本的目标

分类:K个邻居投票决定,少数服从多数

回归:K个邻居目标的平均值

3.所以KNN算法最关键的点就是K值的选取决定了模型的效果,一般可通过K-折交叉验证或者网格搜索法选择一个模型评分最优的K值

二、线性回归

线性回归的本质就是通过自变量(特征)的线性组合来描述因变量

使用线性回归模型:各自变量(特征)之间不能有多重共线性或者 自变量(特征)的数量不能多于样本数,因为自变量的矩阵必须为满秩矩阵(可逆)

1.预测函数: y= XW

2.损失函数:loss= 1/2(y-y_)^2 y_为预测值

求回归系数W:使用最小二乘法,它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。即loss最小,当导数为0时最小

推导过程:

KNN算法在回归任务中使用 knn可以用于回归吗_迭代


X^TX必须可逆,即X为满秩矩阵

三、岭回归、lasso回归当X^TX

不可逆时,即特征之间有多重共线性,或者特征数多于样本数时,无法求出回归系数W,且当|X^TX|越趋近于0,

|X^TX|的逆(逆=矩阵的伴随/矩阵的行列式)趋近于无穷大,即回归系数W趋近无穷大,这样的W没有意义

故引入岭回归 = 线性回归+L2正则项

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_02


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_03


1.可通过网格搜索法确定L2正则项系数

2.交叉验证法确定λ值

交叉验证法的思想是,将数据集拆分为k个数据组(每组样本量大体相当),从k组中挑选k-1组用于模型的训练,剩下的1组用于模型的测试,则会有k-1个训练集和测试集配对,每一种训练集和测试集下都会有对应的一个模型及模型评分(如均方误差),进而可以得到一个平均评分。对于λ值则选择平均评分最优的λ值。

lasso回归

lasso回归 = 线性回归+L1正则项

岭回归无法剔除变量,而LASSO回归模型,将惩罚项由L2范数变为L1范数,可以将一些不重要的回归系数缩减为0,达到剔除变量的目的。故lasso回归比岭回归迭代快

多元线性回归模型中,如果所有特征一起上,容易造成过拟合使测试数据误差方差过大;因此减少不必要的特征,简化模型是减小方差的一个重要步骤。除了直接对特征筛选,来也可以进行特征压缩,减少某些不重要的特征系数,系数压缩趋近于0就可以认为舍弃该特征。

参数资料地址:

逻辑斯蒂回归

Logistic回归是一种广义线性回归模型,解决的是因变量为二分类变量的预测或判别问题。

找到预测函数:sigmod函数把线性回归模型的预测值转变为[0,1]之间的概率值

怎么求解参数β, 转化为条件概率,通过最大似然估计得到似然函数,对似然函数取对数,

通过梯度下降法迭代求解

KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_04


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_05


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_06


地址:

树模型

一、决策树

ID3算法:1.特征选取:准则“信息增益”,每次根据最大的信息增益选取当前最佳的特征来分割数据,一旦按某特征切分后,该特征在算法之后的执行中将不再起作用

信息增益=信息熵-条件熵。条件熵越小,信息增益越大

在信息增益中,重要性的衡量标准就是看特征能够为分类系统带来多少信息,带来的信息越多,该特征越重要。

信息熵:

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_07


KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_08


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_09


outlook特征的条件熵:

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_10


2.根据切分的特征生成一颗树

3.剪枝(预剪枝:在树的生成过程时,提前停止,如max_depth参数。

后剪枝:决策树构建好之后再比较剪枝前后误差,决定是否剪枝)

ID3算法的缺点:1.ID3算法对可取值数目较多的特征有所偏好,因为特征值多的特征有相对较大的信息增益(信息增益反映的是给定一个条件以后,不确定性减少的程度。必然是分的越细的数据集确定性越高,这可能会导致过拟合)

2.ID3算法特征只能是离散型特征

C4.5算法

ID3算法信息增益会偏向于取值较多的变量,极端例子如果一个变量的取值正好是N个,则其条件熵会等于0,在该变量下因变量的信息增益一定是最大的,为了克服这种缺点,

C4.5算法使用信息增益比对根节点或中间节点进行选择。

即特征A的信息增益/A的信息熵, 信息增益GainA(D)可能越大,但同时A的信息熵也会越大,这样就以商的形式实现了对信息增益的惩罚。

CART

cart 即分类回归树

ID3和C4.5只能对离散型自变量进行分类,而CART可以处理连续型自变量。CART算法以基尼指数对根节点或中间节点进行选择。

基尼指数代表了模型的不纯度,基尼指数越小,不纯度越低,特征越好

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_11


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_12


首先对数据集特征{是否有房,婚姻状况,年收入}分别计算它们的Gini系数增益,取Gini系数增益值最大(即基尼指数最小)的属性作为决策树的根节点属性。根节点的Gini系数:

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_13


KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_14


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_15


KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_16


KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_17


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_18


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_19

剪枝的方法

预剪枝:预剪枝是在树的生长过程中就对其进行必要的剪枝,如限制树的最大深度、限制中间节点和叶节点所包含的最小样本量、限制生成的最多叶节点数量等。

后剪枝:树充分生长后再对其返工剪枝。

1.误差降低剪枝法(Reduced-Error Pruning, REP)

将某一非叶节点的 子孙节点删除,使其变为新的叶节点。新叶节点的类别确定是利用该节点剪枝前包含的所有叶节点投票,频数最高的类别作为新的类别。利用测试集的数据对比剪枝前后的误判样本量,如果新树的误判样本量少于老树,则可以剪枝,否则不可剪枝。重复此步骤直到达到最大的预测准确率。由于使用测试集,该方法可能导致剪枝过度。

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_20


3.代价复杂度剪枝法(Cost-Complexity Pruning, CCP)

剪枝的代价是误判率会上升,但同时树的复杂度会减少,代价复杂度剪枝法引入了一个系数α来平衡代价和复杂度。

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_21


Nleaf为叶子节点个数

决策树的优缺点

优点:

简单直观,生成的决策树很直观。
基本不需要预处理,不需要提前归一化和处理缺失值。
使用决策树预测的代价是O(log2m)。m为样本数。
既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
可以处理多维度输出的分类问题。
相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以很好解释。
可以交叉验证的剪枝来选择模型,从而提高泛化能力。
对于异常点的容错能力好,健壮性高。
缺点:

决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
决策树会因为样本发生一点的改动,导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
寻找最优的决策树是一个NP难题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习的方法来改善。
有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

集成学习树
有两个流派
bagging流派
1.对原始数据集进行采样,每轮从原始样本集中使用Bootstraping的方法(有放回的采样)抽取n个训练样本,若进行K轮,得到K个训练集,训练K个模型(模型之间相互独立)
(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
2.对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
boosting流派
主要思想是将弱分类器组装成一个强分类器
引入了权值的概念,即采样时的每个样本都有权值,每个模型也都有权值
1.在每一轮如何改变训练数据的权值或概率分布?
答:通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。因为提高了上一轮分错的样本,则上轮分错的样本在本轮有更大的概率被重新分类
2.通过什么方式来组合弱分类器?
答:通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。
而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

boosting概率上的效果证明这里略去,只引出一个结论,不断地迭代更新能使得最终的结果无限接近最优分类,不过boosting会倾向于一直分错的样本,如果样本中有离群的错误样本(异常值),boosting就会出现效果不好的情况。

Bagging和Boosting的区别:
1.样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

2.样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

3.预测函数权重:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

4.并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

梯度下降法
1、批量梯度下降(Batch Gradient Descent,BGD):
批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新
优点:
  (1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。
  (2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
缺点:
  (1)当样本数目很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
  从迭代的次数上来看,BGD迭代的次数相对较少。
  
2、随机梯度下降(Stochastic Gradient Descent,SGD):
随机梯度下降法不同于批量梯度下降,随机梯度下降是每次迭代使用一个样本来对参数进行更新。使得训练速度加快
  优点:
  (1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
  缺点:
  (1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
  (2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
  (3)不易于并行实现。
  
3、小批量梯度下降(Mini-Batch Gradient Descent, MBGD):
小批量梯度下降,是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代 使用 ** batch_size** 个样本来对参数进行更新
优点:
  (1)通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
  (2)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(比如上例中的30W,设置batch_size=100时,需要迭代3000次,远小于SGD的30W次)
  (3)可实现并行化。
  缺点:
  (1)batch_size的不当选择可能会带来一些问题。

batcha_size的选择带来的影响:

(1)在合理地范围内,增大batch_size的好处:
    a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
    b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
    c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
  (2)盲目增大batch_size的坏处:
    a. 内存利用率提高了,但是内存容量可能撑不住了。
    b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
    c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
地址:https://www.cnblogs.com/bnuvincent/p/11183206.html
RF(随机森林)
它有两层随机,1.每轮从原始数据集中有放回的选取n个样本
2.每个训练集生成cart树时,特征的选取是随机的,随机的从所有特征中选择一部分特征,从部分特征中选择最佳的那个特征作为切分点。
  
每棵树的按照如下规则生成:
  1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;
从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。

为什么要随机抽样训练集?(add @2016.05.28)
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;

为什么要有放回地抽样?(add @2016.05.28)
我理解的是这样的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。

2)如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;

3)每棵树都尽最大程度的生长,并且没有剪枝过程。

一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
随机森林分类效果(错误率)与两个因素有关
森林中任意两棵树的相关性:相关性越大,错误率越大;
森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
  减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

如果不放回抽样,每棵树用的样本完全不同,结果是有偏的,基学习器之间的相似性小,投票结果差,模型偏差大

如果不抽样,基学习器用所有样本,那么模型的泛化能力弱,基学习器之前相似性太大差异性太小,模型的偏差大

为什么不随机抽样? 自助采样首先可以产生一部分袋外样本,可以用来做袋外估计,另一方自助采样一定程度上改变了每个基学习器的所用数据的样本分布,一定程度上引入了噪音,增加了模型的泛化能力

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_22

GBDT(梯度提升树)
1.gbdt 的算法的流程?
首先gbdt 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。
gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度
弱分类器一般会选择为cart tree(也就是分类回归树)。由于上述高偏差和简单的要求 每个分类回归树的深度不会很深。最终的总分类器 是将每轮训练得到的弱分类器加权求和得到的

损失函数:如果我们选择平方损失函数,那么这个差值其实就是我们平常所说的残差。
其实我们真正关注的,1.是希望损失函数能够不断的减小,2.是希望损失函数能够尽可能快的减小。所以如何尽可能快的减小呢?
让损失函数沿着梯度方向的下降。这个就是gbdt 的 gb的核心了。 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。gbdt 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。

2.gbdt如何选择特征?
gbdt选择特征的细节其实是想问你CART Tree生成的过程
CART Tree 生成的过程其实就是一个选择特征的过程,假设我们目前总共有 M 个特征。第一步我们需要从中选择出一个特征 j,做为二叉树的第一个节点。然后对特征 j 的值选择一个切分点 m,一个样本的特征j的值 如果小于m,则分为一类,如果大于m,则分为另外一类。如此便构建了CART 树的一个节点。其他节点的生成过程和这个是一样的。现在的问题是在每轮迭代的时候,如何选择这个特征 j,以及如何选择特征 j 的切分点 m:

原始的gbdt的做法非常的暴力,首先遍历每个特征,然后对每个特征遍历它所有可能的切分点,找到最优特征 m 的最优切分点 j

我们先遍历训练样本的所有的特征,对于特征 j,我们遍历特征 j 所有特征值的切分点 c。找到可以让下面这个式子最小的特征 j 以及切分点c.

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_23


举个例子:

gbdt 无论用于分类还是回归一直都是使用的CART 回归树,因为GBDT的每轮训练在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的。残差相减是有意义的。如果是两个分类类别,类别相减没有意义。

gbdt 多分类:我们在训练的时候,是针对样本 X 每个可能的类都训练一个分类回归树

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_24


这是一个有6个样本的三分类问题,我们用一个三维向量来标志样本的label。[1,0,0] 表示样本属于山鸢尾,[0,1,0] 表示样本属于杂色鸢尾,[0,0,1] 表示属于维吉尼亚鸢尾。

gbdt 的多分类是针对每个类都独立训练一个 CART Tree。所以这里,我们将针对山鸢尾类别训练一个 CART Tree 1。杂色鸢尾训练一个 CART Tree 2 。维吉尼亚鸢尾训练一个CART Tree 3,这三个树相互独立。

我们以样本 1 为例。针对 CART Tree1 的训练样本是[5.1,3.5,1.4,0.2],label 是 1

最终输入到模型当中的为[5.1,3.5,1.4,0.2,1]

针对 CART Tree2最终输入到模型当中的为[5.1,3.5,1.4,0.2,0]

针对 CART Tree3最终输入到模型当中的为[5.1,3.5,1.4,0.2,0]

下面我们来看 CART Tree1 是如何生成的,其他树 CART Tree2 , CART Tree 3的生成方式是一样的。CART Tree1的生成过程是从这四个特征中找一个特征做为CART Tree1 的节点。比如花萼长度做为节点。6个样本当中花萼长度 大于5.1 cm的就是 A类,小于等于 5.1 cm 的是B类。生成的过程其实非常简单,

问题 1.是哪个特征最合适? 2.是这个特征的什么特征值作为切分点?

即使我们已经确定了花萼长度做为节点。花萼长度本身也有很多值。在这里我们的方式是遍历所有的可能性,找到一个最好的特征和它对应的最优特征值可以让当前式子的值最小。

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_23


我们以第一个特征的第一个特征值为例。R1 为所有样本中花萼长度小于 5.1 cm 的样本集合,R2 为所有样本当中花萼长度大于等于 5.1cm 的样本集合。所以 R1={2}(只有样本2小于5.1cm),R2={1,3,4,5,6}

KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_26


y1 为 R1 所有样本的label 的均值 1/1=1。y2 为 R2 所有样本的label 的均值 (1+0+0+0+0)/5=0.2 损失函数:(实际值-预测的样本均值)的平方和

下面便开始针对所有的样本计算这个式子的值

山鸢尾类型在特征1 的第一个特征值的损失值:

(1-0.2)^2 + (1-1)^2 + (0-0.2)2+(0-0.2)2+(0-0.2)^2 +(0-0.2)^2= 0.8

接着我们计算第一个特征的第二个特征值,计算方式同上

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_27


R1 为所有样本中 花萼长度小于 4.9 cm 的样本集合,R2 为所有样本当中 花萼长度大于等于 4.9 cm 的样本集合.所以 R1={},R2={1,2,3,4,5,6},y1 为 R1 所有样本的label 的均值 = 0。y2 为 R2 所有样本的label 的均值 (1+1+0+0+0+0)/6=0.3333

山鸢尾类型在特征1 的第二个特征值的损失值:

(1-0.333)^2+ (1-0.333)^2 + (0-0.333)2+(0-0.333)2+(0-0.333)^2 +(0-0.333)^2 = 2.244189. 这里的损失值大于 特征一的第一个特征值的损失值,所以我们不取这个特征的特征值。

这样我们可以遍历所有特征的所有特征值,找到让这个式子最小的特征以及其对应的特征值

一共有24种情况,4个特征*每个特征有6个特征值

在这里我们算出来让这个式子最小的特征花萼长度,特征值为5.1 cm。这个时候损失函数最小为 0.8。

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_28


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_29


KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_30

GBDT如何进行特征组合的

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_31


地址:

RF(随机森林)与GBDT之间的区别与联系
相同点:

都是由多棵树组成,最终的结果都是由多棵树一起决定。
RF和GBDT在使用CART树时,可以是分类树或者回归树。
不同点:
组成随机森林的树可以并行生成,而GBDT是串行生成
随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和
随机森林对异常值不敏感,而GBDT对异常值比较敏感
随机森林是减少模型的方差,而GBDT是减少模型的偏差
随机森林不需要进行特征归一化。而GBDT则需要进行特征归一化

XGBoost

XGBoost 高效地实现了GBDT算法并进行了算法和工程上的许多改进,XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致

1.1 XGBoost树的定义

先来举个例子,我们要预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分,如下图所示。

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_32


就这样,训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以小孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。爷爷的预测分数同理:-1 + (-0.9)= -1.9。具体如下图所示:

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_33


如果不考虑工程实现、解决问题上的一些差异,XGBoost与GBDT比较大的不同就是目标函数的定义。XGBoost的目标函数如下图所示:

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_34


其中:

红色箭头所指向的L 即为损失函数(比如平方损失函数:l(yi,yi)=(yi−yi)2)

红色方框所框起来的是正则项(包括L1正则、L2正则)

红色圆圈所圈起来的为常数项

对于f(x),XGBoost利用泰勒展开三项,做一个近似。f(x)表示的是其中一颗回归树。XGBoost的核心算法思想不难,基本就是:

不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。

当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数

最后只需要将每棵树对应的分数加起来就是该样本的预测值。

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_35


那接下来,我们如何选择每一轮加入什么 f 呢?答案是非常直接的,选取一个 f 来使得我们的目标函数尽量最大地降低。这里 f 可以使用泰勒展开公式近似。

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_36


实质是把样本分配到叶子结点会对应一个obj,优化过程就是obj优化。也就是分裂节点到叶子不同的组合,不同的组合对应不同obj,所有的优化围绕这个思想展开。到目前为止我们讨论了目标函数中的第一个部分:训练误差。接下来我们讨论目标函数的第二个部分:正则项,即如何定义树的复杂度。

1.2 正则项:树的复杂度

XGBoost对树的复杂度包含了两个部分:一个是树里面叶子节点的个数T

一个是树上叶子节点的得分w的L2模平方(对w进行L2正则化,相当于针对每个叶结点的得分增加L2平滑,目的是为了避免过拟合)

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_37


我们再来看一下XGBoost的目标函数(损失函数揭示训练误差 + 正则化定义复杂度):

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_38


正则化公式也就是目标函数的后半部分,对于上式而言,y′i是整个累加模型的输出,正则化项∑kΩ(ft)是则表示树的复杂度的函数,值越小复杂度越低,泛化能力越强

1.3 树该怎么长

一棵树的生成是由一个节点一分为二,然后不断分裂最终形成为整棵树。那么树怎么分裂的就成为了接下来我们要探讨的关键。对于一个叶子节点如何进行分裂,XGBoost作者在其原始论文中给出了一种分裂节点的方法:枚举所有不同树结构的贪心法

XGBoost使用了和CART回归树一样的想法,利用贪婪算法,遍历所有特征的所有特征划分点,不同的是使用的目标函数不一样。具体做法就是分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。从而继续分裂,形成一棵树,再形成一棵树,每次在上一次的预测基础上取最优进一步分裂/建树。
1.4 如何停止树的循环生成
凡是这种循环迭代的方式必定有停止条件,什么时候停止呢?简言之,设置树的最大深度、当样本权重和小于设定阈值时停止生长以防止过拟合。具体而言,则

当引入的分裂带来的增益小于设定阀值的时候,我们可以忽略掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思,阈值参数为(即正则项里叶子节点数T的系数);
当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,避免树太深导致学习局部样本,从而过拟合;
样本权重和小于设定阈值时则停止建树。什么意思呢,即涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样。大意就是一个叶子节点样本太少了,也终止同样是防止过拟合;
2. XGBoost与GBDT有什么不同
除了算法上与传统的GBDT有一些不同外,XGBoost还在工程实现上做了大量的优化。总的来说,两者之间的区别和联系可以总结成以下几个方面。

GBDT是机器学习算法,XGBoost是该算法的工程实现。
在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模 型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代 价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类 器,比如线性分类器。
传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机 森林相似的策略,支持对数据进行采样。
传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺 失值的处理策略。
3. 为什么XGBoost要用泰勒展开,优势在哪里?
XGBoost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了XGBoost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
地址:

1.xgboost相比传统gbdt有何不同?
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)

对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
2. xgboost为什么快?
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。借鉴了Random Forest的思想,sklearn里的gbm好像也有类似实现。
这一点借鉴的是随机森林,就是对特征属性抽样。行采样是对样本的数目采样
3. xgboost如何支持并行?
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
4. 随机森林是怎样改变决策树容易过拟合的问题的?
1)Boostrap从袋内有放回的抽取样本值
  2)每次随机抽取一定数量的特征(通常为sqr(n))。
  分类问题:采用Bagging投票的方式选择类别频次最高的
  回归问题:直接取每颗树结果的平均值。
5. XGBoost怎么给特征评分?
在训练的过程中,通过Gini指数选择分离点的特征,一个特征被选中的次数越多,那么该特征评分越高。
6. 怎么理解决策树、xgboost能处理缺失值?而有的模型(svm)对缺失值比较敏感
sklearn包里的算法代入数据不能有缺失值,而xgboost可以。不是xgboost对缺失值不敏感,而是它对缺失值有默认的处理方法。就是把缺失值分别放到左叶子节点和右叶子节点中,计算增益。哪个增益大就放到哪个叶子节点

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_39


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_40


7. 为什么XGBoost要用泰勒展开,优势在哪里?

XGBoost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得二阶倒数形式, 可以在不选定损失函数具体形式的情况下用于算法优化分析.本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了XGBoost的适用性。

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_41


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_42

8. XGBoost如何寻找最优特征?是有放回还是无放回的呢?
XGBoost在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性.。XGBoost利用梯度优化模型算法, 样本是不放回的(想象一个样本连续重复抽出,梯度来回踏步会不会高兴)。
XGBoost还提出了两种防止过拟合的方法:Shrinkage and Column Subsampling。Shrinkage方法就是在每次迭代中对树的每个叶子结点的分数乘上一个缩减权重η,这可以使得每一棵树的影响力不会太大,留下更大的空间给后面生成的树去优化模型。Column Subsampling类似于随机森林中的选取部分特征进行建树。其可分为两种,一种是按层随机采样,在对同一层内每个结点分裂之前,先随机选择一部分特征,然后只需要遍历这部分的特征,来确定最优的分割点。另一种是随机选择特征,则建树前随机选择一部分特征然后分裂就只遍历这些特征。一般情况下前者效果更好。
9. 请问GBDT和XGBoost的区别是什么?
XGBoost类似于GBDT的优化版,不论是精度还是效率上都有了提升。与GBDT相比,具体的优点有:
1.损失函数是用泰勒展式二项逼近,而不是像GBDT里的就是一阶导数;
2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性;
3.节点分裂的方式不同,GBDT是用的基尼系数,XGBoost是经过优化推导后的。

xgboost选择某个特征的分裂点位的方法有两种,一种是全局扫描法,另一种是候选分位点法。

全局扫描法将所有样本该特征的取值按从小到大排列,将所有可能的分裂位置都试一遍,找到其中增益最大的那个分裂点,其计算复杂度和叶子节点上的样本特征不同的取值个数成正比。

而候选分位点法是一种近似算法,仅选择常数个(如256个)候选分裂位置,然后从候选分裂位置中找出最优的那个。
对于连续型特征值,当样本数量非常大,该特征取值过多时,遍历所有取值会花费很多时间,且容易过拟合。因此XGBoost思想是对特征进行分桶,即找到l个划分点,将位于相邻分位点之间的样本分在一个桶中。在遍历该特征的时候,只需要遍历各个分位点,从而计算最优划分。从算法伪代码中该流程还可以分为两种,全局的近似是在新生成一棵树之前就对各个特征计算分位点并划分样本,之后在每次分裂过程中都采用近似划分,而局部近似就是在具体的某一次分裂节点的过程中采用近似算法。

SVM(支持向量机)

数学原理

地址:https://zhuanlan.zhihu.com/p/31886934

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_43


SVM是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器

SVM还引入核函数,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的损失函数的最小化问题。SVM的学习算法就是求解凸二次规划的最优化算法。

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_44


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_45


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_46


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_47


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_48


KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_49


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_50


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_51


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_52


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_53


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_54


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_55


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_56


SVM面试

一、SVM 原理

SVM 是一种二分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面(间隔最大使它有别于普通的感知机)的线性分类器。

1).当训练样本线性可分时,通过几何间隔最大化,学习一个线性分类器,即线性可分支持向量机;

2).当训练数据近似线性可分时,引入松弛变量(放宽约束条件),通过软间隔最大化,学习一个线性分类器,即线性支持向量机;

3)当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。

以上各种情况下的数学推导应当掌握,硬间隔最大化(几何间隔)、学习的对偶问题、软间隔最大化(引入松弛变量)、非线性支持向量机(核技巧)。
二. SVM 为什么采用间隔最大化
当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强。
1 确定超平面及函数间隔
由空间上的平面公式确定超平面 wx+b = 0,且 |wx+b| 表示点 x 到平面上的距离。正类负例位于分割平面两侧,因此y(wx+b) 可同时表示分类正确性以及距离确信度。这也就是函数间隔,其被定义为训练集中所有点到超平面距离的最小值。
2 几何间隔
由于成比例地缩放w和b会使得 |wx+b| 跟着成比例缩放,因此,需要对法向量w加上约束,使得间隔是确定的,也就是函数间隔整体除以 ||w||,也就得到了几何间隔
3 间隔最大化(硬间隔)
分为硬间隔最大和软间隔最大
SVM的基本思想就是求解可以正确划分数据集并且几何间隔最大的分离超平面,其原因是线性可分超平面有无数个,但是间隔最大超平面是唯一的。
间隔最大化的意思就是以充分大的确信度对训练数据进行分类,也就是说,不仅将正负实例分开,同时对最难分的实例点(距离超平面最近的点)也有足够大的确信度将其分离。
4 支持向量
与超平面最近的点被称为支持向量,也就是使得原始问题约束项成立的点。
实际上离超平面很远的点已经被正确分类,我们让它离超平面更远并没有意义。反而我们最关心是那些离超平面很近的点,这些点很容易被误分类。如果我们可以让离超平面比较近的点尽可能的远离超平面,那么我们的分类效果会好有一些
三. SVM的目标
有两个目标:第一个是使间隔最大化,即W的模最小化,第二个是使样本正确分类
四. 为什么要将求解 SVM 的原始问题转换为其对偶问题
之所以说换为对偶问题更容易求解,其原因在于降低了算法的计算复杂度。在原问题下,算法的复杂度与样本维度相关,即等于权重w的维度,而在对偶问题下,算法复杂度与样本数量有关,即为拉格朗日算子的个数。
因此,如果你是做线性分类,且样本维度低于样本数量的话,在原问题下求解就好了,Liblinear之类的线性SVM默认都是这样做的;但如果你是做非线性分类,那就会涉及到升维(比如使用高斯核做核函数,其实是将样本升到无穷维),升维后的样本维度往往会远大于样本数量,此时显然在对偶问题下求解会更好。

另一方面,我们有分析过,只有在支持向量上的样本对应的拉格朗日算子λ才大于0,其余的λ都是=0,而转为对偶问题的计算对象仅有λ,所以大大降低了计算复杂度。
五. 为什么 SVM 要引入核函数
当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。而引入这样的映射后,所要求解的对偶问题的求解中,无需求解真正的映射函数,而只需要知道其核函数。核函数的定义:K(x,y)=<ϕ(x),ϕ(y)>,即在特征空间的内积等于它们在原始样本空间中通过核函数 K 计算的结果。一方面数据变成了高维空间中线性可分的数据,另一方面不需要求解具体的映射函数,只需要给定具体的核函数即可,这样使得求解的难度大大降低。
核函数的真正意义是做到了没有真正映射到高维空间却达到了映射的作用,即减少了大量的映射计算。
六、为什么SVM对缺失数据敏感
这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM 没有处理缺失值的策略。而 SVM 希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。
七、SVM 核函数之间的区别
一般选择线性核和高斯核,也就是线性核与 RBF 核。 线性核:主要用于线性可分的情形,参数少,速度快,对于一般数据,分类效果已经很理想了。 RBF 核:主要用于线性不可分的情形,参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。 如果 Feature 的数量很大,跟样本数量差不多,这时候选用线性核的 SVM。 如果 Feature 的数量比较小,样本数量一般,不算大也不算小,选用高斯核的 SVM。

利用专家先验知识选定核函数,例如已经知道问题是线性可分的,就可以使用线性核,不必选用非线性核。
如果特征的数量大到和样本数量差不多,则选用线性核函数SVM或LR。
如果特征的数量小,样本的数量正常,则选用高斯核函数SVM。
如果特征的数量小,样本数量很多,由于求解最优化问题的时候,目标函数涉及两两样本计算内积,使用高斯核明显计算量会大于线性核,所以手动添加一些特征,使得线性可分,然后可以用LR或者线性核的SVM;
利用交叉验证,试用不同的核函数,误差最小的即为效果最好的核函数。
混合核函数方法,将不同的核函数结合起来。

SVM对噪声敏感

少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:

增、删非支持向量样本对模型没有影响;

支持向量样本集具有一定的鲁棒性;

有些成功的应用中,SVM 方法对核的选取不敏感

但当噪声出现的过多,以及当噪声出现并成为支持向量时,那么噪声对模型对影响是巨大的。所以此时SVM对噪声不具备鲁棒性!以下两种情况会增大噪声成为支持向量的概率:

噪声数量太多

噪声以新的分布形式出现,与原先样本集的噪声分布表现的相当不同。此时噪声也有大概率落在最大分类间隔中间,从而成为支持向量,大大影响模型。

所以我们常说的鲁棒性其实是主要是体现在对Outlier(异常点、离群点)上。

SVM在大数据上有哪些缺陷

SVM的空间消耗主要是在存储训练样本和核矩阵,由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的及其内存和运算时间。如果数据量很大,SVM的训练时间就会比较长,所以SVM在大数据的使用中比较受限。

SVM参数C的选择

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_57


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_58


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_59


朴素贝叶斯

先验概率:

通过经验来判断事情发生的概率,比如说“贝叶死”的发病率是万分之一,就是先验概率。

后验概率:

后验概率就是发生结果之后,推测原因的概率。比如说某人查出来了患有“贝叶死”,那么患病的原因可能是 A、B 或 C。**患有“贝叶死”是因为原因 A 的概率就是后验概率。**它是属于条件概率的一种。

条件概率:

事件 A 在另外一个事件 B 已经发生条件下的发生概率,表示为 P(A|B)。比如原因 A 的条件下,患有“贝叶死”的概率,就是条件概率

朴素贝叶斯分类常用于文本分类,尤其是对于英文等语言来说,分类效果很好。它常用于垃圾文本过滤、情感预测、推荐系统等。

在所有机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法不同。如决策树、KNN、LR、SVM等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(x),要么是条件分布P(Y|X)。但朴素贝叶斯却是生成方法,也就是直接找出特征输出Y与特征X的联合分布p(x,y).然后用条件概率得出

1、 朴素贝叶斯与LR的区别?
朴素贝叶斯是生成模型,根据已有样本进行贝叶斯估计学习出先验概率P(Y)和条件概率P(X|Y),进而求出联合分布概率P(XY),最后利用贝叶斯定理求解P(Y|X),

面试的时候怎么回答朴素贝叶斯呢?
首先朴素贝斯是一个生成模型(很重要),其次它通过学习已知样本,计算出联合概率,再求条件概率。

而LR是判别模型,根据极大化对数似然函数直接求出条件概率P(Y|X);
朴素贝叶斯是基于很强的条件独立假设(在已知分类Y的条件下,各个特征变量取值是相互独立的),而LR则对此没有要求;
朴素贝叶斯适用于数据集少的情景,而LR适用于大规模数据集。

2、朴素贝叶斯“朴素”在哪里?
朴素贝叶斯做了一个很强的条件独立假设(当Y确定时,X的各个分量取值之间相互独立)
3、 在估计条件概率P(X|Y)时出现概率为0的情况怎么办?
简单来说:引入λ,当λ=1时称为拉普拉斯平滑。
贝叶斯算法的优缺点
优点:
    (1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
    (2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
    (3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
  缺点:
    (1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
    (2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
    (3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
    (4)对输入数据的表达形式很敏感。

PCA降维算法(主成分分析)

PCA 是为了降低特征的维度。在实际工作中,可能会遇到特征维数过多,且部分特征具有一定相关性。如:在一个学生成绩数据集中,一个特征是学习时长,另一个特征是成绩,一般来讲,学习时间越长,越容易取得好成绩,即时长与成绩呈正相关。因此没必要用两个维度(时长和成绩)表达这一特征。我们可以找出另一个维度,表现这两个特征,且不会带来过多信息损失。

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_60


如何 PCA

为了让高维度特征向低维度特征的映射更加精确,在上例中,我们需要找出一条使得所有的实例(entity)到坐标轴垂直距离(图中虚线部分)最短的一条坐标轴 Z。同时这条坐标轴也满足数据在其上散布最广

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_61


回到问题,我们想找出指定的 K 个维度(即把数据从高维降到K维),使数据在这 K 个维度上损失最少 -> 散布最广 。除了用方差衡量我们要取的坐标轴外,还应考虑数据在新维度上的散布不具有任何相关性,回到最开头的问题,在原始数据中,两个属性(学习时长和成绩)具有相关性,我们希望降维来去除这种相关性,这也是 PCA 的意义之一。

回顾上面的公式,协方差表示了向量间的相关性,协方差为 0,向量完全不相关,向量互相正交。

问题被转化成了,我们希望找出一组基向量(需要是标准正交基),数据在这组基向量构成的空间中表示时,任何两个属性间相关性为零。我们取出数据散布最广的前 K 个维度,就是我们希望求取的新坐标系(基向量),将原本的数据以新的基向量为参考系表示出来,就是数据压缩后的结果。

KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_62


把矩阵的每一项除以 entity 的个数 m,你会发现,这是一个实对称矩阵,对角线上的值是其方差,其他值对应两个属性之间的协方差

在数学中一个实对称矩阵有 3 个性质:

1 不同特征值对应的特征向量必然正交

2 k 重特征值必定对应 k 个线性无关的特征向量

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_63


PCA的主要思想是将N维高维特征映射到K维上,要求降维后数据损失最小,数据散步最广

原始数据中,具有相关性的特征,通过降维后希望去除这种相关性。

协方差表示了向量间的相关性,协方差为 0,向量完全不相关,向量互相正交。

问题转化为算计数据矩阵的协方差矩阵,得到协方差矩阵的特征值和特征向量

把特征值排序,选择特征值最大(即方差最大)的K个特征对应的特征向量组成的矩阵,将新的数据矩阵转换到新的空间中,实现数据特征的降维。SVD(奇异值分解)

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_64


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_65


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_66


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_67


DBSCAN算法(基于密度的聚类)

地址:https://www.jianshu.com/p/d2eddc733c4d

该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值。过滤低密度区域,发现稠密度样本点。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。

KNN算法在回归任务中使用 knn可以用于回归吗_迭代_68


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_69


DBSCAN算法流程:

1.初始,给定数据集D中所有对象都被标记为“未访问”,随机选择一个未被访问的对象p,

并检查p的ϵ-领域是否至少包含MinPts个对象。如果不是,则p被标记为噪声点。否则为p创建一个新的簇C,并且把p的ϵ-领域中所有对象都放在候选集合N中,迭代地把N中不属于其他簇的对象添加到C中,对应N中标记为“未访问”的对象 P’ ,DBSCAN把它标记为“已访问”,并且检查它的ϵ-领域,如果 P’ 的ϵ-领域至少包含MinPts个对象,则P’ 的ϵ-领域中的对象都被添加到N中。

DBSCAN继续添加对象到C,直到C不能扩展,即直到N为空。此时簇C完成生成,输出(就像传销一样)

为了找到下一个簇,DBSCAN从剩下的对象中随机选择一个未访问过的对象。聚类过程继续,直到所有对象都被访问。

还需考虑三个问题:

第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。DBSCAN算法很容易检测异常点。

    第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用KD树或者球树来快速的搜索最近邻。

    第三种问题,某些样本可能到两个核心对象的距离都小于ϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说BDSCAN的算法不是完全稳定的算法。

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_70


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_71


Kmeans算法

原文链接:

一.原理流程:

kmeans是无监督学习聚类算法

(1)在数据集中随机的选取K个初始点作为初始聚类中心(质心)(这里如何确定k将在下面给出解释)

(2)将数据集中的每个点分配到一个簇中,即为每个点找距离其最近的质心,并将其分配给之心所对应的簇

(3)簇分好后,计算每个簇所有点的平均值,将平均值作为对应簇新的质心

(4)循环2、3步骤,直到质心不变

二、K-means中常用的到中心距离的度量有哪些

KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_72


三、K-means中的k值如何选取

KNN算法在回归任务中使用 knn可以用于回归吗_特征值_73


KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_74


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_75


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_76


求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_77


可以看到,轮廓系数最大的k值是2,这表示我们的最佳聚类数为2。但是,值得注意的是,从k和SSE的手肘图可以看出,当k取2时,SSE还非常大,所以这是一个不太合理的聚类数,我们退而求其次,考虑轮廓系数第二大的k值4,这时候SSE已经处于一个较低的水平,因此最佳聚类系数应该取4而不是2。

但是,讲道理,k=2时轮廓系数最大,聚类效果应该非常好,那为什么SSE会这么大呢?在我看来,

原因在于轮廓系数考虑了分离度b,也就是样本与最近簇中所有样本的平均距离。为什么这么说,

因为从定义上看,轮廓系数大,不一定是凝聚度a(样本与同簇的其他样本的平均距离)小,而可

能是b和a都很大的情况下b相对a大得多,这么一来,a是有可能取得比较大的。a一大,样本与同

簇的其他样本的平均距离就大,簇的紧凑程度就弱,那么簇内样本离质心的距离也大,从而导致

SSE较大。所以,虽然轮廓系数引入了分离度b而限制了聚类划分的程度,但是同样会引来最优结果的SSE比较大的问题,这一点也是值得注意的。

KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_78


8、如何快速收敛数据量超大的K-means?

相关解释可以去这个博客稍做了解

9、K-means算法的优点和缺点是什么?

K-Means的主要优点:

(1)原理简单,容易实现

(2)可解释度较强

K-Means的主要缺点:
(1)K值很难确定
(2)局部最优
(3)对噪音和异常点敏感
(4)需样本存在均值(限定数据种类)
(5)聚类效果依赖于聚类中心的初始化
(6)对于非凸数据集或类别规模差异太大的数据效果不好

Kmeans++
K-means ++为K-means聚类选择初始簇质心
在某些情况下,如果簇的初始化不合适,K-means可能导致产生坏的簇。这就是K-means ++产生作用的地方。它指定了在使用标准K-means聚类算法向前推进之前初始化簇质心的过程。

使用K-means ++算法,我们优化了随机选择簇质心的步骤。在使用K-means ++初始化时,我们更有可能找到与最佳K-means解决方案竞争的解决方案。

使用K-means ++初始化质心的步骤是:

从我们想要聚类的数据点随机均匀地选择第一个簇。这类似于我们在K-means中所做的,但不是随机挑选所有质心,而是在这里选择一个质心

接下来,我们计算每个数据点到已经选择的簇的质心的距离(D(x))

然后,从数据点中选择新的簇质心,最大点到起其最近的质心的距离的平方对应的点为新的簇的质心

然后,我们重复步骤2和3,直到选择了k个簇

KNN算法在回归任务中使用 knn可以用于回归吗_KNN算法在回归任务中使用_79


KNN算法在回归任务中使用 knn可以用于回归吗_迭代_80


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_81


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_82


KNN算法在回归任务中使用 knn可以用于回归吗_特征值_83


KNN算法在回归任务中使用 knn可以用于回归吗_损失函数_84