您的位置:首页 > 其它

机器学习—线性回归—初级算法梳理01

2019-04-02 14:25 1016 查看

1、机器学习的一些概念

1)有监督:从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测

结果。监督学习的训练集要求包括输入输出,也可以说是特征和目标。训练集中的目标是由人标注的。监督学习就

是最常见的分类(注意和聚类区分)问题,通过已有的训练样本(即已知数据及其对应的输出)去训练得到一个最

优模型(这个模型属于某个函数的集合,最优表示某个评价准则下是最佳的),再利用这个模型将所有的输入映射

为相应的输出,对输出进行简单的判断从而实现分类的目的。也就具有了对未知数据分类的能力。监督学习的目标

往往是让计算机去学习我们已经创建好的分类系统(模型)。

监督学习是训练神经网络和决策树的常见技术。这两种技术高度依赖事先确定的分类系统给出的信息,对于神经网

络,分类系统利用信息判断网络的错误,然后不断调整网络参数。对于决策树,分类系统用它来判断哪些属性提供

了最多的信息。

常见的有监督学习算法:回归分析和统计分类。最典型的算法是KNN和SVM。

有监督学习最常见的就是:regression&classification

**2)无监督: **输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化。通俗点将就是实际应用中,不少情况下无法预先知道样本的标签,也就是说没有训练样本对应的类别,因而只能从原先没有样本标签的样本集开始学习分类器设计。

非监督学习目标不是告诉计算机怎么做,而是让它(计算机)自己去学习怎样做事情。非监督学习有两种思路。第一种思路是在指导Agent时不为其指定明确分类,而是在成功时,采用某种形式的激励制度。需要注意的是,这类训练通常会置于决策问题的框架里,因为它的目标不是为了产生一个分类系统,而是做出最大回报的决定,这种思路很好的概括了现实世界,agent可以对正确的行为做出激励,而对错误行为做出惩罚。

无监督学习的方法分为两大类:

(1) 一类为基于概率密度函数估计的直接方法:指设法找到各类别在特征空间的分布参数,再进行分类。

(2) 另一类是称为基于样本间相似性度量的简洁聚类方法:其原理是设法定出不同类别的核心或初始内核,然后依据样本与核心之间的相似性度量将样本聚集成不同的类别。

利用聚类结果,可以提取数据集中隐藏信息,对未来数据进行分类和预测。应用于数据挖掘,模式识别,图像处理等。

PCA和很多deep learning算法都属于无监督学习。

**3)有监督与无监督的区别:**1. 有监督学习方法必须要有训练集与测试样本。在训练集中找规律,而对测试样本使用这种规律。而非监督学习没有训练集,只有一组数据,在该组数据集内寻找规律。

  1. 有监督学习的方法就是识别事物,识别的结果表现在给待识别数据加上了标签。因此训练样本集必须由带标签的样本组成。而非监督学习方法只有要分析的数据集的本身,预先没有什么标签。如果发现数据集呈现某种聚集性,则可按自然的聚集性分类,但不予以某种预先分类标签对上号为目的。
  2. 非监督学习方法在寻找数据集中的规律性,这种规律性并不一定要达到划分数据集的目的,也就是说不一定要“分类”。

这一点是比有监督学习方法的用途要广。 譬如分析一堆数据的主分量,或分析数据集有什么特点都可以归于非监督学习方法的范畴。

  1. 用非监督学习方法分析数据集的主分量与用K-L变换计算数据集的主分量又有区别。后者从方法上讲不是学习方法。因此用K-L变换找主分量不属于无监督学习方法,即方法上不是。而通过学习逐渐找到规律性这体现了学习方法这一点。在人工神经元网络中寻找主分量的方法属于无监督学习方法。

4)泛化能力: 学习方法的泛化能力是指由该方法学习到的模型对未知数据的预测能力。
现实中采用最多的方法是通过测试误差来评价学习方法的泛化能力。泛化误差反映了学习方法的泛化能力。

