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()
數據顯示結果: