【零基础必备】监督学习之K近邻算法三元预测分类

简介: 【零基础必备】监督学习之K近邻算法三元预测分类

数据准备

鸢尾花数据附带在Python scikit-learn 的 datasets 模块中,我们只需要调用这个数据即可,用于打开机器学习的大门。

load_iris 返回的 iris 对象是一个 Bunch 对象,与字典非常相似,里面包含键和值:

我们如何区分了,看看下面这个例子:

In [1]: from sklearn.datasets import base
   ...: buch = base.Bunch(A=1,B=2,c=3)
In [2]: type(buch)
Out[2]: sklearn.datasets.base.Bunch
In [3]: buch
Out[3]: {'A': 1, 'B': 2, 'c': 3}    #类似于字典的格式
In [4]: buch['A']    #通过字典类似的方法也可以调用
Out[4]: 1
In [5]: buch.A    #对象.属性,用该方法也可以调用
Out[5]: 1
In [6]: dt = {'A':1,'B':2,'C':3}
In [7]: type(dt)
Out[7]: dict
In [8]: dt['A']
Out[8]: 1
In [9]: dt.A    #但是字典就不可以了,这就是它们的最大区别
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-7b8328c57719> in <module>()
----> 1 dt.A

这个就是它们的区别,有些东西需要了解,不一定要精通

数据展示

print("前五行的数据展示:\n", iris_dataset['data'][:5])

image.png

print("Type of data:", type(iris_dataset['data']))

image.png


因为我们的数据类型类型现在已经变成了numpy的数组类型了,所以我们用的是索引切片,约束我们的数据。


模型搭建

在机器学习的过程中,模型的选择和搭建是非常的重要的,一个好的模型可以让我们的数据变得更有价值。


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    iris_dataset['data'], iris_dataset['target'], random_state=0)

scikit-learn 中的数据通常用大写的 X 表示,而标签用小写的 y 表示。这是受到了数学标准公式 f(x)=y 的启发,其中 x 是函数的输入, y 是输出。我们用大写的 X 是因为数据是一个二维数组(矩阵),用小写的 y 是因为目标是一个一维数组(向量),这也是数学中的约定。


scikit-learn 中的 train_test_split 函数可以打乱数据集并进行拆分。这个函数将 75% 的

行数据及对应标签作为训练集,剩下 25% 的数据及其标签作为测试集。训练集与测试集的

分配比例可以是随意的,但使用 25% 的数据作为测试集是很好的经验法则。这样的分配原则在模型的训练和测试是比较的智能科学的。


为了确保多次运行同一函数能够得到相同的输出,我们利用 random_state 参数指定了随机

数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。


我们可以看看我们的具体的数据类型,这样我们就可以明显的了解到为什么会有两个变量接收,在上面的参数解释,也说明了,因为是一个二维数组,对应的数据


image.png


观察数据和检查数据


在构建机器学习模型之前,通常最好检查一下数据,看看如果不用机器学习能不能轻松完成任务,或者需要的信息有没有包含在数据中。

检查数据的最佳方法之一就是将其可视化。一种可视化方法是绘制散点图(scatter plot)。数据散点图将一个特征作为 x 轴,另一个特征作为 y 轴,将每一个数据点绘制为图上的一个点。不幸的是,计算机屏幕只有两个维度,所以我们一次只能绘制两个特征(也可能是3 个)。用这种方法难以对多于 3 个特征的数据集作图。解决这个问题的一种方法是绘制散点图矩阵(pair plot),从而可以两两查看所有的特征。


iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)

pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15),

                          marker='o', hist_kwds={'bins': 20}, s=60,

                          alpha=.8, cmap=mglearn.cm3)



通过观察我们,可以发现不同的标签,也呈现出“物以类聚”的特点,这就说明机器学习可以比较很好的区分出,也是比较的适合分类算法的


image.png

参数解释


dataframe:iris_dataframe 按行取数据

c=y_train 颜色,用不同着色度区分不同种类

figsize=(15,15) 图像区域大小,英寸为单位

marker=‘0’ 点的形状,0是圆,1是¥

hist_kwds={‘bins’:50} 对角线上直方图的参数元组

s=60 描出点的大小

