系列文章:《機器學習實戰》學習筆記
這是《機器學習實戰》的第一章,本章簡要介紹了下什么是機器學習、機器學習的主要任務和本書中將要用到的Python語言。現在機器學習(Machine learning)與人工智能(Artificial intelligence)這么火,介紹機器學習的文章網上有很多,有很多已經寫得相當好了,比如這篇:從機器學習談起,值得好好看看。本文肯定不會介紹得那樣全,只是討論《機器學習實戰》這本書中提到的一些機器學習基礎知識。
機器學習能讓我們自數據集中受到啟發,換句話說,我們會利用計算機來彰顯數據背后的真實含義。它既不是只會徒然模仿的機器人,也不是具有人類感情的仿生人。
現今,機器學習已應用於多個領域,遠超出大多數人的想象——
- 搜索引擎結果排序
- 垃圾郵件過濾器
- 商品推薦
- 手寫識別軟件
- 貸款信用判定
- ……
1. 何謂機器學習
簡單來說,機器學習是一個從無序數據中提取有用信息的過程。它橫跨計算機科學、工程技術和統計學等多個學科,需要多學科的知識。
互聯網時代,人們制造、收集了大量的數據,如何從這些數據中抽取出有價值的信息是一個非常值得研究的課題。現在也是個“數據為王”的年代,各個公司都在瘋狂得搜集用戶數據,個人信息、使用習慣、搜索記錄、觀看記錄甚至電子郵件內容……希望能從中發現用戶的喜好,挖掘用戶的需求。可謂誰擁有數據,誰就有下一個機會。然而光有這些數據是不夠的,海量的數據已經超出了直接計算的可行性,想要從中高效地提取信息就需要專門的學習算法,這就是機器學習的作用所在。我們需要機器學習算法,避免我們“迷失”在數據中,而找到更多的可用信息。
1 機器學習與統計學
順便說一句,機器學習同統計學有着很深的淵源。在計算機出現以前,統計學家早就做着分析、預測的工作。機器學習可以說是計算機科學同統計學的一個結合點,利用計算機工具將統計學理論轉化為代碼,應用在了更多領域。而機器學習和統計學現在也有一些區別,這也不單是理論與應用的問題,還有一些不同的關注點和側重點。關於這方面的討論也有很多可讀的文章:
- 機器學習專家與統計學家觀點上有哪些不同? - 知乎
- 人工智能機器學習統計學數據挖掘之間有什么區別? - 博客 - 伯樂在線
- Data Science, Machine Learning, and Statistics: what is in a name? | Win-Vector Blog
- What is the difference between statistics and machine learning? - Quora
2 關鍵術語
書中使用了一個簡單的“鳥類分類系統”作為切入點,介紹了機器學習算法中常用到的基本術語。這個系統用到的鳥物種分類表如下:
序號 | 體重(克) | 翼展(厘米) | 腳蹼 | 后背顏色 | 種屬 |
1 | 1000.1 | 125.0 | 無 | 棕色 | 紅尾鵟 |
2 | 3000.7 | 200.0 | 無 | 灰色 | 鷺鷹 |
3 | 3300.0 | 220.3 | 無 | 灰色 | 鷺鷹 |
4 | 4100.0 | 136.0 | 有 | 黑色 | 普通潛鳥 |
5 | 3.0 | 11.0 | 無 | 綠色 | 瑰麗蜂鳥 |
6 | 570.0 | 75.0 | 無 | 黑色 | 象牙喙啄木鳥 |
我們稱其為一個專家系統,因為它可以像一個研究鳥類的專家一樣識別鳥類的種屬。表中使用了四種不同的屬性值來區分不同鳥類。現實中,你可能會想測量更多的值。通常的做法是測量所有可測屬性,而后再挑選出重要部分。我們稱使用的這四種屬性為特征。 表中的每一行都是一個具有相關特征的實例或稱樣本。
1 特征數值的類型
表中的前兩種特征是連續型(數值型)的,即它的取值是連續的實數;第三種特征是二值型的,只可以取是或否;第四種特征是基於有限顏色范圍的枚舉型。我們稱二值型、枚舉型這樣只可以取有限個值的特征為離散型(標稱型)的。
2 機器學習的任務——分類
鳥類分類系統完成的是一個分類任務。這很好理解,因為這個系統要做的事是分給未知的(鳥類)樣本一個已知的種類。
3 機器學習算法的流程
我們首先要做的是算法訓練,即學習如何分類。即為算法輸入大量已分類數據作為算法的訓練集。訓練集是用於訓練機器學習算法的數據樣本集合。表中即包含六個訓練樣本的訓練集。每個訓練樣本有若干個特征(本例為4個)和一個目標變量(表示樣本所屬的類別)。目標變量是機器學習算法的預測結果,在分類算法中目標變量的類型通常是標稱型的。我們通常將分類問題中的目標變量稱為類別,並假定分類問題只存在有限個數的類別。
為了測試機器學習算法的效果,通常將現有數據分為兩套獨立的數據集:訓練數據和測試數據。當機器學習程序開始運行時,使用訓練樣本作為算法的輸入,訓練完成之后輸入測試樣本。輸入測試樣本時並不提供測試樣本的目標變量,而是由程序決定樣本的類別。通過比較程序預測的樣本類別與實際樣本類別(目標變量)之間的差異,就可以得出算法的實際精確度。
我們稱算法輸出的結果為模型。經過訓練、測試准確率良好的模型就可以被保存下來,用於對未知的鳥類樣本分類。
廢了半天話,是時候祭出這張經典的流程圖了(圖自李航《統計學習方法》):
4 機器學習的其他任務
機器學習的另一項任務是回歸,它主要用於預測數值型數據。一個很經典的例子就是統計學中的數據擬合曲線:給定數據點,計算最優擬合曲線,目標變量即這條曲線的參數。
分類和回歸均屬於監督學習(Supervised learning),即這類算法知道預測什么(存在目標變量)。
與之對應的是無監督學習(Unsupervised learning),此時數據沒有類別信息,也不會給定目標值。在無監督學習中,將數據集合分成由類似的對象組成的多個類的過程被稱為聚類;將尋找描述數據統計值的過程稱之為密度估計。此外,還包括減少數據特征的維度的算法,被稱為降維。
2. 尋找合適的機器學習算法
為一個實際問題應用機器學習算法時,可以從如下方面分別考慮:
1. 使用機器學習算法的目的(目標任務)。如果已有部分樣本和目標變量,想要預測未知樣本的目標變量的值,則可以選擇監督學習算法——根據目標變量的類型可以進一步分為分類算法(對離散型目標變量)和回歸算法(對連續型目標變量)。如果沒有或不存在樣本類型信息,則可以選擇無監督學習算法——使用聚類算法將數據划分為若干類;使用密度估計算法估計數據與每個分類的相似度(匹配度)。
2. 其次需要考慮的是數據問題。我們應該充分了解數據的特性,沒有統一的學習算法,(任何問題)都需要根據具體的數據做相應處理。需要考慮的問題有——數據的特征數量,特征值是離線型變量還是連續型變量,特征值的取值范圍,特征值的分布(是否分布不均、有些值很少出現),特征值中是否存在缺失的值,造成缺失的原因,數據中是否存在異常的值(數據是否完全可信),等等。
3. 多次試驗。一般並不存在最好的算法,嘗試不同算法的執行效果,比較其准確率、計算時間,綜合決定最終使用的機器學習算法。
3. 開發機器學習應用程序的步驟
- 收集數據。有很多方法收集樣本數據,如:制作網絡爬蟲從網站上抽取數據、從API中得到信息、設備傳感器發來的實測數據等等。
- 准備輸入數據。將數據轉換為計算機可處理的格式,如將離散數據轉換為整數值、填充缺失數據為特定的值。
- 分析輸入數據。如果數據的特征值低於三維,可以將這些數據點繪制出來,人工分析數據的特征,看是否有明顯的分布模式、是否存在明顯的異常值。對於大於三維的數據,可以使用降維的方法壓縮到三維以下,方便我們圖形化展示數據。這一步的主要作用是確保沒有垃圾數據,否則將降低算法性能。
- 訓練算法。機器學習算法從這一步才真正開始學習。對於無監督學習,因為不存在目標變量值,故不需要訓練算法,所有的算法集中在第五步。
- 測試算法。對於監督學習,在測試的步驟使用測試數據檢測算法的准確率(性能);對於無監督學習,運行機器學習算法,並使用其它方式檢驗算法性能。
- 使用算法。將機器學習算法轉換為應用程序,執行實際任務,以檢驗上述步驟是否可以在實際環境中正常工作。
4. 使用Python語言實現機器學習算法
本書中使用Python語言編寫實際代碼。Python語言具有很多優點(清晰的語法結構、可讀性、豐富的函數庫、高級的語法特性……),使其很適合用來實現機器學習算法。但是性能問題始終是Python語言最大的問題。由於它是一門解釋性語言,始終過不了性能這道坎兒。對此,可以使用PyPy這類帶有JIT的Python發行版,但是追求性能的場合終究還是逃不掉C和C++的。
——沒關系,把Python作為機器學習的教學語言還是足夠的。
書中的附錄部分有簡單介紹Python的語法,在本文中再寫這些就沒意思了。Python的入門門檻很低,網上有很多優秀的教程可供參考(比如這個:簡明Python教程)。
書中廣泛使用了Python的一個函數庫:NumPy,這個可謂Python做線性代數運算的必備函數庫,廣泛應用於不僅機器學習的各個數學計算領域。
在這里假設已經安裝了Python開發環境和NumPy函數庫。
在Python shell中輸入下列命令,將NumPy函數庫中的所有模塊導入當前的命名空間:
from numpy import *
生成一個4x4的隨機數組(array):
random.rand(4,4)
可見其數據類型為array,這是NumPy中的兩大主要類型之一。
將數組轉換為矩陣:
randMat = mat(random.rand(4,4))
可見其數據類型為mat,這是NumPy中的另一個主要類型。
矩陣求逆:
invRandMat = randMat.I
矩陣乘法:
randMat * invRandMat
獲得一個4x4單位矩陣:
myEye = eye(4)
學習資源匯總
博客文章:《從機器學習談起》、《Brief History of Machine Learning》
書籍:李航《統計學習方法》
在線學習資源:Coursera公開課 - Machine Learning、Coursera公開課 - 機器學習基石 (Machine Learning Foundations)(中文的哦),這兩個課程的老師分別是Andrew Ng和林軒田,也都是這個領域的大牛。
Python在線學習資源:簡明Python教程
以及隆重推薦這位大神的博客: