文章目录

  • 例子
  • 初始数据
  • 衡量模型是否成功:训练数据与测试数据
  • 要事第一:观察数据
  • 构建第一个模型:k近邻算法
  • 做出预测
  • 评估模型

例子

假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣。她收集了每朵鸢尾花的一些测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米。

她还有一些鸢尾花的测量数据,这些花之前已经被植物学专家鉴定为属于setosa、versicolor或virginica三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品种。我们假设这位植物学爱好者在野外只会遇到这三种鸢尾花。

我们的目标是构建一个机器学习模型,可以从这些已知品种的鸢尾花测量数据中进行学习,从而能够预测新鸢尾花的品种。
因为我们有已知品种的鸢尾花的测量数据,所以这是一个监督学习问题。在这个问题中,我们要在多个选项中预测其中一个(鸢尾花的品种)。这是一个分类(classification)问题的示例。可能的输出(鸢尾花的不同品种)叫作类别(class)。数据集中的每朵鸢尾花都属于三个类别之一,所以这是一个三分类问题。
单个数据点(一朵鸢尾花)的预期输出是这朵花的品种。对于一个数据点来说,它的品种叫作标签(label)。

初始数据

本例中我们用到了鸢尾花(Iris)数据集,这是机器学习和统计学中一个经典的数据集。它包含在scikit-learn的datasets模块中。我们可以调用load iris函数来加载数据:

from sklearn.datasets import load_iris
iris_dataset = load_iris()

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

In[11]print("Keys of iris dataset: \n{}".format(iris_dataset.keys()))Out[11]Keys of iris dataset: dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

DESCR键对应的值是数据集的简要说明

In[12]print(iris_dataset['DESCR'][:193]+"\n...")Out[12]Iris plants dataset--------------------**Data Set Characteristics:**:Number of Instances: 150 (50 in each of three classes):Number of Attributes: 4 numeric, pre

一些关于数据:

In[13]from sklearn.datasets import load_irisiris_dataset = load_iris()# print("Keys of iris dataset: \n{}".format(iris_dataset.keys()))# print(iris_dataset['DESCR'][:193]+"\n...")#target names键对应的值是一个字符串数组,里面包含我们要预测的花的品种print("\nTarget names:\n{}".format(iris_dataset['target_names']))# target names键对应的值是一个字符串数组,里面包含我们要预测的花的品种print("\nFeature names:\n{}".format(iris_dataset['feature_names']))# 数据包含在target和data字段中。data里面是花萼长度、花萼宽度、花瓣长度、花瓣宽度的测量数据,格式为NumPy数组:print("\nType of data:\n{}".format(type(iris_dataset['data'])))# data数组的每一行对应一朵花,列代表每朵花的四个测量数据:print("\nShape of data:\n{}".format(iris_dataset['data'].shape))Out[13]Target names:['setosa' 'versicolor' 'virginica']Feature names:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']Type of data:<class 'numpy.ndarray'>Shape of data:(150, 4)

可以看出,数组中包含150朵不同的花的测量数据。前面说过,机器学习中的个体叫作样本(sample),其属性叫作特征(feature)。data数组的形状(shape)是样本数乘以特征数。这是scikit-learn中的约定,你的数据形状应始终遵循这个约定。
下面给出前5个样本的特征数值:

print("First five rows of data:\n{}".format(iris_dataset['data'][:5]))


从数据中可以看出,前5朵花的花瓣宽度都是0.2cm,第一朵花的花萼最长,是5.1cm。target数组包含的是测量过的每朵花的品种,也是一个NumPy数组:

print("Type of target:{}".format(type(iris_dataset['target'])))---------------Type of target:<class 'numpy.ndarray'>

target是一维数组,每朵花对应其中一个数据:

print("Shape of target:{}".format(iris_dataset['target'].shape))
----------------------
Shape of target:(150,)

品种被转换成从0到2的整数:

print("Target:\n{}".format(iris_dataset['target']))
--------------------
Target:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2]

上述数字的代表含义由iris[‘target names’]数组给出:0代表setosa,1代表versicolor, 2代表virginica。

衡量模型是否成功:训练数据与测试数据

需要利用这些数据构建一个机器学习模型,用于预测新测量的鸢尾花的品种。但是在用于新的测量数据之前,我们需要知道模型是否有效。
但我们不能使用构建模型的数据来用于评估模型,因为模型会一直记住整个训练集,所以对于训练集中的任何数据点总会预测正确的标签。
这种记忆无法告诉我们模型的泛化能力如何。

我们要用新的数据来评估模型的性能。
通常的做法是将收集好的带标签数据分成两部分,一部分用于构建机器学习模型,叫做训练数据训练集。其余的数据用来评估模型性能,叫做测试数据测试集留出集

scikit-learn中的train_test_split函数可以打乱数据集并进行拆分。这个函数将75%的行数据及对应标签作为训练集,剩下25%的数据及其标签作为测试集。训练集与测试集的分配比例可以是随意的,但使用25%作为测试集是很好的经验法则。

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

对数据调用train test split,并对输出结果采用下面这种命名方法:

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

在对数据进行拆分之前,train test split函数利用伪随机数生成器将数据集打乱。如果我们只是将最后25%的数据作为测试集,那么所有数据点的标签都是2,因为数据点是按标签排序的。测试集中只有三个类别之一,这无法告诉我们模型的泛化能力如何,所以我们将数据打乱,确保测试集中包含所有类别的数据。为了确保多次运行同一函数能够得到相同的输出,我们利用random state参数指定了随机数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。
train test split函数的输出为X trainX testy trainy test,它们都是NumPy数组。X train包含75%的行数据,X test包含剩下的25%:

print("X train shape: {}".format(X_train.shape))
print("y train shape: {}".format(y_train.shape))
print("X test shape: {}".format(X_test.shape))
print("y test shape: {}".format(y_test.shape))
-------------------
X train shape: (112, 4)
y train shape: (112,)
X test shape: (38, 4)
y test shape: (38,)

要事第一:观察数据

在构建机器学习模型之前,通常最好检查一下数据,看看如果不用机器学习能不能轻松完成任务,或者需要的信息有没有包含在数据中。
此外,检查数据也是发现异常值和特殊值的好方法.
举个例子,可能有些鸢尾花的测量单位是英寸而不是厘米。在现实世界中,经常会遇到不一致的数据和意料之外的测量数据。

检查数据的最佳方法之一就是将其可视化。
一种可视化方法是绘制散点图(scatter plot)。数据散点图将一个特征作为x轴,另一个特征作为y轴,将每一个数据点绘制为图上的一个点。不幸的是,计算机屏幕只有两个维度,所以我们一次只能绘制两个特征(也可能是3个)。
用这种方法难以对多于3个特征的数据集作图。
解决这个问题的一种方法是绘制散点图矩阵(pairplot),从而可以两两查看所有的特征。如果特征数不多的话,比如我们这里有4个,这种方法是很合理的。但是你应该记住,散点图矩阵无法同时显示所有特征之间的关系,所以这种可视化方法可能无法展示数据的某些有趣内容。

图1-3是训练集中特征的散点图矩阵。数据点的颜色与鸢尾花的品种相对应。为了绘制这张图,我们首先将NumPy数组转换成pandas DataFrame。pandas有一个绘制散点图矩阵的函数,叫作scatter matrix。矩阵的对角线是每个特征的直方图:

import mglearn as mglearn
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import matplotlib.pyplot as pltiris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0
)iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)grr = 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 )
plt.show()

构建第一个模型:k近邻算法

scikit-learn中有许多可用的分类算法。这里我们用的是k近邻分类器,这是一个很容易理解的算法。构建此模型只需要保存训练集即可。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近的数据点,然后将找到的数据点的标签赋值给这个新数据点。
k近邻算法中k的含义是,我们可以考虑训练集中与新数据点最近的任意k个邻居(比如说,距离最近的3个或5个邻居),而不是只考虑最近的那一个。然后,我们可以用这些邻居中数量最多的类别做出预测。
scikit-learn中所有的机器学习模型都在各自的类中实现,这些类被称为Estimator类。k近邻分类算法是在neighbors模块的KNeighborsClassifier类中实现的。我们需要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。KNeighborsClassifier最重要的参数就是邻居的数目,这里我们设为1:

from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(n_neighbors = 1)

knn对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行预测的算法。它还包括算法从训练数据中提取的信息。对于KNeighborsClassifier来说,里面只保存了训练集。
想要基于训练集来构建模型,需要调用knn对象的fit方法,输入参数为X train和y train,二者都是NumPy数组,前者包含训练数据,后者包含相应的训练标签:

fit方法返回的是knn对象本身并做原处修改,因此我们得到了分类器的字符串表示。从中可以看出构建模型时用到的参数。几乎所有参数都是默认值,但你也会注意到n neighbors=1,这是我们传入的参数。scikit-learn中的大多数模型都有很多参数,但多用于速度优化或非常特殊的用途。

做出预测

我们可能并不知道这些新数据的正确标签。想象一下,我们在野外发现了一朵鸢尾花,花萼长5cm宽2.9cm,花瓣长1cm宽0.2cm。这朵鸢尾花属于哪个品种?我们可以将这些数据放在一个NumPy数组中,再次计算形状,数组形状为样本数(1)乘以特征数(4):

X_new = np.array([[5, 2.9, 1, 0.2]])
print("X new.shapw:{}".format(X_new.shape))
--------------------
X new.shapw:(1, 4)

我们将这朵花的测量数据转换为二维NumPy数组的一行,这是因为scikit-learn的输入数据必须是二维数组。
我们调用knn对象的predict方法来进行预测:

prediction = knn.predict(X_new)
print("Prediction: {}".format(prediction))
print("Prediction target name: {}".format(iris_dataset['target_names'][prediction]))
------------------
Prediction: [0]
Prediction target name: ['setosa']

评估模型

这里需要用到之前创建的测试集。这些数据没有用于构建模型,但我们知道测试集中每朵鸢尾花的实际品种。
因此,我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品种)进行对比。我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例:

print("Test set predictions:\n{}".format(y_pred))
print("Test set score: {:.2f}".format(np.mean(y_pred == y_test)))
----------------------------
Test set predictions:
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 02]
Test set score: 0.97

【机器学习】鸢尾花分类相关推荐

  1. 机器学习 鸢尾花分类的原理和实现(一)

    机器学习 鸢尾花分类的原理和实现(一) 前言: 鸢尾花数据集是机器学习中的经典小规模数据集.通过查阅资料和视频进行学习,将整个实验的学习心得和实验过程分享,希望对喜爱机器学习并入门的新手提供帮助,同时 ...

  2. python根据品种散点图鸢尾花_[Python机器学习]鸢尾花分类 机器学习应用

    1.问题简述 假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣.她收集了每朵鸢尾花的一些测量数据: 花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米. 她还有一些鸢尾花的测量数据, ...

  3. Python机器学习 鸢尾花分类1

    题目描述 请编写代码实现train_and_predict功能,实现能够根据四个特征对三种类型的鸢尾花进行分类. train_and_predict函数接收三个参数: train_input_feat ...

  4. 2、python机器学习基础教程——K近邻算法鸢尾花分类

    一.第一个K近邻算法应用:鸢尾花分类 import numpy as np from sklearn.datasets import load_iris from sklearn.model_sele ...

  5. 鸢尾花分类算法——机器学习笔记

    鸢尾花分类算法--机器学习笔记 开发环境 python.pycharm.sklearn模块. 作者想说 最近正在学习机器学习和参加JavaScript的项目,现在来整理一下机器学习的一些知识点.如果有 ...

  6. 【机器学习】鸢尾花分类问题

    鸢尾鸢尾花分类问题是机器学习中最简单的问题,如果这个问题有了很好的理解,机器学习就可以入门了花分类问题是机器学习中最简单的问题,如果这个问题有了很好的理解,机器学习就可以入门了.本文将利用sklear ...

  7. 【机器学习】sklearn机器学习入门案例——使用k近邻算法进行鸢尾花分类

    1 背景 这个案例恐怕已经被说的很烂了,机器学习方面不同程度的人对该案例还是有着不同的感觉.有的人追求先理解机器学习背后的理论甚至自己推导一遍相关数学公式,再用代码实现:有的人则满足于能够实现相关功能 ...

  8. Python机器学习基础教程(1)Irises(鸢尾花)分类之新手上路

    一.感谢博客的内容提供的参考 标题:最新版学习笔记---Python机器学习基础教程(1)Irises(鸢尾花)分类---附完整代码 作者:非鱼子焉 地址:https://zhu-rui.blog.c ...

  9. 鸢尾花python分类_鸢尾花分类——Python机器学习起步

    引言 一直对AI有着莫大的兴趣,最近买了周志华先生的西瓜书,也是干货满满,最近也想从实战方面入手,了解一下机器学习,本文以<Python机器学习基础教程>为指导. 环境 Sublimete ...

  10. 机器学习-鸢尾花(Iris Flower)分类

    鸢尾花分类是机器学习的经典案例了,在这里我们将使用鸢尾花数据集--一个非常容易理解的数据集(花瓣和花萼的长度与宽度),对鸢尾花的3个亚属:山鸢尾(Iris-setosa).变色鸢尾(Iris-vers ...

最新文章

  1. java部署工具下载_Walle部署工具-Walle(开源部署工具)下载 v2.0.1官方版--pc6下载站...
  2. 一行代码,得到最强时序基线!
  3. 耐能团队论文登上《自然·电子学》:集成忆阻器与CMOS以实现更好的AI
  4. 帕金森患者的新曙光!AI无线智能探测系统诞生
  5. 解决windows显示开启HDR后chrome内截图泛白问题
  6. 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...
  7. Ubuntu 10.04下SSH配置
  8. VS2013建立C++ dll库文件
  9. 【java】带时区的时间格式化
  10. 《JavaScript 高级程序设计》 7.5 常用模式
  11. vbs的任务提醒程序
  12. sqlserver 导出mysql,sqlserver数据(表)导出到mysql
  13. python3界面实例_程序人生——python3下tkinter的界面示例
  14. k8s-自动横向伸缩pod 根据CPU使用率,QPS访问数监控指标
  15. c# dynamic 类型调用静态方法实例
  16. flex mx:TabNavigator进行选项卡切换,需要进行交互时。发生Error #1009错误
  17. C#问题——interface class
  18. java xml注释多行_如何在XML中注释单行?
  19. C语言运算符与输入输出
  20. 手机停机后你们知道怎么打电话?教你鲜为人知的手机锦囊

热门文章

  1. 拼多多根据ID取商品详情 API 的使用说明
  2. 烟雾传感器的matlab程序,基于51单片机的烟雾传感器程序
  3. 学内核之十八:纸上得来终觉浅,绝知此事要躬行
  4. android 手机变键盘,手机在一秒钟内变成鼠标,而Android手机控制着计算机
  5. c# legend 显示位置_添加地图图例 Arcengine+C#
  6. DDos工具tfn2k的编译
  7. YOLOV7跑通demo与train.py
  8. 计算机开源期刊International Journal of Computer Science Issues
  9. 有关资源回收finally
  10. Python-Tips