首页 > 分享 > Python机器学习基础教程 鸢尾花分类

Python机器学习基础教程 鸢尾花分类

一、数据集分析

鸢尾花数据集保存在sklearn.datasets模块中,我们可以用load_iris函数加载数据,这个函数返回的iris对象是一个Bunch对象,与字典相似,包括键和值

此处打印出iris数据集中的键值

from sklearn.datasets import load_iris

iris_dataset=load_iris()

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

keys of iris_dataset:

dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

1、data:数据,表示iris数据集中的所有数据,因为数据较多,所以只截取了前20组数据。shape中第一个数字表示包含多少朵不同花的测量数据,第二个数表示特征名,此处有4个特征

from sklearn.datasets import load_iris

iris_dataset=load_iris()

print("data:{}".format(iris_dataset['data'][:20]))

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

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.4 3.9 1.7 0.4]

[4.6 3.4 1.4 0.3]

[5. 3.4 1.5 0.2]

[4.4 2.9 1.4 0.2]

[4.9 3.1 1.5 0.1]

[5.4 3.7 1.5 0.2]

[4.8 3.4 1.6 0.2]

[4.8 3. 1.4 0.1]

[4.3 3. 1.1 0.1]

[5.8 4. 1.2 0.2]

[5.7 4.4 1.5 0.4]

[5.4 3.9 1.3 0.4]

[5.1 3.5 1.4 0.3]

[5.7 3.8 1.7 0.3]

[5.1 3.8 1.5 0.3]

shape of data:(150, 4)

2、target:样本的标签,每一个数字代表不同花的品种,0,1,2分别代表不同的品种

from sklearn.datasets import load_iris

iris_dataset=load_iris()

print("target:{}".format(iris_dataset['target']))

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

data:[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]

shape of data:(150,)

3、target_names:标签名称,一共有三种花,根据上面的target来看0代表‘setosa’,1代表‘versicolor’,2代表‘virginica’

from sklearn.datasets import load_iris

iris_dataset=load_iris()

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

target_names:['setosa' 'versicolor' 'virginica']

4、DESCR:数据集简要说明,因为都是一些说明信息在此不做展示

5、feature_names:特征名称。此处共有四种特征,分别是花萼长度,花萼宽度,花瓣长度,花瓣宽度

from sklearn.datasets import load_iris

iris_dataset=load_iris()

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

feature_names:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

6、filename:文件名称,数据集文件的位置

from sklearn.datasets import load_iris

iris_dataset=load_iris()

print("filename:{}".format(iris_dataset['filename']))

filename:D:anacondalibsite-packagessklearndatasetsdatairis.csv

二、训练数据以及测试数据

1、train_test_split 函数可以打乱数据集并进行拆分,这个函数将75%的行数据及对应标签作为训练集,剩下的25%的数据及其标签作为测试集

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)

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

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

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

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

X_train shape:(112, 4)

X_train shape:(112,)

X_train shape:(38, 4)

X_train shape:(38,)

random_state参数指定了随机数生成器的种子,这样函数输出就是固定不变的,所以代码的输出始终相同

三、数据观察,绘制图像

检查数据的最佳方法之一就是将其可视化

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.datasets import load_iris

import mglearn

iris_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.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)

这里解读一下函数中的参数

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

在第一节里面已经提到,pd.DataFrame表示绘制表格,其中引入的数据集为X_train的数据集,后一个参数表示属性名称,显示在表格的左边和下边,每一个表格都有两个相对的属性

(2)、grr=pd.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)

scatter_matrix是pandas绘制散点图矩阵的函数,为了更好的对比,在此每添加一个参数,都已截图,便于观察,对角线是每个特征的直方图

iris_dataframe:上面的数据集

c=y_train:表示以y_train着色,也就是以标签着色,不同的标签着不同的颜色

figsize=(15,15):表示每个图像块的大小

marker='o':标记符号

hist_kwds={'bins':20}:与hist相关的字典参数(表示散 布 矩阵的对角线上的图形为数据集各特征的直方图。直方图是一 种可对值频率进行离散化显示的柱 状图,数据点被拆分到离散 的,间隔均匀的面元中,绘制的是各面元中数据点的数量),细化直方图,更加精细

s=60:扩大点的大小

alpha=.8:表示透明度,范围在(0,1]

