機器學習“HelloWorld!”——鳶尾花的分類【完整版】

From:Jason Brownlee——https://machinelearningmastery.com/machine-learning-in-python-step-by-step/
另一個很好的示例——https://www.cnblogs.com/Belter/p/8831216.html
P.S.The first machine learning project was officially launched at 2020.02.02.

When you are applying machine learning to your own datasets(數據集), you are working on a project.
★A machine learning project may not be linear(線性), but it has a number of well known steps: //衆所周知的步驟:

1.Define Problem.
2.Prepare Data.
3.Evaluate Algorithms.
4.Improve Results.
5.Present Results.
沒有涵蓋機器學習項目中的所有步驟,因爲這是您的第一個項目,我們需要關注關鍵步驟。

★第一次的意義:
真正使用新平臺或工具的最佳方法是端到端完成機器學習項目並涵蓋關鍵步驟。即,從加載數據,彙總數據,評估算法和做出一些預測。如果可以這樣做,您將擁有一個可以在數據集之後使用的模板。一旦有了更多信心,您就可以填補空白,例如 進一步的數據準備和改善結果任務

★鳶尾花數據集——https://archive.ics.uci.edu/ml/datasets/Iris
★項目概述——Iris也稱鳶尾花卉數據集,是一類多重變量分析的數據集。通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(iris-setosa, iris-versicolour, iris-virginica)三個種類中的哪一類。

★we are going to cover★
Ⅰ. Loading(加載) the dataset.//導入數據
Ⅱ. Summarizing(彙總) the dataset.//概述數據
Ⅲ. Visualizing(可視化) the dataset.//數據可視化
Ⅳ. Evaluating some algorithms.//評估算法
Ⅴ. Making some predictions.//實施預測

Ⅰ. Loading the dataset

You can download the Iris Data Set from https://archive.ics.uci.edu/ml/datasets/Iris
(Fisher,1936)
數據集包含150個鳶尾花的觀測值。花的測量單位有四列,以釐米爲單位。第五列是觀察到的花的種類。所有觀察到的花均屬於三種。在此步驟中,我們將從CSV文件URL加載鳶尾花數據。

1.1 導入函數庫(使用的所有模塊,函數和對象)

# Load libraries
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

1.2 加載數據集

注:我們可以直接從UCI機器學習存儲庫中加載數據。我們正在使用pandas來加載數據。接下來,我們還將使用pandas通過描述性統計信息和數據可視化來探索數據。

請注意,我們在加載數據時指定每列的名稱!這將在以後探索數據時提供幫助
【從CSV文件URL加載鳶尾花數據!如果存在網絡問題,則可以將iris.csv文件下載到您的工作目錄中,並使用相同的方法將URL更改爲本地文件名來加載它。】

# Load dataset
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(url, names=names)

數據集應加載而不會發生任何事件。

附加:
在訓練模型時,需要用到大量數據,最常見的做法就是利用歷史的數據來訓練模型。這些數據通常會以CSV的格式來存儲(或者能夠轉化爲CSV格式)。在啓動ML項目之前,必須先將數據導入到Python中,有三種辦法:
①通過標準的Python庫導入
②通過NumPy導入
③通過Pandas導入

另一個簡單方法(如下代碼):直接利用Python中的機器學習包scikit-learn直接導入該數據集!!這個方式可以看到一個很清楚的數據表~

from sklearn.datasets import load_iris
data = load_iris()
print(dir(data))  # 查看data所具有的屬性或方法
print(data.DESCR)  # 查看數據集的簡介

import pandas as pd
#直接讀到pandas的數據框中
pd.DataFrame(data=data.data, columns=data.feature_names)

The dataset should load without incident.

Ⅱ. Summarizing the dataset

Now it is time to take a look at the data.

In this step we are going to take a look at the data a few different ways:
(以幾種不同的方式看一下數據)

  1. Dimensions of the dataset. //數據集的尺寸
  2. Peek at the data itself. //窺視數據本身
  3. Statistical summary of all attributes. //所有屬性的統計摘要
  4. Breakdown of the data by the class variable. //通過類變量對數據進行分類

每次查看數據都是一個命令,這些命令會在以後的項目中反覆使用!
警告 ⚠ 用上述第二種代碼載入數據集將不能使用這些功能…試過了…

2.1 查看數據集維度

