Python-機器學習小項目


原文地址:https://segmentfault.com/a/1190000017067753?utm_source=tag-newest

學習機器學習相關技術的最好方式就是先自己設計和完成一些小項目。

Python 是一種非常流行和強大的解釋性編程語言。不像 R 語言,Python 是個很完整的語言和平台,你既可以用來做研發,也可以用來開發產品體系。

而且,Python 還有很多模塊和程序庫供我們選擇,從而針對一個任務能有很多個解決方案。怎么樣,聽起來還是很厲害的吧?

如果用 Python 執行機器學習,剛開始時最好方式就是先完成一個小項目,為什么這么說呢?

因為這會讓你先懂得如何安裝和啟動 Python 解釋器(這是最起碼的要求吧)。
因為這會讓你從總體上知道怎樣一步步完成一個項目。
因為這會增加你的信心,或許能讓你開始創建自己的小項目。

新手很需要一個完整的小項目練手

教材書還有課程這些東西還是比較煩人的,雖然給你講解的很細,講的也很多,但都太零碎,你單靠這些很難領會這些知識點如何綜合運用到一起。

將機器學習運用到自己的數據集上時,就算是開始一個項目了。

一個機器學習項目可能並不是直線式的,但是很多步驟都是耳熟能詳:

定義問題。
准備數據。
評估算法。
優化結果。
呈現結果。

真正掌握一個新平台新工具的最好方法,就是用它一步步完成一個完整的機器學習項目,並涉及所有的重要步驟,也就是從導入數據,總結數據,評估算法到做出預測等。

這么一套流程操作下來,你大概就能明白其中的套路了。

機器學習的 Hello World

先開始拿來練手的一個最好的小項目就是分類鳶尾花(數據集鏈接),這項目很適合新手,因為非常簡單易懂。

因為屬性都是數值,所以你要知道這么去導入和處理數據。

該項目是個分類問題,能讓你練習操作一種相對簡單的監督式學習算法。

同時它也是個多類分類問題,因此可能需要一些特殊的處理方法。

它只有 4 個屬性和 150 個示例,意味着數據集很小,不會占太多內存。

所有數值屬性都有相同的單位和大小,在使用前無需進行特別的縮放和轉換。

下面我們就開始學習如何用 Python 執行機器學習中的 Hello World。

用 Python 進行機器學習:手把手教程

在這部分,我們會完成一個完整的機器學習小項目,下面是主要步驟:

安裝 Python 和 SciPy 平台。
導入數據集。
總結數據集。
可視化數據集。
評估算法。
做出預測。

可以自己試着敲命令行代碼,要想加快速度,也可以復制粘貼我的代碼。

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

如果你電腦上沒安裝,先安裝 Python 和 SciPy 平台。

這部分不再細說,因為網上有很多教程。

1.1 安裝 SciPy 程序庫

本文所用 Python 版本為 2.7 或 3.5 。

scipy numpy matplotlib pandas Sklearn 

安裝上面這些程序庫有很多種方法,建議選擇選擇一種方法,然后安裝這些程序庫都用這種方法。

SciPy 安裝頁面上提供了在多種系統安裝上文程序庫的詳細方法:

在 Mac OS 上,你可以用 macports 安裝 Python2.7 和這些程序庫,更多信息點擊這里
在 Linux 上,可以用你的軟件包管理器,就跟在 Fedora 上安裝 RPM 一樣。
如果你是 Windows 系統,建議安裝免費版的 Anaconda。

注意:上面這些方法的基礎是你的電腦上已經安裝了 0.18 或更高版本的 scikit-learn。

1.2啟動 Python,檢查程序版本

這一步很重要,一定要確保你成功安裝了 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 一般不會快速變化,所以如果你的版本有點低的話,也不用擔心,本教程仍然適用你后面的學習。

如果你在這里出現了錯誤,先暫停一下,修正錯誤。

如果你沒法流暢的運行上述腳本,那你后面就沒法完整地完成這篇教程。

建議針對你出現的錯誤上網搜一下,或者問問有經驗的人,比如上集智社區。

2.導入數據

我們要用的是鳶尾花數據集,這數據集很有名,幾乎入門學習機器學習的人最先用的數據集就是它了,可以說是機器學習數據集中的 Hello Word。

它包含了 150 個鳶尾花觀察值,花的測量值以厘米為單位分為 4 列。第 5 列是觀察到的花朵的種類。所有觀察花朵都屬於三個種類。

在這一步,我們會從 CSV 文件 URL 中導入鳶尾花數據。

2.1 導入程序庫

首先,我們導入本教程用到的所有模塊、函數和對象。

# Load libraries import pandas from pandas.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。我們下面還會接着用它來進行數據統計和可視化工作。

注意,我們在導入數據時會指明每一列的名字,這有助於后面我們處理數據。

# 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.data 文件下載至你的工作目錄,然后將 URL 改為本地文件名,用同樣的方法導入它。

3.總結數據集

現在我們可以看一看數據了。

在這一步,我們以多個方式分析一下數據:

數據集的維度。
詳細查看數據本身。
所有屬性的統計摘要。
數據根據類別變量的分類狀況。

別擔心,每種方式只有一行命令行。這些命令行不是一次性的,將來項目里可以重復使用,絕不浪費。

3.1 數據集維度

我們可以快速的了解數據的形狀屬性包含了多少行(示例)和多少列(屬性)。

# 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
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折交叉驗證。
搭建6個不同的模型根據花朵測量值預測出鳶尾花種類。
選出最佳模型。

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 部分,輪流將其中 9 份作為訓練數據,1份作為測試數據,進行試驗。

# Test options and evaluation metric seed = 7 scoring = 'accuracy'

現在我們用“准確率”這個維度去評估模型,也就是能正確預測出鳶尾花類別的比例。我們后面運行和評估模型時會使用分數變量。

5.3 搭建模型

針對這個問題,我們並不知道哪個算法最好,應當用哪些配置。我們從可視化圖表中能夠得知在有些維度上一些類別的部分是線性可分的,因此我們預期總體效果會不錯。

我們看看這 6 種算法:

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

這里面既有簡單的線性算法(LA和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.4 選擇最佳模型

我們現在獲得了 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 次(十折交叉驗證法)。

# 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 值等。

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

人人可用 Python 做機器學習任務

把上面的這篇教程過一遍,最多花你5-10分鍾!

你不需要什么都懂。 你的目標就是完整的跟着操作一遍這個教程,然后得到結果。剛開始你不必什么都懂。可以一邊做一邊列出問題,多用用 help(FunctionName) 幫你理解 Python 中的語法,學習你正在用的函數。

你不需要明白算法的原理 。當然,知道機器學習算法的局限性和配置方式很重要,但對算法原理的學習可以放在后頭。你應該循序漸進的了解算法的原理,在當前階段主要任務就是熟悉平台。

你也不必是個Python程序員。 如果你是個 Python 初學者,Python 的語法會很陌生。和其它語言一樣,重點關注函數調用和賦值,后面再詳細深挖語法知識。

你也不用是個機器學習專家。 你可以在后面學習每種算法的好處和局限性,而且這方面有很多資料,比如關於機器學習項目的操作步驟,以及用驗證集評估模型的重要性等。

機器學習項目的其它步驟。 本文並沒有涉及機器學習項目的全部步驟,因為這畢竟是我們的第一個項目,關注重要步驟就行了,也就是:導入數據、查看數據、評估算法、做出預測.


免責聲明!

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



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