Python的第一個機器學習項目

Python機器學習:分步教程
(從此處開始)

在本節中,我們將端到端完成一個小型機器學習項目。

以下是我們要介紹的內容的概述:

  1. 安裝Python和SciPy平臺。
  2. 加載數據集。
  3. 彙總數據集。
  4. 可視化數據集。
  5. 評估一些算法。
  6. 做一些預測。

慢慢來。完成每個步驟。

1.下載,安裝和啟動Python SciPy

如果尚未安裝Python和SciPy平臺,請在系統上安裝它。

我不想詳細介紹這一點,因為其他人已經知道了。這已經非常簡單了,特別是如果您是開發人員。如果您確實需要幫助,請在評論中提出問題。

1.1安裝SciPy庫

本教程假定使用Python 2.7或3.6+版本。

您將需要安裝5個密鑰庫。以下是本教程所需的Python SciPy庫的列表:

  • 科學的
  • 麻木
  • matplotlib
  • 大熊貓
  • 斯克萊恩

有許多安裝這些庫的方法。我最好的建議是選擇一種方法,然後在安裝每個庫時保持一致。

該SciPy的安裝頁面提供了多個不同的平臺,如Linux,Mac OS X和Windows上安裝上述庫極好的說明。如果您有任何疑問或疑問,請參閱本指南,成千上萬的人關注著它。

  • 在Mac OS X上,可以使用macports安裝Python 3.6和這些庫。有關macports的更多信息,請參見主頁。
  • 在Linux上,您可以使用軟件包管理器(例如Fedora上的yum)來安裝RPM。

如果您使用Windows或不確定,我建議安裝免費版本的Anaconda,其中包括您需要的所有內容。

注意:本教程假定您已安裝scikit-learn 0.20或更高版本。

需要更多幫助嗎?請參閱以下教程之一:

  • 如何使用Anaconda設置Python環境進行機器學習
  • 如何使用Python 3創建用於機器學習的Linux虛擬機

1.2啟動Python並檢查版本

確保您的Python環境已成功安裝並且可以正常工作是一個好主意。

下面的腳本將幫助您測試環境。它將導入本教程所需的每個庫並打印版本。

打開命令行並啟動python解釋器:

<code>python/<code>

我建議直接在解釋器中工作或編寫腳本並在命令行(而不是大型編輯器和IDE)上運行它們。保持簡單,專注於機器學習而不是工具鏈。

輸入或複製並粘貼以下腳本:

<code>
# Check the versions of libraries

# Python version
import sys
print('Python: {}'.format(sys.version))
# scipy
import scipy
print('scipy: {}'.format(scipy.__version__))

# numpy
import numpy
print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas
print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn
print('sklearn: {}'.format(sklearn.__version__))
1
# Check the versions of libraries

# Python version
import sys
print('Python: {}'.format(sys.version))
# scipy
import scipy
print('scipy: {}'.format(scipy.__version__))
# numpy
import numpy
print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas
print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn
print('sklearn: {}'.format(sklearn.__version__))/<code>

OS X工作站上獲得的輸出:

<code>Python: 3.6.9 (default, Oct 19 2019, 05:21:45) 
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]
scipy: 1.3.1
numpy: 1.17.3
matplotlib: 3.1.1
pandas: 0.25.1
sklearn: 0.21.3/<code>

理想情況下,您的版本應該匹配或較新。API不會快速更改,因此如果您落後幾個版本,也不必太擔心,本教程中的所有內容很可能仍然對您有用。

如果出現錯誤,請停止。現在該修復它了。

如果您不能幹淨地運行上述腳本,則將無法完成本教程。

2.加載數據

我們將使用鳶尾花數據集。該數據集之所以出名,是因為幾乎所有人都將其用作機器學習和統計中的“ hello world”數據集。

數據集包含150個鳶尾花的觀測值。花的測量單位有四列,以釐米為單位。第五列是觀察到的花的種類。所有觀察到的花均屬於三種。。

在此步驟中,我們將從CSV文件URL加載虹膜數據。

2.1導入庫

首先,讓我們導入將在本教程中使用的所有模塊,函數和對象

<code># 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/<code>

一切都應該正確加載。如果有錯誤,請停止。在繼續之前,您需要一個工作正常的SciPy環境。請參閱上面有關設置環境的建議。


2.2加載數據集

我們可以直接從UCI機器學習存儲庫中加載數據。

我們正在使用熊貓來加載數據。接下來,我們還將使用熊貓通過描述性統計信息和數據可視化來探索數據。

請注意,我們在加載數據時指定每列的名稱。這將在以後探索數據時提供幫助。

<code># 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)/<code>

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

如果確實存在網絡問題,則可以將iris.csv文件下載到您的工作目錄中,並使用相同的方法將URL更改為本地文件名來加載它。

3.彙總數據集

現在該看一下數據了。

在這一步中,我們將以幾種不同的方式看一下數據:

  1. 數據集的尺寸。
  2. 窺視數據本身。
  3. 所有屬性的統計摘要。
  4. 通過類變量對數據進行分類。

不用擔心,每次查看數據都是一個命令。這些有用的命令可以在以後的項目中反覆使用。

3.1數據集維度

我們可以通過shape屬性快速瞭解數據包含多

少個實例(行)和多少個屬性(列)。

<code># shape
print(dataset.shape)/<code>

您應該看到150個實例和5個屬性

<code>(150, 5)/<code>

3.2查看數據

實際關注數據也是一個好主意。

<code># head
print(dataset.head(20))/<code>
<code>    sepal-length  sepal-width  petal-length  petal-width        class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
5 5.4 3.9 1.7 0.4 Iris-setosa
6 4.6 3.4 1.4 0.3 Iris-setosa
7 5.0 3.4 1.5 0.2 Iris-setosa
8 4.4 2.9 1.4 0.2 Iris-setosa
9 4.9 3.1 1.5 0.1 Iris-setosa
10 5.4 3.7 1.5 0.2 Iris-setosa
11 4.8 3.4 1.6 0.2 Iris-setosa
12 4.8 3.0 1.4 0.1 Iris-setosa
13 4.3 3.0 1.1 0.1 Iris-setosa
14 5.8 4.0 1.2 0.2 Iris-setosa
15 5.7 4.4 1.5 0.4 Iris-setosa
16 5.4 3.9 1.3 0.4 Iris-setosa
17 5.1 3.5 1.4 0.3 Iris-setosa
18 5.7 3.8 1.7 0.3 Iris-setosa
19 5.1 3.8 1.5 0.3 Iris-setosa/<code>

3.3統計摘要

現在我們來看看每個屬性的摘要。

這包括計數,平均值,最小值和最大值以及一些百分位數。

<code># descriptions
print(dataset.describe())/<code>

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

<code>       sepal-length  sepal-width  petal-length  petal-width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000

25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000/<code>

3.4班級分佈

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

<code># class distribution
print(dataset.groupby('class').size())/<code>

我們可以看到每個類具有相同數量的實例(數據集的50或33%)

<code>class
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50/<code>

3.5完整範例

作為參考,我們可以將所有先前的元素綁定到一個腳本中。

下面列出了完整的示例。

<code># summarize the data
from pandas import read_csv
# 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)
# shape
print(dataset.shape)
# head
print(dataset.head(20))
# descriptions
print(dataset.describe())
# class distribution
print(dataset.groupby('class').size())
/<code>


4.數據可視化

現在,我們對數據有了基本的瞭解。我們需要通過一些可視化來擴展它。

我們將研究兩種類型的圖:

  1. 單變量圖可以更好地理解每個屬性。
  2. 多變量圖可更好地瞭解屬性之間的關係。

4.1單變量圖

我們從一些單變量圖開始,即每個單獨變量的圖。

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

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

這使我們對輸入屬性的分佈有了更清晰的認識:


Python的第一個機器學習項目

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

<code># histograms
dataset.hist()
pyplot.show()/<code>


看起來其中兩個輸入變量具有高斯分佈。注意這一點很有用,因為我們可以使用可以利用此假設的算法。


Python的第一個機器學習項目

4.2多元圖

現在我們來看一下變量之間的相互作用。

首先,讓我們看看所有屬性對的散點圖。這有助於發現輸入變量之間的結構化關係。

<code># scatter plot matrix
scatter_matrix(dataset)
pyplot.show()/<code>

注意一些屬性對的對角線分組。這表明高度相關和可預測的關係。


Python的第一個機器學習項目

4.3完整範例

作為參考,我們可以將所有先前的元素綁定到一個腳本中。

下面列出了完整的示例。

<code># visualize the data
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
# 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)
# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()
# histograms
dataset.hist()
pyplot.show()
# scatter plot matrix
scatter_matrix(dataset)
pyplot.show()/<code>

5.評估一些算法

現在是時候創建一些數據模型並評估它們在看不見數據上的準確性了。

這是我們將在此步驟中介紹的內容:

  1. 分離出驗證數據集。
  2. 設置測試工具以使用10倍交叉驗證。
  3. 建立多個不同的模型以根據花的測量預測物種
  4. 選擇最佳型號。

5.1創建驗證數據集

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

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

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

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

<code># 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)/<code>

現在,您在X_train和Y_train中具有用於準備模型的訓練數據,以及稍後可以使用的X_validation和Y_validation集。

請注意,我們使用python slice來選擇NumPy數組中的列。

5.2測試線束

我們將使用分層的10倍交叉驗證來估計模型的準確性。

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

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

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

特定的隨機種子無關緊要,

我們使用“ 準確性 ” 指標來評估模型。

這是正確預測的實例數除以數據集中的實例總數乘以100得到的百分比(例如,準確度為95%)的比率。 當我們運行構建並接下來評估每個模型時,我們將使用評分變量。

5.3建立模型

我們不知道哪種算法可以解決此問題或使用哪種配置。

從圖中可以看出,某些類別在某些維度上是部分線性可分離的,因此我們期望總體上取得良好的結果。

讓我們測試6種不同的算法:

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

這是簡單的線性算法(LR和LDA),非線性算法(KNN,CART,NB和SVM)的很好的結合。

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

<code># 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:
\tkfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True)
\tcv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
\tresults.append(cv_results)
\tnames.append(name)
\tprint('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))/<code>

5.4選擇最佳模型

現在,我們有6個模型和每個模型的準確性估算。我們需要將模型進行比較並選擇最準確的模型。

運行上面的示例,我們得到以下原始結果:

<code>LR: 0.960897 (0.052113)
LDA: 0.973974 (0.040110)
KNN: 0.957191 (0.043263)
CART: 0.957191 (0.043263)
NB: 0.948858 (0.056322)
SVM: 0.983974 (0.032083)/<code>

請注意,由於學習算法的隨機性,結果可能會有所不同。

在這種情況下,我們可以看到支持向量機(SVM)的估計準確性得分最高,約為0.98或98%。

我們還可以創建模型評估結果的圖,並比較每個模型的分佈和平均準確性。每種算法都有大量的精度度量,因為每種算法都被評估了10次(通過10倍交叉驗證)。

比較每種算法的結果樣本的一種有用方法是為每種分佈創建箱形圖和晶須圖並比較分佈。

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

我們可以看到,箱形圖和晶須圖在範圍的頂部被壓縮,許多評估達到了100%的準確度,而有些評估則降低到了80%的高準確度。


Python的第一個機器學習項目

5.5完整範例

作為參考,我們可以將所有先前的元素綁定到一個腳本中。

下面列出了完整的示例。

<code># compare algorithms
from pandas import read_csv
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.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
# 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)
# 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, shuffle=True)
# 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:
\tkfold = StratifiedKFold(n_splits=10, random_state=1)
\tcv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
\tresults.append(cv_results)
\tnames.append(name)
\tprint('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))
# Compare Algorithms
pyplot.boxplot(results, labels=names)
pyplot.title('Algorithm Comparison')
pyplot.show()/<code>

6.做出預測

我們必須選擇一種算法來進行預測。

上一節中的結果表明,SVM可能是最準確的模型。我們將使用此模型作為最終模型。

現在,我們要對驗證集中的模型的準確性有所瞭解。

這將使我們對最佳模型的準確性進行獨立的最終檢查。保留驗證集非常重要,以防萬一您在訓練過程中滑倒,例如過度適合訓練集或數據洩漏。這兩個問題都將導致過於樂觀的結果。

6.1做出預測

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

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

6.2評估預測

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

<code># Evaluate predictions
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))/<code>

我們可以看到,在保留數據集上,準確性為0.966或大約96%。

混淆矩陣提供了三個錯誤的指示。

最後,分類報告按精度,召回率,f1得分和支持分類顯示了每個分類,並顯示了出色的結果(允許的驗證數據集很小)。

<code>0.9666666666666667
[[11 0 0]
[ 0 12 1]
[ 0 0 6]]
precision recall f1-score support

Iris-setosa 1.00 1.00 1.00 11
Iris-versicolor 1.00 0.92 0.96 13
Iris-virginica 0.86 1.00 0.92 6

accuracy 0.97 30
macro avg 0.95 0.97 0.96 30
weighted avg 0.97 0.97 0.97 30/<code>

6.3完整範例

作為參考,我們可以將所有先前的元素綁定到一個腳本中。

下面列出了完整的示例。

<code># make predictions
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
# 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)
# 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)
# Make predictions on validation dataset
model = SVC(gamma='auto')
model.fit(X_train, Y_train)
predictions = model.predict(X_validation)
# Evaluate predictions
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))/<code>

此教程作者 Jason Brownlee


分享到:


相關文章: