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 : [email protected] 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()
数据显示结果:
原文地址:https://www.cnblogs.com/zlc364624/p/12369979.html