We can get a quick idea of how many instances (rows) and how many attributes (columns) the data contains with the shape property.【譯文:我們可以通過shape屬性快速瞭解數據包含多少個實例(行)和多少個屬性(列)。】

# shape
print(dataset.shape)

You should see 150 instances(實例)and 5 attributes(屬性):(150,5)

2.2 查看數據

For example:eyeball the first 20 rows of the data——

# head
print(dataset.head(20))

運行後會顯示數據集的前20行,簡易表格形式!

2.3 Statistical Summary 統計摘要

Now we can take a look at a summary of each attribute.【每個屬性的摘要】
包括:計數,平均值,最小值和最大值以及一些百分位數。

# descriptions
print(dataset.describe())

//所有數值都具有相同的標度(釐米),相似的範圍介於0到8釐米之間。

2.4 Class Distribution 類分佈

現在讓我們看一下屬於每個類的實例(行)的數量。我們可以將其視爲絕對計數。

# class distribution
print(dataset.groupby('class').size())

運行結果:發現每個類具有相同數量的實例(數據集的50或33%)。

Ⅲ. Visualizing the dataset

We now have a basic idea about the data. We need to extend that with some visualizations.
We are going to look at two types of plots(圖):
①Univariate plots【單變量圖】 to better understand each attribute.
②Multivariate plots【多變量圖】 to better understand the relationships between attributes.

3.1 單變量圖——更好地理解每個屬性

單變量圖=每個單獨變量的圖。
假設輸入變量是數字變量,我們可以爲每個變量創建箱形圖和晶須圖

# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()

This gives us a much clearer idea of the distribution of the input attributes:
Alt
通過這些圖,我們對輸入屬性的分佈有了更清晰的認識。

我們還可以爲每個輸入變量創建一個直方圖,以瞭解分佈情況:

# histograms
dataset.hist()
pyplot.show()

運行結果:
Alt
注意:看起來其中兩個輸入變量具有高斯分佈!這一點很有用,因爲我們可以使用利用高斯分佈假設的算法。

3.2 多元圖——更好地瞭解屬性之間的關係

現在來看一下變量之間的相互作用。
首先,觀察所有屬性對的散點圖。這有助於發現輸入變量之間的結構化關係。

# scatter plot matrix
scatter_matrix(dataset)
pyplot.show()

運行結果: 鳶尾花數據集的每個輸入變量的散點矩陣圖
Alt
注意一些屬性對的對角線分組。這表明高度相關和可預測的關係。

3.3 將數據用圖像的形式展示出來

這也是數據可視化的重要部分。幫助我們對數據集有一個直觀的整體印象!

e.g.下面利用該數據集4個特徵中的後兩個,即花瓣的長度和寬度,來展示所有的樣本點。

import matplotlib.pyplot as plt
plt.style.use('ggplot')

X = data.data  # 只包括樣本的特徵,150x4
y = data.target  # 樣本的類型,[0, 1, 2]
features = data.feature_names  # 4個特徵的名稱
targets = data.target_names  # 3類鳶尾花的名稱,跟y中的3個數字對應

plt.figure(figsize=(10, 4))
plt.plot(X[:, 2][y==0], X[:, 3][y==0], 'bs', label=targets[0])
plt.plot(X[:, 2][y==1], X[:, 3][y==1], 'kx', label=targets[1])
plt.plot(X[:, 2][y==2], X[:, 3][y==2], 'ro', label=targets[2])
plt.xlabel(features[2])
plt.ylabel(features[3])
plt.title('Iris Data Set')
plt.legend()
plt.savefig('Iris Data Set.png', dpi=200)
plt.show()

運行結果:
Alt

Ⅳ. Evaluating some algorithms

核心:創建一些數據模型並評估它們在看不見數據上的準確性

Here is what we are going to cover in this step:
①分離出驗證數據集。
②設置測試工具以使用10倍交叉驗證。
③建立多個不同的模型以根據花的測量預測物種
④選擇最佳型號。

4.1 先學:爲機器學習索引,切片和重塑NumPy數組

點擊進入學習鏈接
(Python;線性代數)

4.2 創建驗證數據集

我們需要知道我們創建的模型是好的!

使用統計方法來估計我們在看不見的數據上創建的模型的準確性。我們還希望通過對實際看不見的數據進行評估,從而對看不見的最佳模型的準確性進行更具體的估計。

(具體做法)也就是說,我們將保留一些算法不會看到的數據,並將使用這些數據來獲得第二個獨立的想法,即最佳模型實際上可能有多精確。