cmap=mglearn.cm3:彩电三原色,光子束,荧光屏,红绿蓝

除此之外,scatter_matrix()中还有一些参数,如:

diagonal,必须且只能在{‘hist’, ‘kde’}中选择1个,’hist’表示直方图(Histogram plot),’kde’表示核密度估计(Kernel Density Estimation);该参数是scatter_matrix函数的关键参数 。本例中用到的是hist直方图,若为kde则如下图

range_padding。(float, 可选),图像在x轴、y轴原点附近的留白(padding),该值越大,留白距离越大,图像远离坐标原点 

此处设置range_padding=1,可以看出当值越大时,点越密集

四、构建第一个模型,k近邻算法

k近邻算法是一个相对容易理解的算法,构建此模型只需要保存训练集即可,要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近,然后将找到的数据点的标签赋值给这个新的数据点。

k的含义是,我们可以考虑训练集中与新数据点最近的任意k个邻居(比如三或五个),而不是只考虑最近的那一个。之后我们可以用这些另据中数量最多的类别做出预测。此节中只考虑1个邻居

k近邻分类算法是在 neighbors 模块的 KNeighborsClassifier 类中实现的

当然在使用k近邻算法时也要导入它所需要的包

from sklearn.neighbors import KNeighborsClassifier

knn=KNeighborsClassifier(n_neighbors=1)

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

想要基于训练集来构建模型,需要调用knn对象的fit方法,两者都是Numpy数组,前者包含训练数据,后者包含相应的训练标签

knn.fit(X_train,y_train)

fit方法返回的是knn对象本身并做原处修改,因此我们得到了分类器的字符串表示

五、预测

我们先将一朵花萼长5cm宽2.9cm,花瓣1cm宽0.2cm的鸢尾花预测一下,看看是属于什么品种

首先将数据存入到Numpy数组中,注意,scilit-learn的输入数据必须是二维数组

之后我们调用knn对象的predict方法来进行预测

import numpy as np

from sklearn.datasets import load_iris

from sklearn.neighbors import KNeighborsClassifier

knn=KNeighborsClassifier(n_neighbors=1)

knn.fit(X_train,y_train)

iris_dataset=load_iris()

X_new=np.array([[5,2.9,1,0.2]])

print("X_new.shape:{}".format(X_new.shape))

prediction=knn.predict(X_new)

print("Prediction:{}".format(prediction))

print("Predicted target name:{}".format(iris_dataset['target_names'][prediction]))

X_new.shape:(1, 4)

Prediction:[0]

Predicted target name:['setosa']

根据预测的结果来看,改鸢尾花属于类别0,也就是setaosa品种

六、评估模型

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

np.mean()得到的是算术平均值,沿轴相等的数除以总数

import numpy as np

from sklearn.datasets import load_iris

from sklearn.neighbors import KNeighborsClassifier

from sklearn.model_selection import train_test_split

knn=KNeighborsClassifier(n_neighbors=1)

X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)

knn.fit(X_train,y_train)

iris_dataset=load_iris()

y_pred=knn.predict(X_test)

print("Test set prediction:n{}".format(y_pred))

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

Test set prediction:

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

Test set score:0.97

也可以方法用knn.score()来求精度,结果是相同的,使用这个方法可以减少部分代码量

import numpy as np

from sklearn.datasets import load_iris

from sklearn.neighbors import KNeighborsClassifier

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)

knn=KNeighborsClassifier(n_neighbors=1)

knn.fit(X_train,y_train)

iris_dataset=load_iris()

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

Test set score:0.97

相关知识

Python机器学习基础教程
[Python机器学习]鸢尾花分类 机器学习应用
机器学习案例:鸢尾花分类——基于Scikit
Python机器学习基础教程——1.7第一个应用:鸢尾花分类——学习笔记
[机器学习基础][笔记] 一、鸢尾花分类
python机器学习
【机器学习】鸢尾花分类
【机器学习】鸢尾花分类:机器学习领域经典入门项目实战
第一个机器学习项目(鸢尾花分类问题)
机器学习(三):感知器算法实现鸢尾花分类项目实战

网址: Python机器学习基础教程 鸢尾花分类 https://m.huajiangbk.com/newsview463391.html

所属分类:花卉
上一篇: 探究仙人掌的植物学分类(解析仙人
下一篇: 完整园艺通论试题及答案