5)过拟合: 如果一味追求提高对训练数据的预测能力,所选模型的复杂度则往往会比真模型更高。这种现象称为过拟合。过拟合是指学习时选择的模型包含的参数过多,以致于出现这一模型对已知数据预测的很好,但对未知数据预测很差的现象。

判断方法: 一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。

常见原因:

(1)建模样本选取有误,如样本数量太少,选样方法错误,样本标签错误等,导致选取的样本数据不足以代表预定的分类规则;

(2)样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则;

(3)假设的模型无法合理存在,或者说是假设成立的条件实际并不成立;

(4)参数太多,模型复杂度过高;

(5)对于决策树模型,如果我们对于其生长没有合理的限制,其自由生长有可能使节点只包含单纯的事件数据(event)或非事件数据(no event),使其虽然可以完美匹配(拟合)训练数据,但是无法适应其他数据集。

解决方法:

(1)在神经网络模型中,可使用权值衰减的方法,即每次迭代过程中以某个小因子降低每个权值。

(2)选取合适的停止训练标准,使对机器的训练在合适的程度;

(3)保留验证数据集,对训练成果进行验证;

(4)获取额外数据进行交叉验证;

(5)正则化,即在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。

6)欠拟合:欠拟合是指模型拟合程度不高,数据距离拟合曲线较远,或指模型没有很好地捕捉到数据特征,不

能够很好地拟合数据。

解决方法:

(1) 增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;

(2) 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强;

(3) 减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数;

(4) 使用非线性模型,比如核SVM 、决策树、深度学习等模型;

(5) 调整模型的容量(capacity),通俗地,模型的容量是指其拟合各种函数的能力。

(6) 容量低的模型可能很难拟合训练集;使用集成学习方法,如Bagging ,将多个弱学习器Bagging。

7) 方差
方差在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是每个样本值与全体样本值的平均 2d978 数之差的平方值的平均数。

8)偏差
偏差又称为表观误差,是指个别测定值与测定的平均值之差,它可以用来衡量测定结果的精密度高低。在统计学中,偏差可以用于两个不同的概念,即有偏采样与有偏估计。一个有偏采样是对总样本集非平等采样,而一个有偏估计则是指高估或低估要估计的量。

9)交叉验证
如果给定的样本数据充足,进行模型选择的一种简单方法就是随机地将数据集切分成三部份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集。

交叉验证分为三种:

第一种是简单交叉验证,所谓的简单,是和其他交叉验证方法相对而言的。首先,我们随机的将样本数据分为两部分(比如: 70%的训练集,30%的测试集),然后用训练集来训练模型,在测试集上验证模型及参数。接着,我们再把样本打乱,重新选择训练集和测试集,继续训练数据和检验模型。最后我们选择损失函数评估最优的模型和参数。

第二种是S折交叉验证(S-Folder Cross Validation)。和第一种方法不同,S折交叉验证会把样本数据随机的分成S份,每次随机的选择S-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择S-1份来训练数据。若干轮(小于S)之后,选择损失函数评估最优的模型和参数。

第三种是留一交叉验证(Leave-one-out Cross Validation),它是第二种情况的特例,此时S等于样本数N,这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况,比如对于普通适中问题,N小于50时,我一般采用留一交叉验证。

2、线性回归的原理

线性回归(Linear Regression)是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或者一个平面或者更高维的超平面,使得预测值与真实值之间的误差最小化。

模型公式:

预测值和真实值之间都肯定存在差异\varepsilon,对于每个样本:
(2)
假设误差{\varepsilon _i}是独立同分布的,并且服从高斯分布。即:
(3)
将(2)代入(3)中,得到在已知参数w和数据w_i的情况下,预测值为y_i的条件概率:
(4)
将(4)连乘得到在已知参数w和数据x的情况下,预测值为y的条件概率,这个条件概率在数值上等于,likelihood(w|x,y),也就是在已知现有数据的条件下,w是真正参数的概率,即似然函数(5):
(5)
为什么要引入似然函数:为了根据样本估计参数值。