我們將加載的數據集分爲兩個部分,其中80%將用於訓練,評估和選擇模型,另外20%將作爲驗證數據集。

# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
y = array[:,4]
X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1)

現在,您在X_train和Y_train中具有用於準備模型的訓練數據,以及稍後可以使用的X_validation和Y_validation集。
(請注意,我們使用python slice來選擇NumPy數組中的列。)

4.3 Test Harness 測試線束

使用分層的10倍交叉驗證來估計模型的準確性
附:「交叉驗證」到底如何選擇K值?

這會將我們的數據集分成10個部分,在9上訓練,在1上測試,然後對訓練測試拆分的所有組合重複。

分層是指:數據集的每個摺疊或拆分旨在使示例分佈與整個訓練數據集中相同。

我們通過random_state參數將隨機種子設置爲固定數字,以確保每種算法都在訓練數據集的相同分割上進行評估。

定義:我們使用“ 準確性 ” 指標來評估模型。這是正確預測的實例數除以數據集中的實例總數乘以100得到的百分比(例如,準確度爲95%)。

4.4 建立模型

我們不知道哪種算法可以解決此問題或使用哪種配置。從圖中我們可以看出,有些類在某些維度上是部分線性可分的,所以我們希望總體上得到好的結果。

★測試6種不同的算法:
//這是簡單的線性算法(LR和LDA),非線性算法(KNN,CART,NB和SVM)的很好的結合!

邏輯迴歸(LR)
線性判別分析(LDA)
K最近鄰居(KNN)
分類和迴歸樹(CART)
高斯樸素貝葉斯(NB)
支持向量機(SVM)

★構建和評估我們的模型:

# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC(gamma='auto')))
# evaluate each model in turn
results = []
names = []
for name, model in models:
	kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True)
	cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
	results.append(cv_results)
	names.append(name)
	print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))

結果如下:6個模型的準確性估算

LR: 0.951807 (0.052427)
LDA: 0.976923 (0.035251)
KNN: 0.951807 (0.052427)
CART: 0.953205 (0.061888)
NB: 0.952448 (0.062375)
SVM: 0.984615 (0.030769)

4.5 選擇最佳模型

現在,我們有6個模型和每個模型的準確性估算。我們需要將模型進行比較並選擇最準確的模型。(請注意,由於學習算法的隨機性,結果可能會有所不同。)

在這種情況下,我們可以看到支持向量機(SVM)的估計準確性得分最高,約爲0.98或98%!
————————————————————————————————————————
我們還可以創建模型評估結果的圖,並比較每個模型的分佈和平均準確性。每種算法都有大量的精度度量,因爲每種算法都被評估了10次(通過10倍交叉驗證)。
比較每種算法的結果樣本的方法是爲每種分佈創建箱形圖和晶須圖並比較分佈

# Compare Algorithms
pyplot.boxplot(results, labels=names)
pyplot.title('Algorithm Comparison')
pyplot.show()

運行結果: 鳶尾花數據集上的盒須圖比較機器學習算法
Alt
我們可以看到箱形圖和晶須圖在該範圍的頂部被壓縮,許多評估達到了100%的準確度,而有些評估則下降到了80%的高準確度。

Ⅴ. Making some predictions

We must choose an algorithm to use to make predictions.
The results in the previous section suggest that the SVM was perhaps the most accurate model. We will use this model as our final model.

現在,我們要對驗證集中的模型的準確性有所瞭解。這將使我們對最佳模型的準確性進行獨立的最終檢查。注意:保留驗證集非常重要,以防萬一您在訓練過程中滑倒,例如過度適合訓練集或數據泄漏。

5.1 做出預測

在整個訓練數據集上擬合模型,並在驗證數據集上進行預測。

# Make predictions on validation dataset
model = SVC(gamma='auto')
model.fit(X_train, Y_train)
predictions = model.predict(X_validation)

5.2 評估預測

可以通過將預測結果與驗證集中的預期結果進行比較來評估預測結果,然後計算分類準確性,以及混淆矩陣和分類報告。

# Evaluate predictions
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))

運行結果:
Alt
我們可以看到,在保留數據集上,準確性爲0.966或大約96.6%。

上圖,混淆矩陣提供了三個錯誤的指示。最後,分類報告按精度,召回率,f1得分和支持分類顯示了每個分類,並顯示了出色的結果(允許的驗證數據集很小)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章