机器学习导论
机器学习的方法是基于数据产生的"模型"(model)的算法,也称"学习算法"(learning algorithm)。
包括有:
有监督学习(supervised learning)
无监督学习(unsupervised learning)
半监督学习(semi-supervised learning)
强化学习(reinforcement learning)
有监督学习
指对数据的若干特征与若干标签(类型)之间的关联性进行建模的过程; 只要模型被确定,就可以应用到新的未知数据上。
这类学习过程可以进一步分为「分类」(classification)任务和「回归」(regression)任务。
在分类任务中,标签都是离散值;
而在回归任务中,标签都是连续值。
无监督学习
指对不带任何标签的数据特征进行建模,通常被看成是一种“让数据自己介绍自己” 的过程。
这类模型包括「聚类」(clustering)任务和「降维」(dimensionality reduction)任务。
聚类算法可以将数据分成不同的组别,而降维算法追求用更简洁的方式表现数据。
半监督学习
另外,还有一种半监督学习(semi-supervised learning)方法,介于有监督学习和无监督学习之间。通常可以在数据不完整时使用。
强化学习
强化学习不同于监督学习,它将学习看作是试探评价过程,以"试错" 的方式进行学习,并与环境进行交互已获得奖惩指导行为,以其作为评价。
此时系统靠自身的状态和动作进行学习,从而改进行动方案以适应环境。
输入/输出空间、特征空间
在上面的场景中,每一杯酒称作一个「样本」,十杯酒组成一个样本集。
酒精浓度、颜色深度等信息称作「特征」。这十杯酒分布在一个「多维特征空间」中。
进入当前程序的“学习系统”的所有样本称作「输入」,并组成「输入空间」。
在学习过程中,所产生的随机变量的取值,称作「输出」,并组成「输出空间」。
在有监督学习过程中,当输出变量均为连续变量时,预测问题称为回归问题;当输出变量为有限个离散变量时,预测问题称为分类问题。
过拟合与欠拟合
当假设空间中含有不同复杂度的模型时,就要面临模型选择(model selection)的问题。
我们希望获得的是在新样本上能表现得很好的学习器。为了达到这个目的,我们应该从训练样本中尽可能学到适用于所有潜在样本的"普遍规律",
我们认为假设空间存在这种"真"模型,那么所选择的模型应该逼近真模型。
拟合度可简单理解为模型对于数据集背后客观规律的掌握程度,模型对于给定数据集如果拟合度较差,则对规律的捕捉不完全,用作分类和预测时可能准确率不高。
换句话说,当模型把训练样本学得太好了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本的普遍性质,这时候所选的模型的复杂度往往会比真模型更高,这样就会导致泛化性能下降。这种 现象称为过拟合(overfitting)。可以说,模型选择旨在避免过拟合并提高模型的预测能力。与过拟合相对的是欠拟合(underfitting),是指模型学习能力低下,导致对训练样本的一般性质尚未学好。
image.png
虚线:针对训练数据集计算出来的分数,即针对训练数据集拟合的准确性。
实线:针对交叉验证数据集计算出来的分数,即针对交叉验证数据集预测的准确性。
- 左图:一阶多项式,欠拟合;
◼ 训练数据集的准确性(虚线)和交叉验证数据集的准确性(实线)靠得很近,总体水平比较高。
◼ 随着训练数据集的增加,交叉验证数据集的准确性(实线)逐渐增大,逐渐和训练数据集的准确性
(虚线)靠近,但其总体水平比较低,收敛在 0.88 左右。
◼ 训练数据集的准确性也比较低,收敛在 0.90 左右。
◼ 当发生高偏差时,增加训练样本数量不会对算法准确性有较大的改善。 - 中图:三阶多项式,较好地拟合了数据集;
◼ 训练数据集的准确性(虚线)和交叉验证数据集的准确性(实线)靠得很近,总体水平比较高。 - 右图:十阶多项式,过拟合。
◼ 随着训练数据集的增加,交叉验证数据集的准确性(实线)也在增加,逐渐和训练数据集的准确性
(虚线)靠近,但两者之间的间隙比较大。
◼ 训练数据集的准确性很高,收敛在 0.95 左右。
◼ 交叉验证数据集的准确性值却较低,最终收敛在 0.91 左右。
从图中我们可以看出,对于复杂数据,低阶多项式往往是欠拟合的状态,而高阶多项式则过分捕捉噪声数据的分布规律,而噪声之所以称为噪声,是因为其分布毫无规律可言,或者其分布毫无价值,因此就算高阶多项式在当前训练集上拟合度很高,但其捕捉到的无用规律无法推广到新的数据集上。因此该模型在测试数据集上执行过程将会有很大误差,即模型训练误差很小,但泛化误差很大。
监督学习算法
1.KNN/K近邻算法
本质:
是通过距离判断两个样本是否相似,如果距离够近就认为他们足够相似属于同一类别。当然只对比一个样本是不够的,误差会很大,我们需要找到离其最近的 k 个样本,并将这些样本称之 为「近邻」(nearest neighbor)。对这 k 个近邻,查看它们的都属于何种类别(这些类别我们称作「标
签」 (labels))。然后根据“少数服从多数,一点算一票”原则进行判断,数量最多的的标签类别就是新样本的标签类别。
其中涉及到的原理是“越相近越相似”,这也是KNN的基本假设。
实现过程
1.假设 X_test 待标记的数据样本,X_train 为已标记的数据集。
2.遍历已标记数据集中所有的样本,计算每个样本与待标记点的距离,并把距离保存在 Distance 数组中。
3.对 Distance 数组进行排序,取距离最近的 k 个点,记为 X_knn. 在 X_knn 中统计每个类别的个数,即 class0 在 X_knn 中有几个样本,class1 在 X_knn 中有几个样本等。
4.待标记样本的类别,就是在 X_knn 中样本个数最多的那个类别。
距离的确定
该算法的「距离」在二维坐标轴就表示两点之间的距离,计算距离的公式有很多。
我们常用欧拉公式,即“欧氏距离”。回忆一下,一个平面直角坐标系上,如何计算两点之间的距离?一
个立体直角坐标系上,又如何计算两点之间的距离?
在 n 维空间中,有两个点 A 和 B,它们的坐标分别为:
则 A 和 B 两点之间的欧氏距离的基本计算公式如下:
而在我们的机器学习中,坐标轴上的值 , , ,…… 正是我们样本数据上的 n 个特征。
算法参数是 k,k 可以理解为标记数据周围几个数作为参考对象,参数选择需要根据数据来决定。
k 值越大,模型的偏差越大,对噪声数据越不敏感。
k 值很大时,可能造成模型欠拟合。
k 值越小,模型的方差就会越大。
但是 k 值太小,容易过拟合。
实现方式
1.python
2.scikit-learn
scikit-learn 自 2007 年发布以来,scikit-learn已经成为 Python 中重要的机器学习库了。scikit-learn,简称 sklearn, 支持了包括分类、回归、降维和聚类四大机器学习算法,以及特征提取、数据预处理和模型评估三大模块。 在工程应用中,用 Python 手写代码来从头实现一个算法的可能性非常低,这样不仅耗时耗力,还不一 定能够写出构架清晰,稳定性强的模型。更多情况下,是分析采集到的数据,根据数据特征选择适合的算法, 在工具包中调用算法,调整算法的参数,获取需要的信息,从而实现算法效率和效果之间的平衡。而 sklearn, 正是这样一个可以帮助我们高效实现算法应用的工具包。
选择最优K值
1.KNN 中的 k 是一个超参数,所谓“超参数”,就是需要人为输入,算法不能通过直接计算得出的参数。
2.KNN 中的 k 代表的是距离需要分类的测试点 x 最近的 k 个样本点,如果不输入这个值,那么算法中重要部分 “选出 k 个最近邻” 就无法实现。从 KNN 的原理中可见,是否能够确认合适的 k 值对算法有极大的影响。如果选择的 k 值较小,就相当于较小的邻域中的训练实例进行预测,这时候只有与输入实例较近的(相似的)训练实例才会对预测结果起作用,但缺点是预测结果会对近邻的实例点非常敏感。如果邻近的实例点恰好是噪声,预测就会出错。相反地,如果选择的 k 值较大,就相当于较大的邻域中的训练实例进行预测。这时与输入实例较远的 (不相似的)训练实例也会对预测起作用,使预测发生错误。因此,超参数 k 的选定是 KNN 的头号问题。
3.那我们怎样选择一个最佳的 k 呢?在这里我们要使用机器学习中的神器:参数学习曲线。参数学习曲线是一条以不同的参数取值为横坐标,不同参数取值下的模型结果为纵坐标的曲线,我们往往选择模型表现最佳点的参数取值作为这个参数的取值
但是这个时候会有个问题,如果随机划分的数据集变化的的话,得分最高的k值也会发生变化:
泛化能力
确定了 k 之后,我们还能够发现一件事:每次运行的时候学习曲线都在变化,模型的效果时好时坏, 这是为什么呢?实际上,这是由于「训练集」和「测试集」的划分不同造成的。模型每次都使用不同的训练集进行训练, 不同的测试集进行测试,自然也就会有不同的模型结果。在业务当中,我们的训练数据往往是已有的历史数据,但我们的测试数据却是新进入系统的一系列还没有标签的未知数据。我们的确追求模型的效果,但我们追求的是模型在未知数据集上的效果,在陌生数据集上表现优秀的能力被称为泛化能力,即我们追求的是模型的泛化能力。我们在进行学习算法前, 通常会将一个样本集分成训练集(training set)和测试集(testing set),其中训练集用于模型的学习或训练,而后测试集通常用于评估训练好的模型对于数据的预测性能评估。训练误差(training error)代表模型在训练集上的错分样本比率。测试误差(empirical error)是模型在测试集上的错分样本比率。训练误差的大小,用来判断给定问题是不是一个容易学习的问题。 测试误差则反映了模型对未知数据的预测能力,测试误差小的学习方法具有很好的预测能力,如果得到的训练集和测试集的数据没有交集,通常将此预测能力称为泛化能力(generalization ability)。 我们认为,如果模型在一套训练集和数据集上表现优秀,那说明不了问题,只有在众多不同的训练集和 测试集上都表现优秀,模型才是一个稳定的模型,模型才具有真正意义上的泛化能力。为此,机器学习领域有发挥神作用的技能:「交叉验证」,来帮助我们认识模型。
K 折交叉验证
最常用的交叉验证是** k 折交叉验证**。我们知道训练集和测试集的划分会干扰模型的结果,因此用交叉验证 n 次的结果求出的均值,是对模型效果的一个更好的度量。
带交叉验证的学习曲线
对于带交叉验证的学习曲线,我们需要观察的就不仅仅是最高的准确率了,而是准确率高且方差还相对较小的点,这样的点泛化能力才是最强的。在交叉验证+学习曲线的作用下,我们选出的超参数能够保证更好的泛化能力。
是否需要验证集
最标准,最严谨的交叉验证应该有三组数据:训练集、验证集和测试集。 当我们获取一组数据后:
先将数据集分成整体的训练集和测试集。然后我们把训练集放入交叉验证中。从训练集中分割更小的训练集(k-1 份)和验证集(1 份)。
返回的交叉验证结果其实是验证集上的结果。使用验证集寻找最佳参数,确认一个我们认为泛化能力最佳的模型。将这个模型使用在测试集上,观察模型的表现。通常来说,我们认为经过验证集找出最终参数后的模型的泛化能力是增强了的,因此模型在未知数据(测试集)上的效果会更好,但尴尬的是,模型经过交叉验证在验证集上的调参之后,在测试集上的结果没有变好的情况时有发生。
原因其实是:我们自己分的训练集和测试集,会影响模型的效果。交叉验证后的模型的泛化能力增强了,表示它在未知数据集上方差更小,平均水平更高,但却无法保证它在现在分出来的测试集上预测能力最强。如此说来,是否有测试集的存在,其实意义不大了。如果我们相信交叉验证的调整结果是增强了模型的泛化能力的,那即便测试集上的测试结果并没有变 好(甚至变坏了),我们也认为模型是成功的。 如果我们不相信交叉验证的调整结果能够增强模型的泛化能力,而一定要依赖测试集来进行判断,我们完全没有进行交叉验证的必要,直接用测试集上的结果来跑学习曲线就好了。 所以,究竟是否需要验证集,其实是存在争议的,在严谨的情况下,大家还是使用有验证集的方式。
归一化
什么是归一化?我们把 X 放到数据框中来看一眼,你是否观察到,每个特征的均值差异很大?有的特征数值很大,有的特征数值很小,这种现象在机器学习中被称为"量纲不统一"。KNN 是距离类模型,欧氏距离的计算公式中存在着特征上的平方和:
image.png
如果某个特征 的取值非常大,其他特征的取值和它比起来就不算什么,那么距离的大小很大程度都会由这个 来决定,其他的特征之间的距离可能就无法对d(A,B)的大小产生什么影响,这种现象会让KNN这样的距离类模型的效果大打折扣。然而在实际分析情景当中,绝大多数数据集都会存在各特征值量纲不同的情况,此时若要使用 KNN 分类器,则需要先对数据集进行归一化处理,即是将所有的数据压缩都同一个范围内。当数据(x)按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就称作数据归一化(Normalization,又称 Min-Max Scaling)。
image.png
但直接在全数据集 X 上进行了归一化,然后放入交叉验证绘制学习曲线,这种做法是错误的。
真正正确的方式是,先分训练集和测试集,再归一化!为什么?想想看归一化的处理手段,我们是使用数据中的最小值和极差在对数据进行压缩处理,如果我们在全数据集上进行归一化,那最小值和极差的选取是会参考测试集中的数据的状况的。因此,当我们归一化后,无论我们如何分割数据,都会由一部分测试集的信息被“泄露”给训练集,这会使得我们的模型效果被高估。在现实业务中,我们只知道训练集的数据,不了解测试集究竟会长什么样,所以我们要利用训练集上的最小值和极差来归一化测试集。
距离的惩罚
最近邻点距离远近修正在对未知分类过程中, “一点一票” 的规则是 KNN 模型优化的一个重要步骤。 也就是说,对于原始分类模型而言,在选取最近的 k 个元素之后,将参考这些点的所属类别,并对其进行简单计数,而在计数的过程中这些点 “一点一票” ,这些点每个点对分类目标点的分类过程中影响效力相同。
但这实际上是不公平的,就算是最近邻的 k 个点,每个点的分类目标点的距离仍然有远近之别,而近的点往往和目标分类点有更大的可能性属于同一类别( 该假设也是 KNN 分类模型的基本假设) 。关于惩罚因子的选取有很多种方法, 最常用的就是根据每个最近邻 𝑥= 距离的不同对其作加权, 加权方法为设置 权重,该权重计算公式为 image.png
这里需要注意的是,关于模型的优化方法只是在理论上而言进行优化会提升模型判别效力,但实际应用过程中最终能否发挥作用,本质上还是取决于优化方法和实际数据情况的契合程度,如果数据本身存在大量异常值点,则采用距离远近作为惩罚因子则会有较好的效果,反之则不然。因此在实际我们进行模型优化的过程当中,是否起到优化效果还是要以最终模型运行结果为准。在sklearn中,我们可以通过参数 weights 来控制是否适用距离作为惩罚因子。
2.决策树
树模型是有监督学习类算法中应用广泛的一类模型,同时可应用于分类问题和回归问题,其中用于解决分类问题的树模型常被称为分类树,而用于解决回归类问题的树模型被称作回归树。树模型通过递归式切割的方法来寻找最佳分类标准,进而最终形成规则。
其算法原理虽然简单,但模型本身适用面极广,且在分类问题和回归问题上均有良好的表现,外加使用简单,无需人为进行过多变量调整和数据预处理,同时生成规则清晰,模型本身可解释性非常强,因此在各个行业均有广泛应用。
决策树(Decision Tree)是一种实现分治策略的层次数据结构。它是一种有效的非参数学习方法,并可以用于分类和回归。我们主要讨论分类的决策树。
分类决策树模型表示一种基于特征对实例进行分类的树形结构(包括二叉树和多叉树)。
决策树由节点(node)和有向边(directed edge)组成,树中包含三种节点:
- 根节点(root node):包含样本全集。没有入边,但有零条或多条出边;
- 内部节点(internal node):对应于属性测试条件,恰有一条入边,和两条或多条出边;
- 叶节点(leaf node)或终节点(terminal node):对应于决策结果,恰有一条入边,但没有出边。
决策树基本流程
从根节点到每个叶子节点的路径对应了一个判定测试序列,其基本流程遵循简单且直观的 "分而治之" 策略。由此,局部区域通过少数几步递归分裂确定,每个决策节点实现一个具有离散输出的属性测试函数,标记分支。
假设给定训练数据集输入:
在每个节点应用一个测试,并根据测试的输出确定一个分支。这一过程从根节点开始,并递归地重复,直至到达一个叶子节点,这时,该leaf的值形成输出。
决策与条件概率分布
决策树可以表示为给定决策节点下类的条件概率分布,这一条件概率分布定义在特征空间的一个划分上。每个将空间划分成较小区域,在从根节点沿一条路径向下时,这些较小的区域被进一步划分,并在每个区域定义一个类的概率分布就构成了一个条件概率分布。
假设 X 是表示特征的随机变量,Y 是表示类的随机变量,则条件概率分布可表示为 P(Y|X)。 X 取值于给定划分条件下的区域的集合,Y 取值于类的集合。各叶节点(区域)上的条件概率往往会偏向某一个类,即属于某一类的概率较大。决策树在分类时会将该节点的实例强行分到条件概率大的那一类去。
image.png
左图表示了特征空间的一个划分,假定现在只有 和 两个决策节点,特征空间被决策节点沿轴划分,并且相继划分相互正交。 每个小矩形表示一个区域,特征空间划分上的区域构成了一个集合,X 取值为区域的集合。我们在这里 假设只有两类,即 Y 的取值为 ”□“ 和”○”。 当某个区域 c 的条件概率分布满足 P(Y=○|X=c) > 0.5 时,则 认为这个区域属于○类,即落在这个区域的实例都将被视为该类。右图为对应于条件概率分布的决策树。 如果输入维是 是离散的,取 n 个可能的值之一,则该决策节点检查的值,并取相应分支,实现一 个 n 路划分。因此,如果决策节点具有离散分支,数值输入应当离散化。
如果 是连续型数值,则测试比较:
image.png
其中Wm是适当选择的阈值。该决策节点将输入空间一分为二:
Lm={Y|xN>=Wm}和Rm={Y|xN<wm},称作一个二元划分(binary split)。从根节点到叶节点的路径上的相继决策节点使用其他属性进一步把它们一分为二,产生相互正交的划分。
从图中可以看出,第一次划分后,Rm={Y|x1<w10}已经是纯的,所以不需要再划分。
学习算法
决策树学习本质上是从训练数据集中归纳出一组分类规则,也称为 "树归纳"。
对于给定的训练数据集,存在许多对它无错编码的树。而为了简单起见,我们感兴趣的是从中选出 "最 小" 的树,这里的树的大小用树的节点数和决策节点的复杂性度量。从另一个角度看,决策树学习是由训练数据集估计条件概率模型。基于特征空间划分的类的条件概率模型有无数个,我们选择的模型应该是不仅能对训练数据有很好的拟合,而且对未知数据也有很好的预测。
树的学习算法从包含全部训练数据的根开始,每一步都选择最佳划分。依赖于所选择的属性是数值属性还是离散属性,每次将数据划分为两个或 n 个子集,然后使用对应的子集递归地进行划分,直到所有训练数据子集被基本正确分类,或者没有合适的特征为止,此时,创建一个树叶节点并标记它,这就生成了一颗决策树。
综上,决策树学习算法包含特征选择、决策树的生成与决策树的剪枝。由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。其中决策树的生成只考虑局部最优,相对地,决策树的剪枝则考虑全局最优。
特征选择:香农熵和信息增益
决策树学习的关键在如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别, 即节点的 "纯度" (purity)越来越高。在分类树中,划分的优劣用不纯度度量(impurity-measure)定量分析。
image.png
image.png
image.png
划分数据集
分类算法除了需要测量信息熵,还需要划分数据集。
在知道如何得到熵之后,我们就可以按照获取最大信息增益的方法来判断是否正确地划分了数据集。 我们将对每个特征划分数据集的结果计算一次信息熵,以便判断按照哪个特征划分数据集是最好的划分方式。
决策树生成
目前我们已经学习了从数据集构造决策树算法所需要的子功能模块,其工作原理如下:
得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分。
第一次划分之后,数据集被向下传递到树的分支的下一个节点。在新的节点上,我们可以再次划分数据,因此我们可以采用递归的原则处理数据集。
递归约束的条件是:
- 程序遍历完所有划分数据集的属性
- 每个分支下的所有实例都具有相同的分类
- 当前节点包含的样本集合为空,不能划分
在第 2 种情形下,我们把当前节点标记为叶节点,并将其类别设定为该节点所含样本最多的类别,任何到达叶节点的数据必然属于叶节点的分类;
在第 3 种情形下,同样把当前节点标记为叶节点,但将其类别设定为其父节点所含样本最多的类别。
ID3算法
ID3 算法原型见于 J.R Quinlan 的博士论文,是基础理论较为完善,使用较为广泛的决策树模型,在此基础上 J.R Quinlan 进行优化后,陆续推出了 C4.5 和 C5.0 决策树算法,我们先从 ID3 开始,再讨论如何从 ID3 逐渐优化至 C4.5。
ID3 算法的核心是在决策树各个节点应用信息增益准则选择特征,递归地构建决策树。具体方法是:
- 从根节点开始,对节点计算所有可能的特征的信息增益。
- 选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点。
- 再对子节点调用以上方法,构建决策树。
- 直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一颗决策树。
决策树的算法评价
优点
- 易于理解和解释,因为树木可以画出来被看见。
- 需要很少的数据准备。其他很多算法通常都需要数据规范化,需要创建虚拟变量并删除空值等。但请
注意,sklearn 中的决策树模块不支持对缺失值的处理。 - 使用树的成本(比如说,在预测数据的时候)是用于训练树的数据点的数量的对数,相比于其他算
法,这是一个很低的成本。 - 能够同时处理数字和分类数据,既可以做回归又可以做分类。其他技术通常专门用于分析仅具有一种
变量类型的数据集。 - 即使其假设在某种程度上违反了生成数据的真实模型,也能够表现良好。
缺点
- 使用决策树可能创建过于复杂的树,这些树不能很好地推广数据。这称为过度拟合。修剪,设置 叶节
点所需的最小样本数或设置树的最大深度等机制是避免此问题所必需的,而这些参数的整合和调整对 初
学者来说会比较晦涩。 - 决策树可能不稳定,数据中微小的变化可能导致生成完全不同的树,这个问题需要通过集成算法来解
决。 - 决策树的学习是基于贪婪算法,它靠优化局部最优(每个节点的最优)来试图达到整体的最优,但这
种做法不能保证返回全局最优决策树。这个问题也可以由集成算法来解决,在随机森林中,特征和样本
会在分枝过程中被随机采样。 - 如果标签中的某些类占主导地位,决策树学习者会创建偏向主导类的树。因此,建议在拟合决策树之
前平衡数据集。
3.线性回归算法
概述
在正式进入到回归分析的相关算法讨论之前,我们需要对有监督学习算法中的回归问题进行进一步的分析和理解。虽然回归问题和分类问题同属于有监督学习范畴,但实际上,回归问题要远比分类问题更加复杂。
首先是关于输出结果的对比,分类模型最终输出结果为离散变量,而离散变量本身包含信息量较少,其本身并不具备代数运算性质,因此其评价指标体系也较为简单,最常用的就是混淆矩阵以及ROC曲线。而回归问题最终输出的是连续变量,其本身不仅能够代数运算,且还具有更"精致"的方法,希望对事物运行的更底层原理进行挖掘。即回归问题的模型更加全面、完善的描绘了事物客观规律,从而能够得到更加细粒度的结论。因此,回归问题的模型往往更加复杂,建模所需要数据所提供的信息量也越多,进而在建模过程中可能遇到的问题也越多。
线性回归与机器学习
线性回归是解决回归类问题最常使用的算法模型,其算法思想和基本原理都是由多元统计分析发展而来,但在数据挖掘和机器学习领域中,也是不可多得的行之有效的算法模型。一方面,线性回归蕴藏的机器学习思想非常值得借鉴和学习,并且随着时间发展,在线性回归的基础上还诞生了许多功能强大的非线性模型。因此,我们在进行机器学习算法学习过程中,仍然需要对线性回归这个统计分析算法进行系统深入的学习。但这里需要说明的是,线性回归的建模思想有很多理解的角度,此处我们并不需要从统计学的角度来理解、掌握和应用线性回归算法,很多时候,利用机器学习的思维来理解线性回归,会是一种更好的理解方法,这也将是我们这部分内容讲解线性回归的切入角度。
核心逻辑
任何机器学习算法首先都有一个最底层的核心逻辑,当我们在利用机器学习思维理解线性回归的时候,首先也是要探究其底层逻辑。值得庆辛的是,虽然线性回归源于统计分析,但其算法底层逻辑和机器学习算法高度契合。在给定n个属性描绘的客观事物中,每个 都用于描绘某一次观测时事物在某个维度表现出来的数值属性值。当我们在建立机器学习模型捕捉事物运行的客观规律时,本质上是希望能够综合这些维度的属性值来描绘事物最终运行结果,而最简单的综合这些属性的方法就是对其进行加权求和汇总,这即是线性回归的方程式表达形式:
总结
多元线性回归,岭回归,Lasso三个算法,它们都是围绕着原始的线性回归进行的拓展和改进。其中岭回归和Lasso是为了解决多元线性回归中使用最小二乘法的各种限制,主要用途是消除多重共线性带来的影响并且做特征选择。除此之外,本章还定义了多重共线性和各种线性相关的概念,并为大家补充了一些线性代数知识。回归算法属于原理简单,但操作困难的机器学习算法,在实践和理论上都还有很长的路可以走。
4.逻辑回归算法
概述
分类技术是机器学习和数据挖掘应用中的重要组成部分。在数据科学中, 约70%的问题属于分类问题。解决分类的算法也有很多种。 如:KNN,使距离计算来实现分类;决策树,通过构建直观易懂的树来实现分类。这里我们要展开的是Logistic回归,它是一种很常见的用来解决二元分类问题的回归方法,它主要是通过寻找最优参数来正确地分类原始数据。
基本原理
逻辑回归(Logistic Regression,简称LR),其实是一个很有误导性的概念,虽然它的名字中带有"回 归"两个字,但是它最擅长处理的却是分类问题。LR分类器适用于各项广义上的分类任务,例如:评论信息的正负情感分析(二分类)、用户点击率(二分类)、用户违约信息预测(二分类)、垃圾邮件预测(二分类)、疾病预测(二分类)、用户等级分类(多分类)等场景。我们这里主要讨论的是二分类问题。
之前我们介绍了线性回归的算法基本原理、使用方法、在最小二乘法求最优解以及条件不满足的情况系原始算法的修正方法。但实际上,线性回归只是机器学习类算法中最简单的用特征预测标签数值的回归算法,满足线性规律的真实场景并不是很多,因此标准线性回归应用面有限。为了解决该问题,线性回归在实际应用中引入了诸多变化形式。
无监督学习算法
K-Means算法
基本原理
关键概念:簇和质心
KMeans 算法将一组 N 个样本的特征矩阵 X 划分为 K 个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。
簇中所有数据的均值通常被称为这个簇的“质心”(centroids)。在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。
在 KMeans 算法中,簇的个数 K 是一个超参数,需要我们人为输入来确定。KMeans 的核心任务就是根据我们设定好的 K,找出 K 个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。
具体过程可以总结如下:
- 创建 k 个点作为初始质心(通常是随机选择)
- 当任意一个点的簇分配结果发生改变时:
◼ 计算质心与数据点之间的距离
◼ 将数据点分配到据其最近的簇 - 对每个簇,计算簇中所有点的均值并将均值作为新的质心
- 直到簇不再发生变化或者达到最大迭代次数
那什么情况下,质心的位置会不再变化呢?
当我们找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了。
这个过程在可以由下图来显示,我们规定,将数据分为4簇(K=4),其中白色X代表质心的位置:
image.png
在数据集下多次迭代(iteration),就会有: image.png
第六次迭代之后,基本上质心的位置就不再改变了,生成的簇也变得稳定。此时我们的聚类就完成了,我们可以明显看出,K-Means按照数据的分布,将数据聚集成了我们规定的4类,接下来我们就可以按照我们的业务需求或者算法需求,对这四类数据进行不同的处理。
网友评论