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:\anaconda\lib\site-packages\sklearn\datasets\data\iris.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
































 

发布了16 篇原创文章 · 获赞 3 · 访问量 1104

猜你喜欢

转载自blog.csdn.net/qq_41890177/article/details/101389386