1、问题简述
假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣。她收集了每朵鸢尾花的一些测量数据:- 花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米。
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()
数据显示结果: