python 机器学习(监督学习—监督学习算法)

本文介绍了监督学习的概念,并通过实例详细阐述了k近邻(k-NN)算法在二分类、回归问题中的应用,包括k近邻的决策边界、模型复杂度与泛化能力的关系,并探讨了k近邻算法的优缺点及关键参数。
摘要由CSDN通过智能技术生成

                                         监督学习—监督学习算法

 

一、一些样本数据集

    1、二分类数据集示例:forge 数据集。它有两个特征。

        下列代码绘制一个散点图,将此数据集的所有数据点可视化。图像以第一个特征为 x 轴,第二个特征为 y 轴。正如其他散点图那样,每个数据点对应图像中的一点。每个点的颜色和形状对应其类别(类别0:蓝色圆圈;类别1:橙色三角形):

            

            

            

        从 X.shape 可以看出,这个数据集包含 26 个数据点和 2 个特征。

    2、回归算法数据集示例:wave 数据集。

        wave 数据集只有一个输入特征和一个连续目标变量(或响应),后者是模型想要预测的对象。下面绘制的图像中单一特征位于 x 轴,回归目标(输出)位于 y 轴:

            wave 数据集的图像,x 轴表示特征,y 轴表示回归目标。

            

    3、分类数据集示例:威斯康星州乳腺癌数据集(简称 cancer)。里面记录了乳腺癌肿瘤的临床测量数据。

        每个肿瘤都被标记为 “良性”(benign,表示无害肿瘤)或 “恶性”(malignant,表示癌性肿瘤),其任务是基于人体组织的测量数据来学习预测肿瘤是否为恶性。

        可以用 scikit-learn 模块的 load_breast_cancer 函数来加载数据:

            

            (1) 里面记录了乳腺癌肿瘤的临床测量数据:

                

            (2) 这个数据集共包含 569 个数据点,每个数据点有 30 个特性:

                

            (3) 在 569 个数据点钟,212 个被标记为恶性,357 个被标记为良性:

                

                

                

            (4) feature_names 属性查看每个特征的语义说明:

                

            注意:包含在 scikit-learn 中的数据集通常被保存为 Bunch 对象,里面包含真实数据以及一些数据集信息。关于 Bunch 对象,我们只需要知道它与字典很相似,而且还有一个额外的好处,就是我们可以用点操作符来访问对象的值(比如用 bunch.key 来替代 bunch["key]")

    4、回归数据集示例:波士顿房价数据集示例。

        目标:利用犯罪率、是否邻近查尔斯河、公路可达性等信息,来预测 20 世纪 70 年代波士顿房屋价格的中位数。

        

        (1) 这个数据集包含 506 个数据点和 13 个特征:

            

        (2) 对于我们的目的而言,我们需要扩展这个数据集,输入不仅包括这 13 个测量结果,还包括这些特征之间的乘积(也叫交互项)。

            换句话说,我们不仅将犯罪率和公路可达性作为特征,还将犯罪率和公路可达性的乘积作为特征。

            特征工程(feature engineering):像这种包含导出特征的方法叫作特征工程(feature engineering)。

            

            最初的 13 个特征加上这 13 个特征两两组合(有放回)得到 91 个特征,一共 104 个特征。

            第 1 个特征可以与第 13 个特征相乘,第 2 个特征可以与第 12 个特征相乘(除了第 1 个),第 3 个特征可以与第 11 个特征相乘......依次相加,13 + 12 + 11 + ... + 1 = 91。

 

二、k 近邻

    k-NN 算法可以说是最简单的机器学习算法。构建模型只需要保存训练数据集即可。想要对新数据点做出预测,算法会在训练数据集中找到最近的数据点,也就是它的 “最近邻”。

    1、k 近邻分类

        (1) 单一最近邻:

            单一最近邻,也就是与我们想要预测的数据点最近的训练数据点。预测结果就是这个训练数据点的已知输出。

            示例,单一最近邻分类方法在 forge 数据集上的应用:

                

        (2) 任意个(k个)近邻模型:

            在考虑多于一个邻居的情况时,我们用 “投票法”(voting)来指定标签。也就是说,对于每个测试点,我们数一数多少个邻居属于类别 0,多少个邻居属于类别 1。然后将出现次数更多的类别(也就是 k 个近邻中占多数的类别)作为预测结果。

            示例,3 近邻模型对 forge 数据集的预测结果:

                

        (3) 通过 scikit-learn 来应用 k 近邻算法:

            

            可以看到,我们的模型精度约为 86%,也就是说,在测试数据集中,模型对其中 86% 的样本预测的类别都是正确的。

    2、分析 KNeighborsClassifier

        (1) 决策边界

            对于二维数据集,我们还可以在 xy 平面上画出所有可能的测试点的预测结果。我们根据平面中每个点所属的类别对平面进行着色。这样可以查看决策边界(decision boundary),即算法对类别 0 和类别 1 的分界线。

            分别将 1 个、3 个、9 个和  26 个邻居四种情况的决策边界可视化:

                

                

            a、使用单一邻居绘制的决策边界紧跟着训练数据;

            b、随着邻居个数越来越多,决策边界也越来越平滑;

            c、更平滑的边界对应更简单的模型;

            d、使用更少的邻居对应更高的模型复杂度,而使用更多的邻居对应更低的模型复杂度;

            e、考虑极端情况,即邻居个数等于训练集中所有数据点的个数,那么每个测试点的邻居完全相同(即所有训练点),所有预测结果也完全相同(即训练集中出现次数最多的类别);

        (2) 验证:模型复杂度和泛化能力之间的关系

            数据集:现实世界的乳腺癌数据集。先将数据集分成训练集和测试集,然后用不同的邻居个数对训练集和测试集的性能进行评估。

            以 n_neighbors 为自变量,对比训练集精度和测试集精度:

                

                

            a、图像的 x 轴是 n_neighbors,y 轴是训练集精度和测试集精度;

            b、仅考虑单一邻居时,训练集上的预测结果十分完美;

            c、随着邻居个数的增多,模型变得更简单,训练集精度也随之下降;

            d、单一邻居时的测试集精度比使用更多邻居时要低,这表示单一近邻的模型过于复杂;

            e、当考虑 10 个邻居时,模型又过于简单,性能甚至变得更差;

            f、最佳性能在中间的某处,邻居个数大约为 6;

            g、最差的性能约为 88% 的精度。

    3、k 近邻回归

        (1) 单一近邻回归

            

        (2) 多近邻回归

            

            

        (3) 通过 scikit-learn 的 KNeighborsRegressor 实现回归的 k 近邻算法

            

            a、对于回归问题,score 方法返回的是 R^{2} 分数;

            b、R^{2} 分数也叫作决定系数,是回归模型预测的优度度量,位于 0 到 1 之间;

            c、R^{2} 等于 1 对应完美预测,R^{2} 等于 0 对应常数模型。即总是预测训练集响应(y_train)的平均值;

            d、这里的分数是 0.83,表示模型的拟合度相对较好。

    4、分析 KNeighborsRegressor

        

        

       使用单一邻居,训练集中的每个点都对预测结果有显著影响,预测结果的图像经过所有数据点。这导致预测结果非常不稳定。

        考虑更多的邻居之后,预测结果变得更加平滑,但对训练数据的拟合也不好。

    5、优点、缺点和参数

        (1) 参数

            KNeighbors 分类器有两个重要参数:邻居个数、数据点之间距离的度量方法。

            a、在实践中,使用较小的的邻居个数(比如 3 个或 5 个)往往可以得到比较好的结果,但我们应该调节这个参数。

            b、有时需要根据需要选择合适的距离度量方法,这里默认使用欧式距离。

        (2) 优点

            a、模型很容易理解,通常不需要过多调节就可以得到不错的性能。

            b、构建最近邻模型的速度通常很快。

        (3) 缺点

            a、如果训练集很大(特征数很多或者样本数很大),预测速度可能会很慢。

            b、对于有很多特征(几百或更多)的数据集效果不好,对于大多数特征的大多数取值都为 0 的数据集(所谓的稀疏数据集)来说,这一算法的效果尤其不好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值