为什么要对似然函数进行log变换:由于乘法难解,通过对数可以将乘法转换为加法,简化计算。

对数似然函数:

得到目标函数:

为什么要让目标函数越小越好:似然函数表示样本成为真实的概率,似然函数越大越好,也就是目标函数在这里插入图片描述越小越好。

3、线性回归损失函数、代价函数、目标函数

损失函数(Loss Function )是定义在单个样本上的,算的是一个样本的误差。

代价函数(Cost Function )是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。

目标函数(Object Function)定义为:最终需要优化的函数。等于经验风险+结构风险(也就是Cost Function + 正则化项)。

关于目标函数和代价函数的区别还有一种通俗的区别:

目标函数是最大化或者最小化,而代价函数是最小化

结论:损失函数和代价函数是同一个东西,目标函数是一个与他们相关但更广的概念,对于目标函数来说在有约束条件下的最小化就是损失函数(loss function)

4、优化方法(梯度下降法、牛顿法、拟牛顿法等)

梯度下降法: 梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。梯度下降法的搜索迭代示意图如下图所示:

**牛顿法:**牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f (x)的泰勒级数的前面几项来寻找方程f (x) = 0的根。牛顿法最大的特点就在于它的收敛速度很快。

首先,选择一个接近函数 f (x)零点的 x0,计算相应的 f (x0) 和切线斜率f ’ (x0)(这里f ’ 表示函数 f 的导数)。然后我们计算穿过点(x0, f (x0)) 并且斜率为f '(x0)的直线和 x 轴的交点的x坐标,也就是求如下方程的解:

我们将新求得的点的 x 坐标命名为x1,通常x1会比x0更接近方程f (x) = 0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:

已经证明,如果f ’ 是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f ’ (x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

**拟牛顿法:**拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。

参考博客:https://www.geek-share.com/detail/2651303360.html

5、线性回归的评估指标

在学习线性回归的时候大多数教程会讲到RMSE,MSE(MAE提到的较少)这两个指标评价模型模型拟合的效果,当然MSE也就是模型的损失函数。

在分类模型中针对不同的数据我们可以用分类的准确度评价谁的模型效果较好,这两者的量纲是一致的,但是在回归中预测不同的实际场景,比如一个预测股市,一个预测房价,比较MSE或者RMSE就不能比较谁好谁坏;所以将预测结果转换为准确度,结果都在[0, 1]之间,针对不同问题的预测准确度,可以比较并来判断此模型更适合预测哪个问题。

6、sklearn参数详解

参数kernel
代表了svm的核函数,不同的核函数对最后的分类效果影响也比较大,其中precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵,

线性核函数:

多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。

高斯(RBF)核函数

采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。 因此,在选用核函数的时候,如果我们对我们的数据有一定的先验知识,就利用先验来选择符合数据分布的核函数;如果不知道的话,通常使用交叉验证的方法,来试用不同的核函数,误差最下的即为效果最好的核函数,或者也可以将多个核函数结合起来,形成混合核函数。

参数degree
该参数上文中也说的比较详细了,仅适用于poly,在实际应用中当数据量达到二十w以上,3层degree将会收敛的极其慢,不推荐使用。

参数gamma
这个值可能看官方文档不怎么看得懂,它是一个浮点数,作为三个核函数的参数,隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,。gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。

参数C
这个值官方文档说的比较明白了,就是在泛化能力和准确度间做取舍,一般来说不需要做修改,如果不需要强大的泛化能力,可减小C的值,即:C值越大,在测试集效果越好,但可能过拟合,C值越小,容忍错误的能力越强,在测试集上的效果越差。参数C和gamma是svm中两个非常重要的参数,对其值的调整直接决定了整个模型最终的好坏。

参数coef0
该参数默认值为0,是poly和sigmoid的核函数常数项,用于解决poly函数中当<x,y>值趋近,没有明显区分时,对于不同值之间差异的衡量问题,一般采用默认值0即可。在scikit-learn-svc-coef0-parameter-range这个问题中有比较详细的讲解。

参数probability
默认为False决定最后是否按概率输出每种可能的概率,但需注意最后的预测函数应改为clf.predict_proba,代码举例:

x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39]]
y=[1,1,2,2]
clf=svm.SVC(probability=True,kernel='poly', degree=2,gamma=0.1,coef0=1)
clf.fit(x,y)
print clf.predict_proba([10,15,13])

output:
[[ 0.62913274  0.37086726]]

参数shrinking
该参数默认为True,即采用启发式收缩方式,如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解,起到一个加速训练的效果。

参数tol
svm停止训练的误差精度,float参数 默认为1e^-3,精度达到该标准则停止训练。

参数cache_size
该参数很明显,就是设置svm在训练时允许的缓存大小,默认为200。

参数class_weight
字典类型或者‘balance’字符串,默认为None。 给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面指出的参数C.

x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39]]
y=[2,1,2,3]
clf=svm.SVC(probability=True,kernel='rbf', degree=2,gamma=0.1,decision_function_shape="ovr",class_weight={1:10})
clf.fit(x,y)
print clf.predict([10,15,13])
print clf.predict_proba([10,15,13])
print clf.decision_function([10,15,13])

output:
[2]
[[ 0.23039413  0.44680601  0.32279986]]
[[ 1.01201676  2.48798324 -0.5       ]]

如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。

参数verbose
是否启用详细输出。 此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。以上段代码为例,开启verbose后输出结果为:

output:

[LibSVM]*
optimization finished, #iter = 1
obj = -0.000139, rho = 2.133417
nSV = 2, nBSV = 0
Total nSV = 2
*
optimization finished, #iter = 1
obj = -0.000139, rho = 2.133417
nSV = 2, nBSV = 0
Total nSV = 2
*
optimization finished, #iter = 1
obj = -0.000139, rho = 2.133417
nSV = 2, nBSV = 0
Total nSV = 2
*
optimization finished, #iter = 1
obj = -0.000057, rho = 1.013360
nSV = 2, nBSV = 0
Total nSV = 2
*
optimization finished, #iter = 1
obj = -0.000021, rho = 1.432067
nSV = 2, nBSV = 0
Total nSV = 2
*
optimization finished, #iter = 1
obj = -0.000139, rho = -2.133417
nSV = 2, nBSV = 0
Total nSV = 2
[[ 0.62917149  0.37082851]]

参数max_iter
int参数 默认为-1,最大迭代次数,如果为-1,表示不限制

参数decision_function_shape
决策函数类型,在不同版本默认值不一样。如果最后预测函数使用clf.decision_function可以看到效果,输出结果为该类到对应超平面的距离。

a.一对多法(one-versus-rest,简称1-v-r SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。

OVR模式:
x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39]]
y=[1,1,2,3]
clf=svm.SVC(probability=True,kernel='rbf', degree=2,gamma=0.1,random_state=2,decision_function_shape="ovr")
clf.fit(x,y)
print clf.predict([10,15,13])
print clf.predict_proba([10,15,13])
print clf.decision_function([10,15,13])

output:
[1]
[[ 0.34890691  0.32548254  0.32561055]]
[[ 2.5   0.75 -0.25]]

OVO模式:
x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39]]
y=[1,1,2,3]
clf=svm.SVC(probability=True,kernel='rbf', degree=2,gamma=0.1,random_state=2,decision_function_shape="ovo")
clf.fit(x,y)
print clf.predict([10,15,13])
print clf.predict_proba([10,15,13])
print clf.decision_function([10,15,13])

output:
[1]
[[ 0.34890691  0.32548254  0.32561055]]
[[  5.74784310e-01   5.74784310e-01   1.42148466e-20]]

参数random_state
int型参数 默认为None, 伪随机数发生器的种子,在混洗数据时用于概率估计,没什么影响。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: