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

举报
王小王-123 发表于 2021/07/22 19:38:28 2021/07/22
【摘要】 ​目录数据准备数据展示模型搭建构建模型K近邻算法模型评估总结与归纳每文一语数据准备鸢尾花数据附带在Python scikit-learn 的 datasets 模块中,我们只需要调用这个数据即可,用于打开机器学习的大门。from sklearn.datasets import load_irisiris_dataset = load_iris()load_iris 返回的 iris 对象是一...

目录


数据准备

数据展示

模型搭建

构建模型

K近邻算法

模型评估

总结与归纳

每文一语


数据准备

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

from sklearn.datasets import load_iris
iris_dataset = load_iris()

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])

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

因为我们的数据类型类型现在已经变成了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 参数指定了随机
数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。

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

 观察数据和检查数据

在构建机器学习模型之前,通常最好检查一下数据,看看如果不用机器学习能不能轻松完成任务,或者需要的信息有没有包含在数据中。
检查数据的最佳方法之一就是将其可视化。一种可视化方法是绘制散点图(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)

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

参数解释

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 来说,
里面只保存了训练集。

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

模型评估

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

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

总结与归纳

我们构思了一项任务,要利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个
品种: setosa、 versicolor 或 virginica,因此这是一个三分类问题。在分类问题中,可能的品种被称为类别(class),每朵花的品种被称为它的标签(label)。

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


 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岁还没结婚,按但只要过得快乐也是一种幸福;耐心一点,踏实一点,;因为爱因斯坦说过:并不是每一件算得出来的事都有意义,也不是每一件有意义的事都能被算出来,真正重要的是:打破传统思维,获得精神上的自由,我们要创造一个属于自己充满意义的人生,不嫉妒、不羡慕、不被任何事影响!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。