[Python机器学习]鸢尾花分类 机器学习应用

1、问题简述

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

2、测试代码

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @File  : Iris.py
 4 # @Author: 赵路仓
 5 # @Date  : 2020/2/26
 6 # @Desc  :
 7 # @Contact : 398333404@qq.com 
 8 
 9 import numpy as np
10 import matplotlib.pyplot as plt
11 import pandas as pd
12 import mglearn
13 import pandas as pd
14 from sklearn.datasets import load_iris  # 鸢尾花(Iris)数据集,这是机器学习和统计学中一个经典的数据集
15 from sklearn.model_selection import train_test_split
16 
17 iris_dataset = load_iris()  # load_iris 返回的 iris 对象是一个 Bunch 对象,与字典非常相似,里面包含键和值
18 print("Key or iris_dataset:\n{}".format(iris_dataset.keys()))  # 打印
19 print(iris_dataset['DESCR'][:193] + "\n...")  # DESCR 键对应的值是数据集的简要说明。target_names 键对应的值是一个字符串数组 里面包含我们要预测的花的品种
20 print("Target names: {}".format(iris_dataset['target_names']))  # 三种花的名字类型
21 print("Feature names: {}".format(iris_dataset['feature_names']))  # 三种花的特征,花瓣的长度 宽度 及 花萼的长度 宽度
22 print("Type of data: {}".format(type(iris_dataset['data'])))  # data 数组的每一行对应一朵花,列代表每朵花的四个测量数据
23 print("Shape of data: {}".format(iris_dataset['data'].shape))  # 数组中包含 150 朵不同的花的测量数据
24 print("First five rows of data:\n{}".format(iris_dataset['data'][:5]))  # 前五朵花的数据
25 print("Type of target: {}".format(type(iris_dataset['target'])))  # 是一个一维数组,每朵花对应其中的一个数据
26 print("Shape of target: {}".format(iris_dataset['target'].shape))  #
27 print("Target:\n{}".format(iris_dataset['target']))  # 品种转为0 1 2三个整数,代表三个种类
28 
29 X_train, X_test, Y_train, Y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)
30 print("X_train shape:{}".format(X_train.shape))
31 print("Y_train shape:{}".format(Y_train.shape))
32 print("X_test shape:{}".format(X_test.shape))
33 print("Y_test shape:{}".format(Y_test.shape))
34 
35 # 利用X_train的数据创建DataFrame
36 # 利用iris_dataset.feature_names的字符对数据进行标记
37 iris_dataframe=pd.DataFrame(X_train,columns=iris_dataset.feature_names)  # 横坐标 以及横坐标名称
38 # 利用DataFrame创建散点图矩阵,按y_trian着色
39 grr=pd.plotting.scatter_matrix(iris_dataframe, c=Y_train, figsize=(15, 15), marker='o',hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)
40 plt.show()

  注:其中data数组的每一行代表一朵花,列代表每朵花的四个测量数据,一共150朵不同的花。而target是一个一维数组,每朵花代表其中的以个数据,用0、1、2三个整数代表三个不同的花品种。

3、衡量是否成功:训练数据和测试数据

  首先,不能用构建模型的数据用于评估模型,因为模型是适配构建模型数据的,若用来测试匹配必定是100%。因此,要用新数据来测试模型。 

  一部分数据用于构建机器学习模型,叫作训练数据(training data)训练集(training set),这些数据用来构建机器学习模型。其余的数据用来评估模型性能,叫作测试数据(test data)测试集(testset)留出集(hold-out set)。scikit-learn 中的 train_test_split 函数可以打乱数据集并进行拆分。将 75% 的行数据及对应标签作为训练集,25% 的数据及其标签作为测试集,75%和25%可以根据情况进行更改。
  简单来说,训练数据就是构建模型的,而测试数据就是测试模型是否成功的。用X代表输入,分别为花的四项数据,用Y代表输出。
  train_test_split 函数利用伪随机数生成器将数据集打乱,利用 random_state 参数指定了随机数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。
  该部分代码如下:
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("Y_train shape:{}".format(Y_train.shape))
print("X_test shape:{}".format(X_test.shape))
print("Y_test shape:{}".format(Y_test.shape))

4、观察数据

  一种可视化方法是绘制散点图(scatter plot)。数据散点图将一个特征作为 x 轴,另一个特征作为 y 轴,将每一个数据点绘制为图上的一个点。不幸的是,计算机屏幕只有两个维度,所以我们一次只能绘制两个特征(也可能是3 个)。用这种方法难以对多于 3 个特征的数据集作图。解决这个问题的一种方法是绘制散点图矩阵(pair plot)。
  该部分代码如下:
1 # 利用X_train的数据创建DataFrame
2 # 利用iris_dataset.feature_names的字符对数据进行标记
3 iris_dataframe=pd.DataFrame(X_train,columns=iris_dataset.feature_names)  # 横坐标 以及横坐标名称
4 # 利用DataFrame创建散点图矩阵,按y_trian着色
5 grr=pd.plotting.scatter_matrix(iris_dataframe, c=Y_train, figsize=(15, 15), marker='o',hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)
6 plt.show()

  数据显示结果:

 

 

posted @ 2020-02-26 23:46  雾霾王者  阅读(2546)  评论(0编辑  收藏  举报