使用Python完成你的第一個學習專案
你是否想使用python進行機器學習但卻難以入門? 在這篇教程中,你將用Python完成你的第一個機器學習專案。 在以下的教程中,你將學到:
- 下載並安裝Python SciPy,為Python中的機器學習安裝最有用的軟體包。
- 使用統計摘要和資料視覺化載入資料集並瞭解其結構。
- 建立6個機器學習模型,並挑選出最佳模型以確保準確性。
本教程為決心使用python進行機器學習的新手做一個講解。 讓我們開始吧!
- 2017/01 更新:更新後反映了版本0.18中的scikit- learn API的變化。
- 2017/03 更新:添加了有助於設定Python環境的連結。
圖片版權所有:cosmoflash
如何開始在Python中的機器學習?
學習機器學習的最好方式是設計和完成小型專案。
在入門時Python遇到的困難
Python是一種當下流行並且功能強大的解釋型語言。與R語言不同,Python有完善的語言和平臺,能用來研究和開發。 還有很多模組和庫可以選擇,提供多種方式來完成每個任務。 開始使用Python進行機器學習的最好方法是完成一個專案。
- 它將促使你安裝並啟動Python直譯器。
- 它讓你全面的觀察怎樣通過一個小專案。
- 它會給你信心,也許會驅動你繼續做自己的小專案。
初學者需要一個小型的端到端專案
很多書籍和課程讓人失望。他們給你很多方法和片段,但你永遠不會看到他們如何融合在一起。 當你將機器學習應用在自己的資料集時,你已經開始了一個專案。 機器學習專案可能不是線性的,但它有許多典型的步驟:
- 定義問題
- 準備資料
- 評估演算法。
- 改善成績。
- 得到結果。
真正開始新平臺或工具的最佳方式是通過一個機器學習專案進行端到端,並覆蓋關鍵步驟。也就是從載入資料、總結資料、評估演算法和做出一些預測。 如果可以這樣做,您將有一個可以在資料集之後的資料集上使用的模板。一旦你有更多的信心,你可以進一步的填補資料和改進結果的差距。
機器學習的Hello World
開始使用新工具的最好的小專案是鳶尾花的分類(如鳶尾花資料集)。 這是一個很好理解的專案。
- 屬性是數值型的,因此你必須弄清楚如何載入和處理資料。
- 這是一個分類問題,允許你練習更簡單的監督學習演算法。
- 這是一個多類的分類問題(多項式),可能需要一些專門的處理。
- 它只有4種屬性和150行,這意味著它很小,很容易與記憶體(以及螢幕或A4頁面)相匹配。
- 所有的數值屬性都是相同的單位和相同的比例,不需要任何特殊的縮放或變換來開始。
讓我們開始使用Python中的hello world機器學習專案。
Python中的機器學習:分步教程
在本節中,我們將通過端到端的小型機器學習專案進行工作。 以下是我們將要介紹的內容:
- 安裝Python和SciPy平臺
- 載入資料集
- 彙總資料集
- 視覺化資料集
- 評估一些演算法
- 做一些預測
慢慢來,一步一步做。 你可以嘗試自己輸入命令也可以通過複製貼上來加快速度。
1.下載,安裝和啟動Python SciPy
如果你的系統上沒安裝Python和SciPy平臺那就要安裝。 我不想太詳細地介紹這個,因為有別人已經有介紹過了,這對一個開發人員來說很簡單。
1.1安裝SciPy庫
本教程假定Python版本為2.7或3.5。 你需要安裝5個關鍵庫。以下是本教程所需的Python SciPy庫列表:
- SciPy
- numpy
- matplotlib
- pandas
- sklearn
有很多方法來安裝這些庫。 該SciPy的安裝頁面對多個不同的平臺提供了極好的說明書,如Linux,Mac OS X和Windows。如果你有任何疑問或疑問,請參閱本說明。
- 在Mac OS X上,你可以使用macports來安裝Python 2.7和這些庫。有關macports的更多資訊,請參閱主頁。
- 在Linux上,你可以使用包管理器,例如Fedora上的yum來安裝RPM。
如果你使用Windows或者你沒什麼信心,我建議安裝免費版本的Anaconda,其中包含你需要的一切。 注意:本教程假設你已經安裝scikit-learn版本0.18或更高版本。 需要更多幫助?請參閱以下教程之一:
- 如何為Anaconda設定機器學習和深度學習的Python環境
- 如何使用Python建立用於機器學習開發的Linux虛擬機器
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: 2.7.11 (default, Mar 1 2016, 18:40:10)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)]
scipy: 0.17.0
numpy: 1.10.4
matplotlib: 1.5.1
pandas: 0.17.1
sklearn: 0.18.1
將上述輸出與你的版本進行比較。 理想情況下,你的版本應該匹配或更新。API不會很快改變,所以如果你的版本更高,不必擔心,本教程中的所有內容很有可能仍然適用於你。 如果你收到錯誤,請停止。現在是修復它的時候了。 如果你無法正常執行上述指令碼,也無法完成本教程。 我最好的建議是在Google上搜索你的錯誤資訊或在Stack Exchange上釋出問題。
2.載入資料
我們將使用鳶尾花資料集。這個資料集很有名,因為它幾乎被大家用作機器學習和統計中的“hello world”。 該資料集包含150個鳶尾花觀測值。有四列測量花的尺寸。第五列是觀察到的花的種類。所有觀察到的花只有三種。 你可以在維基百科上了解有關此資料集的更多資訊。 在此步驟中,我們將從CSV檔案的URL載入鳶尾資料。
2.1匯入庫
首先,我們將匯入我們將在本教程中使用的所有模組,函式和物件。
# Load libraries
import pandas
from pandas.tools.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn import model_selection
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機器學習儲存庫載入資料。 我們正在使用pandas來載入資料。我們還將使用pandas來探索具有描述性統計資料和資料視覺化的資料。 請注意,我們在裝載資料時指定了每個列的名稱。這有助於我們稍後研究資料。
# Load dataset
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = pandas.read_csv(url, names=names)
資料集應該會載入的很順利 如果你有網路問題,可以下載iris。將資料檔案放入工作目錄,並使用相同的方法載入它,將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
4.資料視覺化
我們現在對資料有一個基本的瞭解。我們需要通過一些視覺化來讓自己更瞭解它。 我們要看兩種圖:
- 單變數圖更好地瞭解每個屬性。
- 多變數圖更好地瞭解屬性之間的關係。
4.1單變數圖
我們從一些單變數開始,即每個變數的曲線。 考慮到輸入變數是數值型,我們可以建立每個輸入變數的盒型圖。
# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
plt.show()
這使我們更清楚地瞭解輸入屬性的分佈:
我們還可以建立每個輸入變數的直方圖,以獲得分佈的概念。
# histograms
dataset.hist()
plt.show()
看起來可能有兩個輸入變數具有高斯分佈。這一點很有用,因為我們可以使用這種假設做演算法。
4.2多變數圖
現在我們可以看一下變數之間的相互作用。 首先,我們來看看所有屬性對的散點圖。這可以有助於發現輸入變數之間的結構化關係。
# scatter plot matrix
scatter_matrix(dataset)
plt.show()
注意這些接近對角線的組,這是高度的相關性和可預測關係的表現。
5.評估演算法
現在建立一些資料模型,並評估它們對未來資料預測的準確性。 下面是我們將要討論的內容是:
- 抽離一個驗證資料集。
- 設定測試工具使用10倍交叉驗證。
- 建立5種不同的模型來預測花卉測量中的種類。
- 選擇最好的模型。
5.1建立驗證資料集
我們需要知道,我們建立的模型有什麼用。 之後,我們將使用統計方法來估計我們在預測的資料上建立模型的準確性。我們還希望通過對實際預測資料進行評估,從而更具體地估計出最佳模型的準確性。 也就是說,我們將保留一些演算法無法看到的資料,我們將利用這些資料來確定模型究竟有多精確。 我們將把載入的資料集分為兩部分,其中80%將用於訓練我們的模型,20%將被用作驗證資料集。
# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
Y = array[:,4]
validation_size = 0.20
seed = 7
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)
你現在可以在X_train和Y_train中訓練資料為準備模型和X_validation和Y_validation集,因為我們一會兒用得上。
5.2測試工具
我們將使用10倍交叉驗證來估計精度。 這將把我們的資料集分為10個部分,在9上訓練,並在1上進行測試,並重複訓練分組的所有組合。
# Test options and evaluation metric
seed = 7
scoring = 'accuracy'
我們使用“ accuracy” 的度量來評估模型。這是正確預測例項的數量除以資料集中的例項總數乘以100的百分比(例如95%準確)的比率。 當我們執行構建並評估每個模型時,我們將使用評分變數。
5.3建立模型
我們不知道哪些演算法對這個問題或什麼配置使用是好的。我們從圖中得出一些想法,即某些類在某些方面是部分可線性分離的,所以我們期望一般的結果很好。 我們來評估6種不同的演算法:
- 邏輯迴歸(LR)
- 線性判別分析(LDA)
- 鄰近演算法(KNN)。
- 分類和迴歸樹(CART)。
- 高斯樸素貝葉斯(NB)。
- 支援向量機(SVM)。
這是簡單線性(LR和LDA),非線性(KNN,CART,NB和SVM)演算法的良好混合。我們在每次執行之前重置隨機數種子,以確保使用完全相同的資料分割來執行每個演算法的評估。它確保結果直接可比。 我們來建立和評估我們的五個模型:
# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))
# evaluate each model in turn
results = []
names = []
for name, model in models:
kfold = model_selection.KFold(n_splits=10, random_state=seed)
cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
results.append(cv_results)
names.append(name)
msg = '%s: %f (%f)' % (name, cv_results.mean(), cv_results.std())
print(msg)
5.3選擇最佳模型
我們現在每個都有6個模型和精度估計。我們需要將模型相互比較,並選擇最準確的。 執行上面的例子,我們得到以下原始結果: LR: 0.966667 (0.040825) LDA: 0.975000 (0.038188) KNN: 0.983333 (0.033333) CART: 0.975000 (0.038188) NB: 0.975000 (0.053359) SVM: 0.981667 (0.025000) 我們可以看到,看起來KNN具有最高的估計精度分數。 我們還可以建立模型評估結果的圖,並比較每個模型的差異和平均精度。每個演算法有一個精確度量的群體,因為每個演算法被評估10次(10次交叉驗證)。
# Compare Algorithms
fig = plt.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()
你可以看到盒型圖在頂部被壓扁,許多樣品達到100%的準確度。
6.做預測
KNN演算法是我們測試的最精確的模型。現在我們想知道驗證集上模型的準確性。 這讓我們對最佳模型的準確性進行獨立的最終檢查。保持一個驗證集是有用的,以防萬一你在訓練過程中犯錯,比如過擬合或資料外洩。兩者都將導致過於樂觀的結果。 我們可以直接在驗證集上執行KNN模型,並將結果總結為最終準確度分數,混淆矩陣和分類報告。
# Make predictions on validation dataset
knn = KNeighborsClassifier()
knn.fit(X_train, Y_train)
predictions = knn.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))
我們可以看到準確度是0.9即90%。混淆矩陣提供了三個錯誤的指示。最後,分類報告通過精確度,召回率,f1分數和支撐顯示出優異的結果(授予驗證資料集很小)提供每個類別的細目。
0.9
[[ 7 0 0]
[ 0 11 1]
[ 0 2 9]]
precision recall f1-score support
Iris-setosa 1.00 1.00 1.00 7
Iris-versicolor 0.85 0.92 0.88 12
Iris-virginica 0.90 0.82 0.86 11
avg / total 0.90 0.90 0.90 30
完成上面的教程,只需要5到10分鐘。
概要
在這篇文章中,你會逐步發現如何在Python中完成第一個機器學習專案。 你將發現,完成一個小型的端到端專案並將資料載入到預測中,是熟悉新平臺的最佳途徑。 原文地址:http://machinelearningmastery.com/machine-learning-in-python-step-by-step/