10分鐘掌握Python-機器學習小項目

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

354.jpg

Python 是一種很是流行和強大的解釋性編程語言。不像 R 語言,Python 是個很完整的語言和平臺,你既能夠用來作研發,也能夠用來開發產品體系。css

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

若是用 Python 執行機器學習,剛開始時最好方式就是先完成一個小項目,爲何這麼說呢?nginx

由於這會讓你先懂得如何安裝和啓動 Python 解釋器(這是最起碼的要求吧)。
由於這會讓你從整體上知道怎樣一步步完成一個項目。
由於這會增長你的信心,或許能讓你開始建立本身的小項目。

新手很須要一個完整的小項目練手程序員

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

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

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

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

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

這麼一套流程操做下來,你大概就能明白其中的套路了。網絡

機器學習的 Hello World

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

由於屬性都是數值,因此你要知道這麼去導入和處理數據。

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

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

它只有 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 的語法會很陌生。和其它語言同樣,重點關注函數調用和賦值,後面再詳細深挖語法知識。

你也不用是個機器學習專家。 你能夠在後面學習每種算法的好處和侷限性,並且這方面有不少資料,好比關於機器學習項目的操做步驟,以及用驗證集評估模型的重要性等。

機器學習項目的其它步驟。 本文並無涉及機器學習項目的所有步驟,由於這畢竟是咱們的第一個項目,關注重要步驟就好了,也就是:導入數據、查看數據、評估算法、作出預測.https://pan.baidu.com/s/1gMRFcfB_hFUaybs9aT9crg  提取碼:9qbr 連接不知道會不會失效        python羣654234959,能夠一塊兒交流學習

相關文章
相關標籤/搜索