alpha=.8 图像透明度,一般取(0,1]

cmap=mglearn.cm3 mylearn实用函数库,主要对图进行一些美化等私有功能


构建模型

K近邻算法

k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如

说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。然后,我们可以用这些

邻居中数量最多的类别做出预测。

模型参数比较重要

KNeighborsClassifier 最重要的参数就是邻居的数目,这里我们设为 1:


knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行

预测的算法。它还包括算法从训练数据中提取的信息。对于 KNeighborsClassifier 来说,

里面只保存了训练集。


image.png


根据我们模型的预测,这朵新的鸢尾花属于类别 0,也就是说它属于 setosa 品种,这里我们也可以自动的要求我们的用户输入,直接可以出结果。


模型评估

我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例:


image.png

可以使用 knn 对象的 score 方法来计算测试集的精度:


image.png


总结与归纳

我们构思了一项任务,要利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个

品种: setosa、 versicolor 或 virginica,因此这是一个三分类问题。在分类问题中,可能的品种被称为类别(class),每朵花的品种被称为它的标签(label)。


鸢尾花(Iris)数据集包含两个 NumPy 数组:一个包含数据,在 scikit-learn 中被称为 X;一个包含正确的输出或预期输出,被称为 y。数组 X 是特征的二维数组,每个数据点对应一行,每个特征对应一列。数组 y 是一维数组,里面包含一个类别标签,对每个样本都是一个 0 到 2 之间的数。




image.png

K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(这就类似于现实生活中少数服从多数的思想)


这里我们使用了,K近邻算法进行模型的搭建,当然也可以运用其他的算法模型进行预测,比如逻辑回归......


   使用k近邻算法的条件:


                       1. 你需要一个训练的数据集,这个数据集包含各种特征值和对应的label值 ,在使用前需要将各种特征归一化处理。


                       2. 利用训练的数据集来对要分类的数据进行分类:


                       根据欧式距离计算出要预测的数据与训练数据集中距离最短的前k个值,然后根据前k个值对应的label


                       统计出 label值最最多的,如选择的前k个对应的label:['dog','dog','dog','fish'] ,那么这个结果是dog类。


            k近邻算法特点:


                     优点: 计算精度高,不受异常值影响。


                     缺点: 计算复杂度高,空间复杂度高


                    适用于: 带lable的数值类


每文一语

       有的人21岁毕业,到27岁才找到工作;有的人一毕业就拥有了一切;有的人没有上过大学,却在20出头的年纪里,干着自己热爱的事业;有的人明明彼此相爱却不能在一起,其实人生中的每一件事,都取决于我们的时间安排;有些人也许遥遥领先于我们,有些人也许落后与我们,但凡事都有它自己的节奏;30岁还没结婚,按但只要过得快乐也是一种幸福;耐心一点,踏实一点,;因为爱因斯坦说过:并不是每一件算得出来的事都有意义,也不是每一件有意义的事都能被算出来,真正重要的是:打破传统思维,获得精神上的自由,我们要创造一个属于自己充满意义的人生,不嫉妒、不羡慕、不被任何事影响!


相关文章
|
26天前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
32 0
|
3月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
102 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
38 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
2月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
2月前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
28 0
|
3月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
52 9
|
4月前
|
数据采集 机器学习/深度学习 算法
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
|
4月前
|
算法 5G Windows
OFDM系统中的信号检测算法分类和详解
参考文献 [1]周健, 张冬. MIMO-OFDM系统中的信号检测算法(I)[J]. 南京工程学院学报(自然科学版), 2010. [2]王华龙.MIMO-OFDM系统传统信号检测算法[J].科技创新与应用,2016(23):63.
80 4
|
4月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【8月更文挑战第2天】决策树算法以其直观性和解释性在机器学习领域中独具魅力,尤其擅长处理非线性关系。相较于复杂模型,决策树通过简单的分支逻辑实现数据分类,易于理解和应用。本示例通过Python的scikit-learn库演示了使用决策树对鸢尾花数据集进行分类的过程,并计算了预测准确性。虽然决策树优势明显,但也存在过拟合等问题。即便如此,无论是初学者还是专家都能借助决策树的力量提升数据分析能力。
47 4