機器學習筆記1 - Hello World In Machine Learning

前言

Alpha Go在16年以4:1的戰績戰勝了李世石,17年又以3:0的戰績打敗了中國圍棋天才柯潔,這真是科技界振奮人心的進步。伴隨着媒體的大量宣傳,此事變成了婦孺皆知的大事件。你們又開始激烈的討論機器人何時會取代人類統治世界的問題。python

其實人工智能在上世紀五、60年代就開始進入了理論研究階段,人們在不斷探索人工智能技術的同時,也擔心起機器人會不會替代人類。然而現實比理想殘酷的多,因爲當時各類條件的限制(理論基礎、技術基礎、數據基礎、硬件性能等),人工智能相關的項目進度緩慢,也缺乏實際成效,研發資金、社會關注度也愈來愈低,人工智能進入第一次低谷期。程序員

到了80年代,卡內基梅隆大學爲數字設備公司設計了一套名爲XCON的「專家系統」。這是一種,採用人工智能程序的系統,能夠簡單的理解爲「知識庫+推理機」的組合,XCON是一套具備完整專業知識和經驗的計算機智能系統。人工智能再一次被各國政府和科研機構看好,大量的資金投入到研發中,可是好景不長,幾年後隨着蘋果和IBM公司研發出了性能強勁的PC機,致使「專家系統」變得沒有競爭力,人工智能發展又一次進入寒冬。算法

隨後若干年,人工智能的發展趨於平穩和低調。時間來到21世紀,隨着互聯網的普及,大量數據被積累下來;摩爾定律一次又一次的被證明,計算機硬件性能以極快的速度在增加;「雲」的普及,讓普通大衆也能輕鬆擁有調度大量算力的機會,人工智能再也不是科學家和專業人員在實驗室才能研究的東西了。數據+算力+易得這幾方面的因素結合以後,將人工智能再一次推向了高潮。編程

可能這一波熱潮又是人工智能發展史上的一個波峯,將來人工智能還有很長的路要走。但目前的人工智能發展已經惠及到商業領域,在這樣一種技術+商業的結合中,我我的仍是很看好此次浪潮的。尤爲是在看過《最強大腦》中,百度在圖像、音頻方面的人工智能技術發展到這樣一個水平以後(圖像識別已經超超越了人類大腦對圖像的識別能力,聲音識別也幾乎和人類最高水平持平),很但願本身也能夠有機會涉足到這個領域中。架構


機器學習基礎入門知識

機器學習是人工智能的一個分支,主要是經過數據+算法來訓練得出模型,再用模型來預測數據的一種技術。機器學習

剛開始接觸機器學習,發現基礎理論中好多都是大學裏學過的數理知識(一直以來困擾個人「大學爲何要學這些東西」的謎團總算被解開了:)。我我的作了Web開發近十載,大部分是應用級的,不多涉及數理算法,看來從此還要慢慢拾起這些知識。不過剛開始入門能夠按部就班,先弄懂機器學習是怎麼回事,動手作一個「Hello world」,而後再逐步深刻原理層面的知識。編程語言

要涉足機器學習,最好會一種編程語言,這點上咱們程序員有先天優點。目前用於機器學習的主流語言是PythonRR我我的還沒研究過,我的以爲Python是一個比較好的選擇,流行度高、上手難度低、科學計算類庫豐富、語法精簡,若是自己就有其餘面向對象的編程語言基礎,不到一週就能夠基本掌握Python了。性能

機器學習從從業分佈來看,能夠分紅基礎算法研究(設計師)和應(ban)用(zhuan)兩個領域,其中大部分人都是在應(ban)用(zhuan)這個領域。學習

若是從技術層面來看,機器學習分紅監督學習無監督學習以及半監督學習。如何來區分呢?首先解釋下機器學習中的幾個名詞。編碼

  • 特性(Features) - 其實就是數據
  • 分類器(Classifier) - 其實就是算法
  • 標籤(Labels) - 其實就是種類
  • 模型(Models) - 其實就是最終輸出的分類公式

監督學習,就是在有標籤的前提下,找到一種最合適的分類器,分析特性標籤之間的關係。
無監督學習,就是沒有標籤的前提下,將數據進行聚類(Clusting)
半監督學習,就是部分特性標籤,部分則沒有的情況(大部分特性多是沒有標籤的狀況)下進行分類。

監督學習相對來講最簡單,由已知特性標籤,利用合適的分類器訓練出模型,再以模型套用到數據中來預測出數據的標籤。固然,分類器並不須要咱們本身來發明創造,咱們大部分人也沒這個能力作這些事情,全部的理論研究、科學論證、代碼實現都是現成的。Python中有不少相關類庫,好比scikit-learn。應用層面的機器學習,其實就是經過不停的調參(收集更多的數據、變換算法、選取合適的特徵數據等工做)來找到一種更精準的預測模型的工做。


