[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()

  數據顯示結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM