你想用Python做機器學習,但你在入門時遇到了麻煩嗎
在這篇文章中,你將使用Python完成你的第一個機器學習項目。
在這一步一步的教程中,你將:
下載並安裝Python SciPy,獲取Python機器學習最有用的包。
加載數據集並使用統計摘要和數據可視化理解它的結構。
創建6個機器學習模型,選擇最好的,建立準確性可靠的信心。
如果您是一個機器學習初學者,並希望最終開始使用Python,那麼本教程就是為您設計的。
讓我們開始吧
2017年1月/2017年1月更新:更新以反映scikit-learn API在0.18版本中的變化。
2017年3月/更新:添加幫助設置Python環境的。
2018年4月更新:增加了一些關於隨機性和預測的有用連結。2018年9月/ 9月更新:添加到我自己託管版本的數據集的連結。
2019年2月/2月更新:更新sklearn v0.20,也更新了地塊。
2019年10月/ 10月更新:在最後添加了額外教程的連結,以便繼續。
2019年11月/ 11月更新:為每個部分添加了完整的代碼示例。
2019年12月/ 12月更新:更新示例以刪除v0.22中API變化引起的警告。
2020年1月更新:更新到刪除測試工具的代碼片段。
如何用Python開始機器學習?
學習機器學習的最佳方式是通過設計和完成小型項目。
入門時,Python可能會令人生畏
Python是一種流行的、功能強大的解釋語言。與R不同,Python是一種完整的語言和平臺,可以用於研究和開發以及開發生產系統。
還有許多模塊和庫可供選擇,為完成每個任務提供了多種方法。它會讓人感到難以承受。
開始使用Python進行機器學習的最佳方式是完成一個項目。
它將迫使您安裝並啟動Python解釋器(至少如此)。
它將給你一個鳥瞰如何逐步完成一個小項目。
它會給你信心,也許會讓你繼續自己的小項目。
初學者需要一個小的端到端項目
書本和課程令人沮喪。他們給你很多食譜和片段,但你永遠看不到它們是如何組合在一起的。
當您將機器學習應用到您自己的數據集時,您正在處理一個項目。
一個機器學習項目可能不是線性的,但它有一些眾所周知的步驟:
定義問題。
準備數據。
評估算法。
改善的結果。
現在的結果。
真正適應新平臺或工具的最好方法是端到端地完成一個機器學習項目,並涵蓋關鍵步驟。即,從加載數據,總結數據,評估算法和做出一些預測。
如果您能做到這一點,您就有了一個可以在一個又一個數據集上使用的模板。一旦您有了更多的信心,您就可以在以後填補空白,比如進一步的數據準備和改進結果任務。
你好,機器學習的世界
在一個新工具上開始一個最好的小項目是鳶尾花的分類(例如鳶尾數據集)。
這是一個很好的項目,因為它被很好地理解。
屬性是數值型的,所以您必須弄清楚如何加載和處理數據。
這是一個分類問題,允許您用一種更簡單的監督學習算法來練習。
這是一個多類分類問題(多名義),可能需要一些專門的處理。
它只有4個屬性和150行,這意味著它很小,很容易裝入內存(以及一個屏幕或A4頁面)。
所有的數值屬性都在相同的單位和相同的比例中,開始時不需要任何特殊的比例或轉換。
讓我們從Python中的hello world機器學習項目開始吧。
Python中的機器學習:分步教程
(從這裡開始)
在本節中,我們將完成一個端到端的小型機器學習項目。
以下是我們將要講的內容的概述:
安裝Python和SciPy平臺。
加載數據集。
總結數據集。
可視化數據集。
評估一些算法。
做一些預測。
1. 下載,安裝和啟動Python SciPy
在系統上安裝Python和SciPy平臺(如果還沒有安裝的話)。
我不想詳細討論這個問題,因為其他人已經這樣做了。這已經非常簡單了,特別是如果您是開發人員的話。如果你確實需要幫助,請在評論中提問。
1.1安裝SciPy庫
本教程假設Python版本為2.7或3.6以上。
您需要安裝5個關鍵庫。下面是本教程所需的Python SciPy庫列表:
scipynumpymatplotlibpandassklearn安裝這些庫的方法有很多。我的最佳建議是選擇一種方法,然後在安裝每個庫時保持一致。
scipy安裝頁面提供了在多個不同平臺(如Linux、mac OS X和Windows)上安裝上述庫的詳細說明。如果您有任何疑問或問題,請參閱本指南,它已經被成千上萬的人遵循。
在Mac OS X上,可以使用macports安裝Python 3.6和這些庫。有關macports的更多信息,請參見主頁。
在Linux上,您可以使用包管理器,比如Fedora上的yum來安裝rpm。
如果你使用的是Windows系統,或者你不太自信,我建議你安裝Anaconda的免費版本,它包含了你需要的所有東西。
注意:本教程假設您已經安裝了scikit-learn 0.20或更高版本。
1.2啟動Python並檢查版本
確保Python環境已成功安裝並按預期工作是一個好主意。
下面的腳本將幫助您測試環境。它導入本教程中需要的每個庫並列印版本。
打開命令行並啟動python解釋器:
python
我建議直接在解釋器中工作,或者編寫腳本並在命令行上運行它們,而不是大型編輯器和ide。保持簡單,關注機器學習而不是工具鏈。
輸入或複製粘貼以下腳本:
# 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__))
這裡我的OS X工作站得到的輸出:
Python: 3.6.11 (default, Jun 29 2020, 13:22:26)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]
scipy: 1.5.2
numpy: 1.19.1
matplotlib: 3.3.0
pandas: 1.1.0
sklearn: 0.23.2
將上面的輸出與您的版本進行比較。
理想情況下,您的版本應該匹配或更新。api不會快速變化,所以如果您已經落後了幾個版本,也不必太擔心,本教程中的所有內容很可能仍然適用。
如果你得到一個錯誤,停止。現在是解決問題的時候了。
如果您不能幹淨地運行上述腳本,您將無法完成本教程。
我最好的建議是百度搜索您的錯誤消息或在社區張貼一個問題。
2. 加載數據
我們將使用鳶尾花數據集。這個數據集很出名,因為幾乎每個人都在機器學習和統計中使用它作為「hello world」數據集。
該數據集包含150個鳶尾花的觀測值。花有四柱,以釐米為單位。第五列是觀察到的花的種類。所有觀察到的花都屬於三種花卉之一。
在這個步驟中,我們將從CSV文件URL加載iris數據。
# 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
...
所有內容都應該加載無誤。如果出現錯誤,請停止。在繼續之前,您需要一個工作的SciPy環境。請參閱上面關於設置環境的建議。
2.2負載數據集
我們可以直接從UCI機器學習庫加載數據。
我們使用panda來加載數據。接下來,我們還將使用pandas通過描述性統計和數據可視化來研究數據。
注意,我們在加載數據時指定了每個列的名稱。這將在我們稍後研究數據時有所幫助。
...
# 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)
數據集應該順利加載。
如果您確實有網絡問題,您可以將iris.csv文件下載到您的工作目錄中,並使用相同的方法加載它,將URL更改為本地文件名。
3.總結數據集
現在是時候看看數據了。
在這一步中,我們將以幾種不同的方式查看數據:
數據集的維數。
看看數據本身。
所有屬性的統計總結。
按類變量對數據進行細分。
不用擔心,每次查看數據都是一個命令。這些命令非常有用,您可以在未來的項目中反覆使用。
3.1數據集的維度
我們可以通過shape屬性快速了解數據包含多少實例(行)和多少屬性(列)。
# shape
print(dataset.shape)
您應該看到150個實例和5個屬性:
(150, 5)
3.2抓取數據
實際觀察你的數據也是一個好主意。
# head
print(dataset.head(20))
您應該看到數據的前20行:
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
3.3統計摘要
現在我們可以看一下每個屬性的摘要。
這包括計數、平均值、最小值和最大值以及一些百分比。
# descriptions
print(dataset.describe())
我們可以看到,所有的數值都有相同的尺度(釐米),範圍在0到8釐米之間。
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
3.4類分布
現在讓我們看一下屬於每個類的實例(行)的數量。我們可以把它看成絕對計數。
...
# class distribution
print(dataset.groupby('class').size())
我們可以看到,每個類都有相同數量的實例(數據集的50%或33%)。
class
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
3.5完整的示例
為了便於參考,我們可以將前面的所有元素綁定到一個腳本中。
下面列出了完整的示例。
# 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())
4. 數據可視化
現在我們對這些數據有了一個基本的了解。我們需要用一些可視化來擴展它。
我們會看兩種類型的圖:
使用單變量圖來更好地理解每個屬性。
多變量圖,以更好地理解屬性之間的關係。
4.1一元的情節
我們從一些單變量圖開始,也就是每個單獨變量的圖。
由於輸入變量是數值型的,我們可以創建每個變量的盒狀圖和須狀圖。
...
# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()
這讓我們對輸入屬性的分布有了更清晰的認識:
我們還可以為每個輸入變量創建直方圖,以了解其分布情況。
...
# histograms
dataset.hist()
pyplot.show()
看起來可能有兩個輸入變量是高斯分布。注意這一點很有用,因為我們可以使用可以利用這個假設的算法。
4.2多元情節
現在我們可以看看變量之間的相互作用。
首先,讓我們看一下所有屬性對的散點圖。這有助於發現輸入變量之間的結構化關係。
...
# scatter plot matrix
scatter_matrix(dataset)
pyplot.show()
注意一些屬性對的對角線分組。這表明了一種高相關性和可預測的關係。
4.3完整的示例
為了便於參考,我們可以將前面的所有元素綁定到一個腳本中。
下面列出了完整的示例。
# 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()
5. 計算算法
現在是時候創建一些數據模型,並在未見數據的基礎上評估它們的準確性了。
這是我們在這一步將要涵蓋的內容:
分離驗證數據集。
將測試工具設置為使用10倍交叉驗證。
建立多個不同的模型,以預測物種從花的測量
選擇最好的型號。
5.1創建驗證數據集
我們需要知道我們創建的模型是好的。
稍後,我們將使用統計方法來估計我們在不可見數據上創建的模型的準確性。我們還希望通過對實際未見數據的評估,對未見數據的最佳模型的準確性有一個更具體的估計。
也就是說,我們將保留一些算法無法看到的數據,我們將使用這些數據來獲得第二個獨立的想法,即最好的模型到底有多準確。
我們將把加載的數據集分成兩部分,其中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集。
5.2測試工具
我們將使用分層的10倍交叉驗證來估計模型的準確性。
這將把我們的數據集分成10個部分,在9上訓練,在1上測試,並重複所有的訓練-測試分割組合。
分層的意思是數據集的每次摺疊或分割的目標是具有與存在於整個訓練數據集中相同的按類別示例分布。
我們通過random_state參數將random seed設置為一個固定的數字,以確保每個算法對訓練數據集的相同分割進行評估。
我們使用「準確性」這個度量來評估模型。
這是正確預測實例的數量除以數據集中實例的總數乘以100得到一個百分比(例如95%準確)。在接下來運行build和評估每個模型時,我們將使用計分變量。
5.3建立模型
我們不知道哪種算法在這個問題上比較好,也不知道使用什麼配置。
我們從圖中得到一個想法,有些類在某些維度上是部分線性可分的,所以我們期望一般的好結果。
讓我們測試6種不同的算法:
邏輯回歸(LR)
線性判別分析(LDA)
再鄰居(資訊)。
分類和回歸樹(CART)。
高斯樸素貝葉斯(NB)。
支持向量機(SVM)。
這是簡單線性(LR和LDA)、非線性(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()))
5.4選擇最佳模型
我們現在有6個模型和每個模型的精度估計。我們需要對模型進行比較,選擇最準確的模型。
運行上面的例子,我們得到以下原始結果:
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)
注:由於算法或計算過程的隨機性,或數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次,並比較平均結果。
你得了多少分?
在下面的評論中發布你的結果。
在本例中,我們可以看到支持向量機(SVM)的估計精度得分最大,約為0.98或98%。
我們還可以創建一個模型評價結果圖,並比較每個模型的散布和平均精度。由於每種算法都被評估了10次(通過10次交叉驗證),因此每種算法都有一定的精度度量。
比較每種算法結果樣本的一種有用方法是為每個分布創建盒須圖並比較分布。
...
# Compare Algorithms
pyplot.boxplot(results, labels=names)
pyplot.title('Algorithm Comparison')
pyplot.show()
我們可以看到,盒狀圖和須狀圖被壓在範圍的頂部,許多評估達到了100%的精度,而一些則被壓到了高達80%的精度。
5.5完整的示例
為了便於參考,我們可以將前面的所有元素綁定到一個腳本中。
下面列出了完整的示例。
# 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:
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()))
# Compare Algorithms
pyplot.boxplot(results, labels=names)
pyplot.title('Algorithm Comparison')
pyplot.show()
6. 作出預測
我們必須選擇一種算法來進行預測。
上一節的結果表明SVM可能是最準確的模型。我們將使用這個模型作為我們的最終模型。
現在我們想了解一下驗證集上模型的準確性。
這將給我們一個獨立的最後檢查最佳模型的準確性。保留一個驗證集是很有價值的,以防在訓練期間出現紕漏,比如訓練集過擬合或數據洩漏。這兩個問題都會導致過於樂觀的結果。
6.1做出預測
我們可以在整個訓練數據集上擬合模型,並對驗證數據集進行預測。
....
# Evaluate predictions
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))
我們可以看到,在hold out數據集上,準確率是0.966或大約96%。
混淆矩陣提供了所犯錯誤的指示。
最後,分類報告根據精度、召回率、f1得分和支持程度提供了每個類的細分,顯示了優秀的結果(假設驗證數據集很小)。
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
6.3完整的示例
為了便於參考,我們可以將前面的所有元素綁定到一個腳本中。
下面列出了完整的示例。
# 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))
你可以用Python進行機器學習
完成以上的教程。最多需要5到10分鐘!
你不需要了解所有的事情。(至少現在不是)您的目標是從頭到尾運行教程並獲得結果。你不需要一開始就了解所有的事情。一邊走一邊把你的問題寫下來。大量使用Python中的幫助語法(「FunctionName」)來了解你正在使用的所有函數。
你不需要知道算法是如何工作的。了解機器學習算法的局限性以及如何配置機器學習算法是非常重要的。但是學習算法可以以後再說。你需要花很長一段時間慢慢積累這個算法知識。今天,先從熟悉這個平臺開始。
您不需要成為Python程式設計師。如果您是初學者,Python語言的語法可以很直觀。就像其他語言一樣,關注函數調用(例如function())和賦值(例如a = " b ")。這樣你就能大致理解了。你是一名開發人員,你知道如何快速掌握一門語言的基礎知識。現在就開始吧,稍後再深入細節。
你不需要成為一個機器學習專家。您可以在後面了解各種算法的優點和局限性,以後還可以閱讀大量的文章來複習機器學習項目的步驟,以及使用交叉驗證評估準確性的重要性。
那麼機器學習項目中的其他步驟呢?我們沒有涵蓋機器學習項目中的所有步驟,因為這是您的第一個項目,我們需要關注關鍵步驟。也就是,加載數據,查看數據,評估一些算法,做出一些預測。在後面的教程中,我們可以看到其他數據準備和結果改進任務。
總結
在這篇文章中,你一步一步地了解了如何用Python完成你的第一個機器學習項目。