當前位置:
首頁 > 知識 > scikit-learn機器學習初體驗

scikit-learn機器學習初體驗

點擊上方

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!



Why


機器學習在圖像和語音識別領域已經有很多成熟的應用,比如:



  • 圖像識別,比如人臉識別



  • 機器翻譯



  • 語音輸入


那機器學習究竟是如何做到這些的呢?本文以圖像識別中比較簡單的數字識別為例來了解一下。


What


scikit-learn 是一個用於數據挖掘和分析的 Python 庫,完全開源並封裝了很多機器學習的演算法,我們可以很方便得對其提供的 

SVM

 演算法進行訓練並將其用於實際應用場景,解決一些數據量不是很大的問題。


下面的例子將演示如何使用 

sklearn

 庫中提供的數字圖片 

dataset

 來識別它們表示的實際數字。

最後畫出的圖形為:



How


安裝 scikit-learn


根據 numpy 官方文檔 的說明,官方發布的 源碼和包在 SourceForge 上。那麼分別從下面的地址下載安裝最新 release 版本:




  • SciPy: Scientific Library for Python



  • Numerical Python


解決了依賴項問題之後,通過下面的命令安裝 

sklearn

  1. pip install

    -

    U scikit

    -

    learn


一個手寫數字識別的例子


scikit_learn 官方有個例子,使用 

sklearn

 自帶的 

dataset

 對演算法進行訓練並用於手寫數字識別的例子。


準備工作



  • 按照本文前半部分的步驟安裝

    sklearn



  • 安裝 

    matplotlib

    的依賴庫 

    dateutil

  1. pip install  python

    -

    dateutil




  • 安裝 

    matplotlib

     的依賴庫 

    pyparsing

  1. pip install  pyparsing




  • 安裝科學計算庫 matplotlib


Python 代碼:

  1. # -*- coding: utf-8 -*-

  2. """

  3. ================================

  4. Recognizing hand-written digits

  5. ================================

  6. An example showing how the scikit-learn can be used to recognize images of

  7. hand-written digits.

  8. This example is commented in the

  9. :ref:`tutorial section of the user manual <introduction>`.

  10. """

  11. # 列印出上面的文檔信息,Python 裡面使用 """

  12. # 多行注釋的信息被當作文檔信息,可以對源代碼、類、方法等進行注釋從而生成文檔,是自解釋的機制

  13. print

    (

    __doc__

    )

  14. # 下面是 scikit----learn 官方例子的作者信息

  15. # Author: Gael Varoquaux <gael dot varoquaux at normalesup dot org>

  16. # License: BSD 3 clause

  17. # 導入用於科學計算的庫

  18. import

    matplotlib

    .

    pyplot

    as

    plt

  19. # 導入 sklearn 自帶的手寫數字 dataset,以及進行機器學習的模塊

  20. from

    sklearn

    import

    datasets

    ,

    svm

    ,

    metrics

  21. # 載入 sklearn 自帶的手寫數字 dataset

  22. digits

    =

    datasets

    .

    load_digits

    ()

  23. # 這裡我們感興趣的數據是不同灰度的 8x8 個小格子組成的圖像

  24. # 如果我們直接使用圖像進行處理,就需要使用 pylab.imread 來載入圖像數據,而且這些圖像數據必須都是 8x8 的格式

  25. # 對於這個 dataset 中的圖像,dataset.target 給出了它們實際對應的數字

  26. images_and_labels

    =

    list

    (

    zip

    (

    digits

    .

    images

    ,

    digits

    .

    target

    ))

  27. for

    index

    ,

    (

    image

    ,

    label

    )

    in

    enumerate

    (

    images_and_labels

    [:

    4

    ]):

  28.    plt

    .

    subplot

    (

    2

    ,

    4

    ,

    index

    +

    1

    )

  29.    plt

    .

    axis

    (

    "off"

    )

  30.    plt

    .

    imshow

    (

    image

    ,

    cmap

    =

    plt

    .

    cm

    .

    gray_r

    ,

    interpolation

    =

    "nearest"

    )

  31.    plt

    .

    title

    (

    "Training: %i"

    %

    label

    )

  32. # 為了使用分類器,需要將每個表示手寫圖像的 8x8 數字轉換為一個數字數組

  33. # 這樣 digits.images 就變為了(採樣,採樣特性)的一個矩陣

  34. n_samples

    =

    len

    (

    digits

    .

    images

    )

  35. data

    =

    digits

    .

    images

    .

    reshape

    ((

    n_samples

    ,

    -

    1

    ))

  36. print

    (

    digits

    .

    images

    [

    0

    ])

  37. print

    (

    data

    [

    0

    ])

  38. # 創建一個分類器,這裡 gamma 的值是給定的,可以通過 grid search 和 cross validation 等技術算出更好的值。

  39. # 下面的鏈接有個例子是自己算 gamma:

  40. # http://efavdb.com/machine-learning-with-wearable-sensors/

  41. classifier

    =

    svm

    .

    SVC

    (

    gamma

    =

    0.001

    )

  42. # 用前半部分數據訓練分類器

  43. classifier

    .

    fit

    (

    data

    [:

    n_samples

    /

    2

    ],

    digits

    .

    target

    [:

    n_samples

    /

    2

    ])

  44. # 對後半部分數據使用訓練好的分類器進行識別

  45. expected

    =

    digits

    .

    target

    [

    n_samples

    /

    2

    :]

  46. predicted

    =

    classifier

    .

    predict

    (

    data

    [

    n_samples

    /

    2

    :])

  47. # 列印分類器的運行時信息以及期望值和實際識別的值

  48. print

    (

    "Classification report for classifier %s:n%sn"

  49.      

    %

    (

    classifier

    ,

    metrics

    .

    classification_report

    (

    expected

    ,

    predicted

    )))

  50. print

    (

    "Confusion matrix:n%s"

    %

  51.      metrics

    .

    confusion_matrix

    (

    expected

    ,

    predicted

    ))

  52. # 畫出手寫數字的圖像並給出識別出的值

  53. images_and_predictions

    =

    list

    (

  54.    zip

    (

    digits

    .

    images

    [

    n_samples

    /

    2

    :],

    predicted

    ))

  55. for

    index

    ,

    (

    image

    ,

    prediction

    )

    in

    enumerate

    (

    images_and_predictions

    [:

    4

    ]):

  56.    plt

    .

    subplot

    (

    2

    ,

    4

    ,

    index

    +

    5

    )

  57.    plt

    .

    axis

    (

    "off"

    )

  58.    plt

    .

    imshow

    (

    image

    ,

    cmap

    =

    plt

    .

    cm

    .

    gray_r

    ,

    interpolation

    =

    "nearest"

    )

  59.    plt

    .

    title

    (

    "Prediction: %i"

    %

    prediction

    )

  60. plt

    .

    show

    ()


下面的代碼將輸出注釋中提到的將 8 x 8 數字矩陣轉換為數組:

  1. n_samples

    =

    len

    (

    digits

    .

    images

    )

  2. data

    =

    digits

    .

    images

    .

    reshape

    ((

    n_samples

    ,

    -

    1

    ))

  3. print

    (

    "Number picture matrix:"

    )

  4. print

    (

    digits

    .

    images

    [

    0

    ])

  5. print

    (

    "flatten array:"

    )

  6. print

    (

    data

    [

    0

    ])


其輸出為:

  1. Number

    picture matrix

    :

  2. [[

    0.

     

    0.

     

    5.

     

    13.

     

    9.

     

    1.

     

    0.

     

    0.

    ]

  3. [

    0.

     

    0.

     

    13.

     

    15.

     

    10.

     

    15.

     

    5.

     

    0.

    ]

  4. [

    0.

     

    3.

     

    15.

     

    2.

     

    0.

     

    11.

     

    8.

     

    0.

    ]

  5. [

    0.

     

    4.

     

    12.

     

    0.

     

    0.

     

    8.

     

    8.

     

    0.

    ]

  6. [

    0.

     

    5.

     

    8.

     

    0.

     

    0.

     

    9.

     

    8.

     

    0.

    ]

  7. [

    0.

     

    4.

     

    11.

     

    0.

     

    1.

     

    12.

     

    7.

     

    0.

    ]

  8. [

    0.

     

    2.

     

    14.

     

    5.

     

    10.

     

    12.

     

    0.

     

    0.

    ]

  9. [

    0.

     

    0.

     

    6.

     

    13.

     

    10.

     

    0.

     

    0.

     

    0.

    ]]

  10. flatten array

    :

  11. [

    0.

     

    0.

     

    5.

     

    13.

     

    9.

     

    1.

     

    0.

     

    0.

     

    0.

     

    0.

     

    13.

     

    15.

     

    10.

     

    15.

     

    5.

  12. 0.

     

    0.

     

    3.

     

    15.

     

    2.

     

    0.

     

    11.

     

    8.

     

    0.

     

    0.

     

    4.

     

    12.

     

    0.

     

    0.

     

    8.

  13. 8.

     

    0.

     

    0.

     

    5.

     

    8.

     

    0.

     

    0.

     

    9.

     

    8.

     

    0.

     

    0.

     

    4.

     

    11.

     

    0.

     

    1.

  14. 12.

     

    7.

     

    0.

     

    0.

     

    2.

     

    14.

     

    5.

     

    10.

     

    12.

     

    0.

     

    0.

     

    0.

     

    0.

     

    6.

     

    13.

  15. 10.

     

    0.

     

    0.

     

    0.

    ]


從結果看,識別率已經很高,如果有更多更多樣化的訓練數據並且自己算 

gamma

 參數的話,結果還能更好:

  1.             precision    recall  f1

    -

    score   support

  2.          

    0

         

    1.00

         

    0.99

         

    0.99

           

    88

  3.          

    1

         

    0.99

         

    0.97

         

    0.98

           

    91

  4.          

    2

         

    0.99

         

    0.99

         

    0.99

           

    86

  5.          

    3

         

    0.98

         

    0.87

         

    0.92

           

    91

  6.          

    4

         

    0.99

         

    0.96

         

    0.97

           

    92

  7.          

    5

         

    0.95

         

    0.97

         

    0.96

           

    91

  8.          

    6

         

    0.99

         

    0.99

         

    0.99

           

    91

  9.          

    7

         

    0.96

         

    0.99

         

    0.97

           

    89

  10.          

    8

         

    0.94

         

    1.00

         

    0.97

           

    88

  11.          

    9

         

    0.93

         

    0.98

         

    0.95

           

    92

  12. avg

    /

    total      

    0.97

         

    0.97

         

    0.97

         

    899





  • 作者:xhrwang



  • 原文鏈接:

    http://xhrwang.me/2015/02/13/scikit_learn-tutorial.html

     



  • Python開發整理髮布,轉載請聯繫作者獲得授權


【點擊成為Java大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

你用 Python 寫過哪些牛逼的程序/腳本?

TAG:Python開發 |