首页 > 分享 > 鸢尾花分类

鸢尾花分类

鸢尾花分类

2019.09.28 23:21:22字数 2,336阅读 8,885

第一个应用鸢尾花分类

假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣。她收集了每朵鸢尾花的一些测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米。
她还有一些鸢尾花分类的测量数据,这些花之前已经被植物学专家鉴定为属于setosa、versicolor或virginica三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品种。
我们的目标是构建一个机器学习模型,可以从这些已知品种的鸢尾花测量数据中进行学习,从而能够预测新鸢尾花的品种。
因为我们有已知的鸢尾花的测量数据,所以这是一个监督学习问题。在这个问题中,我们要在多个选项中预测其中一个(鸢尾花的品种)。这是一个分类(classification)问题
的示例。可能的输出(鸢尾花的品种)叫做类别(class)。数据集中的每朵鸢尾花都属于三个类别之一,所以这是一个三分类问题。
单个数据点(一朵鸢尾花)的预期输出是这朵花的品种。对于一个数据点来说,它的品种叫做标签(label)

初识数据

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

from sklearn.datasets import load_iris iris_dataset=load_iris() iris_dataset

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

print("Keys of iris_dataset:n{}".format(iris_dataset.keys()))

Keys of iris_dataset:
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
DESCR键对应的是数据集的简要说明,可以查看一些数据:

print(iris_dataset['DESCR'][:139] + "n...")

.. _iris_dataset:

Iris plants dataset

Data Set Characteristics:

:Number of Instances: 150 (50 in each of th

...
targte_names键对应的值时一个字符串数组,里面包含我们要预测的花的品种:

print("Target names:{}".format(iris_dataset['target_names']))

Target names:['setosa' 'versicolor' 'virginica']
feature_names键对应的值是一个字符串列表,对每一个特征进行了说明:

print("Feature names:n{}".format(iris_dataset['feature_names']))

Feature names:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
数据包含在targetdata字段中。data里面是花萼长度、花萼宽度、花瓣长度、花瓣宽度的测量是,格式为Numpy数组:

print("Type of data:{}".format(type(iris_dataset['data'])))

Type of data:<class 'numpy.ndarray'>
data数组的每一行对应一朵花,列代表每朵花的四个测量数据:

print("Shape of data:{}".format(iris_dataset['data'].shape))

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

First five rows of data:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]
从数据中可以看出,前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("Targt:n{}".format(iris_dataset['target']))

Targt:
[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 0
0 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 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 1 1 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 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
上述数字的代表含义由iris['target_names']数组给出:0代表setosa,1代表versicolor,2代表virginica。

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

一部分数据用于构建机器学习模型,叫作训练数据(training data)训练集(training set)。其余的数据用来评估模型性能,叫做测试数据(test data)测试集(test set)留出集(hold-out set)

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)

train_test_split函数利用为随机数生成器见数据集打乱,为了确保多次运行同一函数能够得到相同的输出,我们利用random_state参数指定了随机数生成器的种子,这样函数输出是固定不变的,所以这行代码的输出始终相同。

print("X_train shape:{}".format(X_train.shape)) print("y_train shape:{}".format(y_train.shape))

X_train shape:(112, 4)
y_train shape:(112,)

print("X_test shape:{}".format(X_test.shape)) print("y_test shape:{}".format(y_test.shape))

X_test shape:(38, 4)
y_test shape:(38,)

要事第一:观察数据

在构建机器小河西模型之前,通常最好检查一下数据,看看如果不用机器学习能不能轻松完成任务,或者需要的信息有没有包含在数据中。
检查数据的最佳方法之一就是将其可视化。
一种可视化方法是绘制散点图(scatter plot)。数据散点图将一个特征作为x轴,另一个特征作为y轴,将每一个数据点绘制为图上的一个点。
不幸的是,计算机屏幕只有两个维度,所以我们一次只能绘制两个特征(也可能是3个)。用这种方法难以对多于3个特征的数据集作图。解决这个问题的一种方法是绘制散点图矩阵(pair plot),从而可以两两查看所有的特征。

import numpy as np import matplotlib.pyplot as plt import pandas as pd import mglearn # 利用X_train中的数据创建DataFrame # 利用iris_dataset.feature_names中的字符串对数据进行标记 iris_dataframe=pd.DataFrame(X_train,columns=iris_dataset.feature_names) # 利用DataFrame创建散点图矩阵,按y_train着色 grr=pd.plotting.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=0.8,cmap=mglearn.cm3)