Hello World In Machine Learning

假設咱們如今須要區分皮球(以直徑15cm-25cm之間的球爲例)和甜瓜的圖片,若是是傳統的硬編碼的方式來寫代碼的話,可能須要寫幾百上千個if-else才能完成一個基本的算法,並且可擴展性特別差,好比若是圖片是黑白的或者圖片中有干擾物品,那可能須要修改源代碼,添加更多的if-else來增長準確度。更糟的是,真正執行的時候會遇到不少事先沒有預料到的特殊狀況。
但若是經過機器學習,這個事情可能就會變得很簡單。大體步驟以下:

  1. 將圖片轉換成特徵向量(這個進階知識不在本篇中涉及)
  2. 決定一種合適當前場景的分類器
  3. 結合1中獲得的特徵2中獲得的分類器訓練出模型
  4. 模型中的公式預測數據,估算出其屬於某個標籤的可能性,最大可能性的那個即模型推算出的結果


數據準備

轉換過程略,假設共N條數據,轉換獲得的特性以下:

直徑(釐米) 形狀 顏色 標籤
24 round white melon
35 ellipse white melon
24 round orange ball
24 ellipse yellow melon
22 round yellow ball
... ... ... ...


實現代碼

features = [
    [24, 'round', 'white'],
    [35, 'ellipse', 'white'],
    [24, 'round', 'orange'],
    [24, 'ellipse', 'yellow'],
    [22, 'round', 'yellow'],
    ...
]

labels = ['melon', 'melon', 'ball', 'melon', 'ball']

咱們知道,計算機處理基礎數據類型的速度,由快及慢爲:boolintfloatstring...,所以,咱們在處理數據的過程當中,須要把原始數據抽象成計算機能最快處理的數據類型(由於機器學習運算量極大)。所以上面的代碼通過轉換以後:

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

這裏順便提一下,大部分機器學習中,都是以GPU的性能來衡量處理速度的,而不是咱們通常使用的CPU,這是由於GPU的物理架構和CPU不同,GPU是專門爲了處理圖像而設計的,它對浮點數的處理速度是CPU的數十倍乃至數百倍。而機器學習基本上能夠看作是對浮點數的大量運算,所以GPU更適合在機器學習領域被使用。


算法選取

機器學習中,解決一個問題的算法並非惟一的,同一個問題能夠適用不一樣的算法來解決,通常都會在效率準確率之間作權衡。本例中咱們使用決策樹(Deccision Tree)做爲Classifier,關於決策樹,可參考https://baike.baidu.com/item/%E5%86%B3%E7%AD%96%E6%A0%91


實現代碼

from sklearn import tree
...
# 實例化classifier
clf = tree.DecisionTreeClassifier()


訓練模型

scikit-learnclassifier中經過方法fit(features, labels)來訓練模型。其返回值即咱們所需的模型


實現代碼

...
clf = tree.fit(features, labels)
...


預測數據

有了模型,咱們就能夠對從此的數據進行預測,以得出label值,從而達到對其歸類的目的。


實現代碼

...
# 假設如今有一個數據[23, 'round', 'white'],咱們想知道他應該數據什麼類型,先將其轉換爲[23, 1, 1], 而後調用模型的predict方法
print(clf.predict([[23, 1, 1]]))
...

獲得的結果爲:

# 表明機器學習測算得出結果是melon
[1]


完整代碼

from sklearn import tree

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

# 實例化classifier
clf = tree.DecisionTreeClassifier()
# 訓練
clf = clf.fit(features, labels)

print(clf.predict([[23, 1, 1]]))


後記

上例中,若是經過真正的人工智能肉眼來看,[23, 'round', 'white']被推算爲melon的準確度其實並不高,由於[23, 'round', 'white']歸類爲ball也徹底是能夠的。上文提到過,機器學習其實就是不停的尋找合適的數據和算法以提高準確率的過程。想要提高準確率,咱們能夠有如下思路:

  • 加大訓練樣本量(訓練樣本必須和訓練效率作好權衡,另外,最好避免重複的特性浪費算力,好比有了直徑這列,就不須要半徑、周長這樣的特性了,這三者表明的是一個意思)
  • 變換算法(能夠選用更高級的算法或者多個算法組合,但必須在準確度和效率之間作好權衡)
  • 抽象出更多的特性數據(好比本例中,若是有辦法抽象出質量這樣的特性,那對於預測準確率會有極大的提高)

至此爲止,咱們機器學習的Hello World程序已經完成了,也基本瞭解了機器學習是怎麼回事,是否是還挺有意思的?



本文在個人博客園個人我的博客上同步發佈,做者保留版權,轉載請註明來源。

相關文章
相關標籤/搜索