当前位置:   article > 正文

Python机器学习基础教程 鸢尾花分类_鸢尾花分类python算法

鸢尾花分类python算法

一、数据集分析

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

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

  1. from sklearn.datasets import load_iris
  2. iris_dataset=load_iris()
  3. print("keys of iris_dataset:\n{}".format(iris_dataset.keys()))
  4. keys of iris_dataset:
  5. dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

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

  1. from sklearn.datasets import load_iris
  2. iris_dataset=load_iris()
  3. print("data:{}".format(iris_dataset['data'][:20]))
  4. print("shape of data:{}".format(iris_dataset['data'].shape))
  5. data:[[5.1 3.5 1.4 0.2]
  6. [4.9 3. 1.4 0.2]
  7. [4.7 3.2 1.3 0.2]
  8. [4.6 3.1 1.5 0.2]
  9. [5. 3.6 1.4 0.2]
  10. [5.4 3.9 1.7 0.4]
  11. [4.6 3.4 1.4 0.3]
  12. [5. 3.4 1.5 0.2]
  13. [4.4 2.9 1.4 0.2]
  14. [4.9 3.1 1.5 0.1]
  15. [5.4 3.7 1.5 0.2]
  16. [4.8 3.4 1.6 0.2]
  17. [4.8 3. 1.4 0.1]
  18. [4.3 3. 1.1 0.1]
  19. [5.8 4. 1.2 0.2]
  20. [5.7 4.4 1.5 0.4]
  21. [5.4 3.9 1.3 0.4]
  22. [5.1 3.5 1.4 0.3]
  23. [5.7 3.8 1.7 0.3]
  24. [5.1 3.8 1.5 0.3]
  25. shape of data:(150, 4)

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

  1. from sklearn.datasets import load_iris
  2. iris_dataset=load_iris()
  3. print("target:{}".format(iris_dataset['target']))
  4. print("shape of target:{}".format(iris_dataset['target'].shape))
  5. 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
  6. 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
  7. 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
  8. 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
  9. 2 2]
  10. shape of data:(150,)

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

  1. from sklearn.datasets import load_iris
  2. iris_dataset=load_iris()
  3. print("target_names:{}".format(iris_dataset['target_names']))
  4. target_names:['setosa' 'versicolor' 'virginica']

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

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

  1. from sklearn.datasets import load_iris
  2. iris_dataset=load_iris()
  3. print("feature_names:{}".format(iris_dataset['feature_names']))
  4. feature_names:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

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

  1. from sklearn.datasets import load_iris
  2. iris_dataset=load_iris()
  3. print("filename:{}".format(iris_dataset['filename']))
  4. filename:D:\anaconda\lib\site-packages\sklearn\datasets\data\iris.csv

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

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

  1. from sklearn.model_selection import train_test_split
  2. X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
  3. print("X_train shape:{}".format(X_train.shape))
  4. print("X_train shape:{}".format(y_train.shape))
  5. print("X_train shape:{}".format(X_test.shape))
  6. print("X_train shape:{}".format(y_test.shape))
  7. X_train shape:(112, 4)
  8. X_train shape:(112,)
  9. X_train shape:(38, 4)
  10. X_train shape:(38,)

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

三、数据观察,绘制图像

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

  1. import pandas as pd
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.datasets import load_iris
  4. import mglearn
  5. iris_dataset=load_iris()
  6. X_train,X_test,y_train,y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
  7. iris_dataframe=pd.DataFrame(X_train,columns=iris_dataset.feature_names)
  8. 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近邻算法时也要导入它所需要的包

  1. from sklearn.neighbors import KNeighborsClassifier
  2. 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方法来进行预测

  1. import numpy as np
  2. from sklearn.datasets import load_iris
  3. from sklearn.neighbors import KNeighborsClassifier
  4. knn=KNeighborsClassifier(n_neighbors=1)
  5. knn.fit(X_train,y_train)
  6. iris_dataset=load_iris()
  7. X_new=np.array([[5,2.9,1,0.2]])
  8. print("X_new.shape:{}".format(X_new.shape))
  9. prediction=knn.predict(X_new)
  10. print("Prediction:{}".format(prediction))
  11. print("Predicted target name:{}".format(iris_dataset['target_names'][prediction]))
  12. X_new.shape:(1, 4)
  13. Prediction:[0]
  14. Predicted target name:['setosa']

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

六、评估模型

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

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

  1. import numpy as np
  2. from sklearn.datasets import load_iris
  3. from sklearn.neighbors import KNeighborsClassifier
  4. from sklearn.model_selection import train_test_split
  5. knn=KNeighborsClassifier(n_neighbors=1)
  6. X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
  7. knn.fit(X_train,y_train)
  8. iris_dataset=load_iris()
  9. y_pred=knn.predict(X_test)
  10. print("Test set prediction:\n{}".format(y_pred))
  11. print("Test set score:{:.2f}".format(np.mean(y_pred==y_test)))
  12. Test set prediction:
  13. [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
  14. 2]
  15. Test set score:0.97

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

  1. import numpy as np
  2. from sklearn.datasets import load_iris
  3. from sklearn.neighbors import KNeighborsClassifier
  4. from sklearn.model_selection import train_test_split
  5. X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
  6. knn=KNeighborsClassifier(n_neighbors=1)
  7. knn.fit(X_train,y_train)
  8. iris_dataset=load_iris()
  9. print("Test set score:{:.2f}".format(knn.score(X_test,y_test)))
  10. Test set score:0.97
































 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/748521
推荐阅读
相关标签
  

闽ICP备14008679号