image.png

从上图可以看出,利用花瓣(petal)和花萼(sepal)的测量数据基本可以将三个类别区分开。这说明机器学习模型很可能可以学会区分它们。

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

k近邻顺丰中k的含义是,我们可以考虑训练集中与新数据点最近的任意k个邻居(比如说,距离最近的3个或5个邻居),而不是只考虑最近的那一个。然后,我们可以用这些邻居中数量做多的类别做出预测。

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

knn对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行预测的算法。它还包括算法从训练数据中提取的信息。对于KNeighborsClassifier来说,里面只保存了训练集。

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=1, p=2,
weights='uniform')
fit方法返回的是knn对象本身并做原处修改,因此我们得到了分类器的字符串表示。

做出预测

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

X_new.shape:(1, 4)
注意,我们将这朵花的测量数据转换为二维Numpy数组的一行,这是因为scikit-learn的输入数据必须是二维数组。

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

Prediction:[0]
Predicted target name:['setosa']

评估模型

我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与表情(已知的品种)进行对比。我们可以拖计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例:

y_pred=knn.predict(X_test) print("Test set predictions:{}".format(y_pred))

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 0
2]

print("Test set score:{:.2f}".format(np.mean(y_pred == y_test)))

Test set score:0.97
我们还可以使用knn对象的score方法来计算测试集的精度:

print("Test set sore:{:.2f}".format(knn.score(X_test,y_test)))

Test set sore:0.97
对于这个模型来说,测试集的精度约为0.97,也即是说,对于测试集中的鸢尾花,我们的预测有97%是正确的。根据一些数据假设,对于新的鸢尾花,可以认为我们的模型预测结果有97%都是正确的。对于我们的植物学爱好者应用程序来说,高精度意味着模型足够可信,可以使用。

小结与展望

1.鸢尾花的分类是一个监督学习问题,它有三个品种,因此又是一个三分类问题。
2.我们将数据集分成训练集(training set)和测试集(test set),前者用于构建模型,后者用于评估模型对前所未见的新数据的泛化能力。
3.我们选择了k近邻分类算法,根据新数据点在训练集中距离最近的邻居进行预测,并取得了97%的预测精度。

更多精彩内容,就在简书APP

"小礼物走一走,来简书关注我"

还没有人赞赏,支持一下

总资产19共写了6.8W字获得42个赞共52个粉丝

序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...

沈念sama阅读 192,172评论 5赞 459

序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...

文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...

文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...

正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...

茶点故事阅读 60,563评论 4赞 352

文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...

那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...

文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...

序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...

正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...

茶点故事阅读 34,343评论 2赞 305

正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...

茶点故事阅读 36,117评论 1赞 322

序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...

正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...

茶点故事阅读 37,360评论 3赞 296

文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...

文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...

我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...

正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...

茶点故事阅读 40,432评论 2赞 335

被以下专题收入,发现更多相似内容

推荐阅读更多精彩内容

SVM中文叫做支持向量机,support vector machine的简写,是常用的分类方法。Pipeline中...

潇洒坤阅读 5,190评论 0赞 6

参考:《深度学习图像识别技术--基于TensorFlow Object Detection API 和 OpenV...

原文链接:https://www.jianshu.com/p/c09beac9f955本文经过潇洒坤重新编辑,感谢...

潇洒坤阅读 3,877评论 0赞 0

LogisticRegression中文叫做逻辑回归,是一种基础、常用的分类方法。 2018年8月24日笔记 1....

潇洒坤阅读 2,830评论 0赞 4

今天,我早上起床后却玩了几个小时的手机,早上去吃早饭是看见同班同学去教室自习,下午为了安慰自己去图书馆自习写完了3...

相关知识

鸢尾花分类
【机器学习】鸢尾花分类
在鸢尾花分类中感受技术“温度”
鸢尾花分类——神经网络详解
Python机器学习基础教程——1.7第一个应用:鸢尾花分类——学习笔记
践行垃圾分类,共创绿意生活 百花街社区“鸢尾花”商户志愿服务队垃圾分类宣传活动–今日湖北网
K近邻算法和鸢尾花问题
机器学习,实现鸢尾花植物种类自动分类(大数据人工智能公司)
鸢尾花怎样治风湿性关节炎
鸢尾花花期多久

网址: 鸢尾花分类 https://m.huajiangbk.com/newsview104766.html

所属分类:花卉
上一篇: 《Python程序设计:人工智能
下一篇: 《数学之美》