機器學習的定義
1. 引言
清晨微風徐徐,幾隻小鳥兒銅鈴般的叫聲喚醒了我。我輕輕地推開了窗,一股新鮮潮濕而又芳香的空氣撲面而來,深吸一口氣這就是雨後的味道!我打開了電視機,中央五台正在轉播美職籃西部決賽勇士對雷霆第七場第四節,我一看勇士領先10分而且是主場,心想雷霆絕對會輸。突然發現自己 Python 作業還沒做,關上了電視,泡了杯咖啡,點了一支煙,然後聚精會神的怒寫三行代碼完美的完成了"HelloWorld.py" 的作業。
回頭看第一段話的粗體部分,我們會發現這裡涉及很多基於經驗做出的預判。例如,為什麼早上空氣潮濕芳香就認為夜裡下雨了呢?這是因為我們在生活經驗中已經遇到類似情況。為什麼勇士第四節主場領先10分就認為雷霆會輸呢?因為這個賽季勇士主場只輸過兩場,而且第四節還領先時獲勝率是百分之百。這些對經驗的利用是靠我們人類自身完成的,但這是個機器學習嗎?對於回答是的同學,excuse me? 人類是機器 (計算機) 嗎?再看第一段斜體部分,通過計算機用 Python 寫了 print "Hello World!", 但這個機器學習嗎?對於回答是的同學,come on,列印一句話 「你好世界」 也叫學習?
所以什麼是機器學習?一言以蔽之就是利用機器來學習,我知道讀到這裡大家可能要取消關注我了,心想這 TM 還用你來說?耐心點下面就給大家嚴肅的東西。談到機器學習就一定要提起一個人就是湯姆米切爾 (Tom M.Mitchell),就像談音樂就會提起貝多芬,談籃球就會提起喬丹,談電影就會提起萊昂納多迪卡普里奧。Mitchell 對機器學習定義的原話是:
A computerprogram is said to learnfrom experience E with respect to some class of tasks Tand performance measure P if its performance attasks in T,as measured by P, improveswith experience E
有點抽象難懂對嗎?但首先注意黑色粗字 computer program 和 learn 不就是機器(計算機程序)和學習的意思嗎?之後我把這段話翻譯成中文就可以發掘該定義里更多深層的內容了,中文定義為:
假設用性能度量 P 來評估計算機程序在某類任務的性能,若一個程序通利用經驗 E 在任務 T 中改善其性能,我們就說關於性能度量 P 和任務 T,程序對經驗 E 進行了學習。
在該定義中,除了核心詞機器和學習, 還有關鍵詞經驗 E,性能度量 P 和任務 T。在計算機系統中,通常「經驗」是以「數據」形式存在,而機器學習就是給定不同的任務從數據中產生模型的演算法,即「學習演算法」 (leanring algorithm)。於是兩個問題應運而生:
- 模型的性能到底怎麼評估?這就需要根據不同類型任務 T 定義不同的性能度量 P。
- 模型的性能的好壞通常要從沒有見過的數據 (unseen data) 上體現,但是這就很矛盾了,因為在學習演算法就是基於看到的數據,你根本不知道你沒看到的數據(未來發生的)是什麼樣的。難道這意味著我們在現在這個時點就沒能力評估模型性能?
接下來三節我會從數據,任務和性能度量三個方面高層的介紹機器學習。你不需要了解任何演算法就可以理解它們,它們非常簡單但又非常重要。
2. 數據
2.1 乾淨數據
對於任何模型,「垃圾進垃圾出」(GIGO, garbage in garbage out) 這個公理永遠成立。如果用於建模的演算法基於的數據是沒有代表性,低質量,不幹凈的等等,那就千萬不要浪費時間建模而首要事情是處理數據 (tidy data)。處理數據是一門很深的學問,今後在《數據科學》那個課題下我在會詳細描述。在《機器學習》這個課題下,我們主要還是關注演算法,因此假設數據是有代表性高質量的。對於一個大問題,這樣假設其他環節沒問題,一次集中解決一個環節到最後再總結整合會更高效些。
假設我們收集了勒布朗詹姆斯 (Lebron James) 在最近四場的數據,如下圖。
根據大神 Hadley Wickhan 在他 2014 年在 Tide Data 文中對乾淨數據的定義:
- 每一列代表一個變數 (each variable forms a column),例如「得分」,「籃板」和「助攻」。
- 每一行代表一個記錄 (each observation forms a row),例如 [得分 = 27, 籃板 = 10, 助攻 = 12]。
上面表格中的數據是乾淨的。
2.2 術語
下面術語大家在深入了解機器學習前一定要弄清楚:
- 這組記錄的集合稱為一個「數據集」 (data set)。
- 其中每條記錄是關於一個對象 (這裡是一場比賽詹姆斯的個人統計)的描述,稱為一個「示例」 (instance) 或「樣本」 (sample)。
- 反映對象在某方面的表現或性質,例如「得分」,「籃板」,「助攻」,成為「屬性」 (attribute)或「特徵」 (feature)或「輸入變數」 (inputvariable)。
- 屬性上的取值,例如 27, 10, 12 (第一行的值) 成為「屬性值」 (attribute value)。
假設我們想學習的問題是詹姆斯的得分籃板助攻到達什麼水平可以幫助騎士贏球?我們可以在上表加多一列數據標記「輸贏」,見下圖。
咋一看可以發現先好像詹姆斯助攻上10就可贏球,反之得分再多也不行。這也合理,因為助攻多就讓隊友全部參與整個隊配合就流暢,贏球也不奇怪了。但是這個只是第一眼直覺 (hunch),不是模型。如果希望學到一個根據詹姆斯個人統計來判斷騎士輸贏的模型,我們須獲得一個結果信息 (輸贏),如 [[得分 =27, 籃板 =10, 助攻 =12], 贏]。
更多術語:
- 關於示例結果的信息,例如「贏」,成為「標記」 (label)或 「輸出變數」 (output variable)。
- 擁有標記信息的示例,則稱為「樣例」 (example)。
- 從數據中學得模型的過程成為「學習」 (learning) 或 「訓練」 (training)。
- 在訓練數據中,每個樣例成為一個「訓練樣例」 (training example),它們的集合稱為「訓練集」 (training set)。
所有東西濃縮為一張圖如下:
2.3 數學符號
接下來是數學符號 (mathematical notation),我個人喜歡用一致性的符號,在接下來演算法研究的帖子里,我都會用本貼定義的符號。如果你現在不想看可以跳過不影響整篇的閱讀,以後隨時需要可以查閱本貼。
通常令
表示包含 m 個樣例的輸入變數和輸出變數。每個示例由 d 個屬性描述 (例如詹姆斯個人統計使用了 3 個屬性),則每個示例
所有東西濃縮為一張圖如下:
3. 任務
根據訓練數據是否擁有標記,學習任務可大致分兩類:監督學習 (有標記) 和無監督學習 (無標記)。還有一種叫強化學習 (有一些評級標記)。我們先把注意力放在前兩個。
3.1 監督學習 (supervised learning)
在監督學習中,數據包含輸出變數或標記,而其主要任務是分類和回歸。以上述詹姆斯為例:
- 如果我們預測的是離散值 (discretevalue),例如「贏」,「輸」,此類學習任務稱為 「分類」 (classification)
- 如果我們預測的是連續值 (continuous value),例如詹姆斯效率 65.1, 70.3 等等,此類學習任務稱為 「回歸」 (regression)
在分類任務中:
- 對只涉及兩個類別的,稱其為「二分類」 (binary classification) 任務,通常一個類為「正類」 (positive class),比如贏球;另一個類為「反類」 (negative class),比如輸球。
- 對只涉及兩個以上類別的,稱其為「多分類」 (multi-class classification) 任務。一個例子就是假設詹姆斯去踢足球,這樣標記會有三類,贏輸平。
3.2 無監督學習 (unspuervised learning)
在無監督學習中,數據不包含輸出變數或標記,而其主要任務是發掘模式。除了根據詹姆斯個人統計來預測騎士隊輸贏或者他個人效率值,我們還可以對他做「聚類」 (clustering), 即將訓練集中的數據分成若干組,每組成為一個「簇」 (cluster)。比如生成了下面四個簇:
- 最佳防守陣容,不是得分王,最有價值球員 (MVP)
- 不是最佳防守陣容,不是得分王,不是最有價值球員
- 不是最佳防守陣容,得分王,不是最有價值球員
- 最佳防守陣容,得分王,最有價值球員
聚類一個用處就是可以找到一個潛在的原因來解釋為什麼詹姆士在第 2, 3 種情況不是最有價值球員。難道真的是 defense wins MVP? Just saying ...
4. 性能度量 (performance measure)
對模型進行評估,不僅需要有效可行的實驗估計方法,還需要衡量模型泛化能力的評價標準,稱之為性能度量。性能度量是個任務相關的,接下來我們就拿監督學習里的回歸和分類任務和無監督學習里的聚類任務為例,來給出它們相對應的性能度量。
4.1 回歸任務 (regression)
在回歸任務中,給定訓練數據集
要評估模型 h 的性能,就要把模型預測結果 h(x) 與真實標記 y 進行比較。回歸任務最常用的性能度量是「均方誤差」 (MSE, mean square error)
4.2 分類任務 (classification)
精度和錯誤率 (accuracy & error)
通常我們把分類錯誤的樣本數占樣本總數的比例稱為「錯誤率」 (error),相應的分類正確的樣本數占樣本總數的比例稱為「精度」 (accuracy)。假設在 m 個樣本中有 a 個樣本分類錯誤,則錯誤率為 a/m,而精度為 1 -a/m。
查准率和查全率 (precision & recall)
錯誤率和精度雖然常用,但是不能滿足所有任務需求。以詹姆斯問題為例,假定我們用訓練好的模型預測騎士贏球,顯然,錯誤率衡量了多少比率的比賽實際是贏了但判斷成輸了。但是若我們關心的是「預測出的比賽中有多少比例是贏球」,或者「贏球的比賽中有多少被預測出來了」,那麼錯誤率顯然就不夠用了,這是需要使用其他的性能度量,也就是「查准率」 (precision) 和「查全率」 (recall)。有人也稱它們為準確率和召回率,但我覺得前者定義更直觀,因為查准率就是查準的 (查出東西多少是有用的不就是准嗎?),而查全率就是查全的 (有用的東西有多少被查出不就是全嗎?)。
對於二分類問題,可將樣例根據其真實類別與模型預測類別的組合劃分為真正例 (true positive, TP),真反例 (true negative, TN), 假正例 (false positive, FP) 和假反例 (false negative, FN)。其中
- 預測類別的真假來描述「正例反例」,如果「預測為真」就是「正例」,如果「預測為假」就是「反例」。
- 真實類別和預測類別的同異來描述「真假」,如果「相同」就是「真」,如果「不同」就是「假」。
- 真正例就是預測類別為真且和真實類別相同,真反例就是預測類別為假且和真實類別相同,假正例就是預測類別為真但和真實類別不同,假反例就是預測類別為假但和真實類別不同。
- 如果我們目標是挑選真實類別為真的例子,那麼真正例和假正例是實際挑出的集合 (因為你挑出的真實類別總會有真假,但是目標是正例,正負得負,負正得負)。而真正例和假反例是夢想挑出的集合 (因為夢想挑出的是真實類別為真的例子,只不過一部分挑對了劃分為真正例,一部分挑錯了劃分為假反例,正正得正,負負得正)。
- TP + TN + FP + FN = 樣本總數
一旦你捋順上訴繞口 (mouthful) 的劃分,下圖的意義不言而喻;如果沒有捋順,希望下圖能直觀的幫助你。
著名的「混淆矩陣」 (confusion matrix) 如下表:(這名字起得真TM好,混淆死我了)
查准率 P 和查全率 R 定義如下:
P = TP / (TP + FP),R = TP / (TP +FN)
查准率和查全率是一對矛盾的度量。一般來說:
- 查准率高時,查全率往往低
- 查全率高時,查准率往往低
比如,打三國殺時,你是主公,你想殺反賊而不錯殺忠臣,你可以只選最有把握的殺,就是不殺任何人,因此查准率 100% 而查全率 0%; 或者你想殺掉所有反賊,你可以通過增加殺人的數量把所有人殺了,這樣你的確殺掉所有反賊了,因此查全率 100% 而查准率 60% (假設6人場1主公1忠1內3反)。通常在一些非常簡單的任務或者你作弊時,查准率和查全率都很高。比如你知道每個人的身份牌,那你當然一殺一個準直到清場,查准率和查全率都是 100%。
F1度量
F1 度量是基於查准率和查全率的調和平均 (harmonic mean) 定義的:
跟算術平均 (arithmetic mean, P+R) 和幾何平均 (geometric mean, sqrt(PR)) 相比,調和平均更重視較小值。可從上式左邊部分看出,P 和 R 都在分母位置,較小那個的變動比較大那個的變動對 F1 值影響更大些。F1 度量的一個弊端是對查准率和查全率重視程度相同,但是在實際的機器學習問題中,我們通常會對查准率和查全率有不同的重視程度。比如:- 例子1:在亞馬遜推薦商品時,為了儘可能少打擾用戶,更希望推薦內容是用戶感興趣的,此時查准率更重要。
- 例子2:在 FBI 追逃犯時,更希望的是少漏掉逃犯,寧可錯殺一千也不放走一個,此時查全率更重要。
- 例子3:在癌症診斷時,如果你跟一個沒有癌症的病人說得了癌症 (追求查全率), 病人會壓力很大而且花費很多在測試上;如果你跟得了癌症的病人說沒得癌症 (追求查准率),這可能是個生死攸關的做法。此時似乎查准率和查全率都重要 (個人認為查准率更重要,畢竟生死大過金錢),我們只能不斷改進模型咯。
- 例子4:目前作者還沒有找到查准率和查全率都不重要的例子,如果你二者都不重視,你還玩毛機器學習?
為了區分不同重視程度,我們介紹一個 F1 度量的一般形式 Fβ
其中 β 度量了查准率和查全率的相對重要性,根據公式有
a. 當 β = 1, Fβ 公式退化成 F1, 適用於癌症診斷的例子。
b. 當 β > 1, 查全率有更大影響,更希望查全,適用於 FBI 抓逃犯例子。
c. 當 0 < β < 1, 查准率有更大影響,更希望查准,適用於亞馬遜推薦商品例子。
4.3 聚類任務 (clustering)
聚類任務是將全部數據集劃分為若干互不相交的子集,即蔟。那麼什麼樣的聚類結果比較好呢?直觀來講,我們希望物以類聚,即同一簇的樣本儘可能彼此相似,而不同簇的樣本儘可能不同。換言之,聚類結果的「簇內相似度」 (intra-cluster similarity)要高而「簇外相似度」 (inter-clustersimilarity) 要低。
聚類的性能度量有兩類。一類是將聚類結果與某個參考模型比較,稱為「外部指標」 (external index) 比如Jaccard 係數,FM 指數和 Rand 指數; 另一類是直接考察聚類結果而不利用任何模型,稱為「內部指標」 (internal index) 比如 DB 指數和 Dunn 指數。作者會在專門講聚類任務時細講這些度量指標。
對於相似度計算,通常我們會用兩種「距離度量」 (distance measure),歐式距離 (Euclidean distance) 和余旋相似 (cosine similarity):
前者計算的距離是沒有單位化的,後者計算的相似度是有單位化的。單位化 (normalization) 有好處也有壞處:- 用歐式距離很可能沒把一篇文章和一篇內容複製兩遍的文章歸為一類。
- 用余旋相似很可能把一篇很長的文章和一句很短的微博歸為一類。
5. 總結和下帖預告
什麼是機器學習?
通過學習訓練數據 (根據經驗 E),利用計算機的來建立泛化 (generalizable) 預測模型或者發現數據模式 (建立不同任務 T),希望可以適用在新數據或沒用過的數據上 (用性能度量 P 評估)。
什麼是監督學習?
訓練數據有標記的學習。回歸和分類是其代表。
什麼是無監督學習?
訓練數據沒標記的學習。聚類是其代表。
處女座的細心讀者可能發現我還有一個問題沒有講清楚,就是引言最後一段話
模型的性能的好壞通常要從沒有見過的數據 (unseen data) 上體現,但是這就很矛盾了,因為在學習演算法就是基於看到的數據,你根本不知道你沒看到的數據(未來發生的)是什麼樣的。難道這意味著我們在現在這個時點就沒能力評估模型性能?
要講清這個問題,我們還需要引進一些概念比如測試集 (testing set), 驗證集 (validation set), k 折交叉驗證 (k-fold cross validation), 偏差 (bias), 方差(variance), 雜訊(noise), 泛化誤差 (generalization error), 過擬合 (overfitting) 和欠擬合 (underfitting)。我們下帖再聊!Stay Tuned!
-----------------------------------------------------------------------------------------------------------------------------------裡面所有的圖都是作者自己做的,蠻花時間精力。如果本篇能幫助你直觀的了解了機器學習,可關注微信號 MeanMachine1031,我保證在今後的帖子里你能學到更多。Peace Out!
推薦閱讀:
※機器學習基石筆記1:基礎概念
※如何利用手機遠程調參
※值得收藏的45個Python優質資源(附鏈接)
※IBM機器學習CTO給2190知乎網友的一封信
※學習筆記CB001:NLTK庫、語料庫、詞概率、雙連詞、詞典
TAG:機器學習 |