当前位置:   article > 正文

3.19 机器学习应用:鸢尾花分类Iris_机器学习识别鸢尾花的种类属于什么类型

机器学习识别鸢尾花的种类属于什么类型

一、数据描述、调用

测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米

类别:属于setosa、versicolor 或virginica 三个品种之一

机器学习中的个体叫作样本(sample),其属性叫作特征(feature)。data 数组的形状(shape)是样本数乘以特征数

  1. #调用load_iris 函数来加载数据
  2. from sklearn.datasets import load_iris
  3. iris_dataset = load_iris()# load_iris 返回的iris 对象是一个Bunch 对象,与字典非常相似,里面包含键和值
  4. #查看键值
  5. print("Keys of iris_dataset:\n{}".format(iris_dataset.keys()))
  6. #查看DESCR中数据集介绍
  7. print(iris_dataset['DESCR'][:193] + "\n...")
  8. #查看 'target_names'中花的品种
  9. print("target names:{}".format(iris_dataset['target_names']))
  10. #data类型
  11. print("Type of data: {}".format(type(iris_dataset['data'])))
  12. #data的容量
  13. print("Shape of data: {}".format(iris_dataset['data'].shape))
  14. #查看target
  15. print("target:\n{}".format(iris_dataset['target']))

二、设定训练数据 测试数据

将收集好的带标签数据(此例中是150 朵花的测量数据)分成两部分。一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练集(training set)。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(testset)或留出集(hold-out set)。

scikit-learn 中的train_test_split 函数:利用伪随机数生成器打乱数据集并进行拆分。75%训练集,25%测试集(经验比例)分配

标识:数据X,标签y

  1. from sklearn.model_selection import train_test_split
  2. X_train, X_test, y_train, y_test = train_test_split(
  3. iris_dataset['data'], iris_dataset['target'], random_state=0) #data+target

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

三、观察数据

检查数据的最佳方法之一就是将其可视化。如绘制散点图(scatter plot),但只能看两个特征。可以绘制散点图矩阵(pair plot),两两看所有特征。(散点图矩阵无法同时显示所有特征之间的关系,所以这种可视化方法可能无法展示数据的某些有趣内容。)

散点图矩阵:首先将NumPy 数组转换成pandas DataFrame。pandas 有一个绘制散点图矩阵的函数,叫作scatter_matrix。pd.plotting.scatter_matrix,其参数介绍https://blog.csdn.net/leilei9406/article/details/83538117?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

矩阵的对角线是每个特征的直方图

  1. #散点图矩阵
  2. # 利用X_train中的数据创建DataFrame
  3. # 利用iris_dataset.feature_names中的字符串对数据列进行标记
  4. import pandas as pd
  5. import matplotlib.pyplot as plt
  6. iris_dataframe = pd.DataFrame(X_train,columns=iris_dataset.feature_names)
  7. #利用DataFrame创建散点图矩阵,按y_train着色
  8. grr = pd.plotting.scatter_matrix(iris_dataframe, c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8)
  9. plt.show()

四、构建模型:k近邻算法

scikit-learn 中所有的机器学习模型都在各自的类中实现,这些类被称为Estimator类。k 近邻分类算法是在neighbors 模块的KNeighborsClassifier 类中实现的。我们需要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。KNeighborsClassifier 最重要的参数就是邻居的数目

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

  1. #k neighbors
  2. from sklearn.neighbors import KNeighborsClassifier
  3. knn = KNeighborsClassifier(n_neighbors=1)
  4. knn.fit(X_train, y_train) #构建模型

fit 方法返回的是knn 对象本身并做原处修改,因此我们得到了分类器的字符串表示。从中可以看出构建模型时用到的参数

五、预测

想象一下,我们在野外发现了一朵鸢尾花,花萼长5cm 宽2.9cm,花瓣长1cm 宽0.2cm。这朵鸢尾花属于哪个品种?

我们将这朵花的测量数据转换为二维NumPy 数组的一行,这是因为scikit-learn的输入数据必须是二维数组

  1. #预测
  2. import numpy as np
  3. X_new = np.array([[5,2.9,1,0.2]])
  4. print("X_new.shape:{}".format(X_new.shape))
  5. prediction = knn.predict(X_new)
  6. print("prediction:{}".format(prediction))
  7. print("Predicted target name:{}".format(iris_dataset['target_names'][prediction]))

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

输出了类别和品种

六、评估模型

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

  1. #评估模型
  2. # 对测试数据进行预测
  3. y_pred = knn.predict(X_test)
  4. print("test set prediction:\n{}".format(y_pred))
  5. # 两种方法 算预测准确度
  6. print("test set score:\n{:.2f}".format(np.mean(y_pred == y_test)))
  7. print("test set score:\n{:.2f}".format(knn.score(X_test, y_test)))

 

总结:

  1. k近邻算法的使用比较简单,先给定参数n_neighbors,建立模型knn.fit(X_train, y_train),预测用knn.predict(X_test),然后评估模型预测准确性np.mean(y_pred == y_test)或knn.score(X_test,y_test)
  2. 散点图矩阵的绘制:将NumPy 数组转换成pandas DataFrame,再用pd.plotting.scatter_matrix

参考《python机器学习基础教程》第一章

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号