關於機器學習必須要了解的幾個要點(A Few Useful Things to Know about Machine Learning)

關於機器學習必須要了解的幾個要點

(A Few Useful Things to Know about Machine Learning)

本文翻譯自華盛頓大學Pedro Domingos的文章《A Few Useful Things to Know about Machine Learning》,非專業翻譯,因興趣而做,如有誤解請指正!原文鏈接:
http://homes.cs.washington.edu/~pedrod/papers/cacm12.pdf

以下是正文:

摘要

機器學習算法可以通過推廣示例來完成很多重要的任務。這種靈活、高效的特點是手工編寫程序來完成任務所不具備的。數據越多,機器學習就能夠解決更加複雜的問題,所以它被廣泛應用於計算機科學和衆多領域。然而,想要成功開發出實用的機器學習算法,需要很多書本中沒有提到的技巧。本文列出了機器學習行家從經驗中總結的十二個要點。這些要點包括了一些需要避免的陷阱,需要關注的問題以及一些常規問題的解答。

簡介

機器學習算法自動地從數據中學習,過去的幾十年裏,它被廣泛應用於各個領域。其中就包括了網絡信息檢索,垃圾郵件分類,推薦系統,廣告投放,信用評分,詐騙檢測,股票交易,藥物設計,等等。最近McKinsey Global Institute聲明,機器學習將會帶來下一波科技進步的浪潮。如今,已經有不少介紹機器學習算法的優秀書籍,可是這些書中並沒有介紹那些對於成功實現機器學習應用非常重要的“通俗知識”。結果是,人們在開發機器學習相關項目的時候,花了太多不必要的時間,卻沒有得到最理想的效果。這就是本文的出發點。

機器學習算法可以有很多種分類,但是爲了方便介紹我的觀點,本文中我主要關注在廣泛應用的一類機器學習算法:分類算法(classification)。然而,我在文中討論的各種觀點同樣適用於其他類型的機器學習算法。所謂分類算法指的是在一個系統中,系統的輸入是一個連續或者離散的向量,而輸出是單個的離散值,這個離散值就是分類結果(class)。例如,在垃圾郵件分類系統中,垃圾郵件可以被分爲兩類:垃圾郵件和非垃圾郵件。該系統的輸入是一個布爾類型的向量x=(x1,...,xj,...,xd) ,其中,如果郵件中出現了字典中第j個詞,那麼xj=1 ,否則xj=0 。給學習器輸入訓練數據,(xi,yi) ,其中xi=(xi,1,...,xi,d) 是輸入的特徵,yi 是對應的輸出。學習器可以通過訓練,得到一個分類器。要測試學習器好不好,就要把測試數據輸入到分類器,然後計算分類誤差(有多少比例的垃圾郵件被正確地分類)。

學習=表示+評價+優化

假設你想通過機器學習算法在你的項目中得到比較好的效果,首要的問題是,有太多的機器學習算法,到底應該選擇哪一個?毫不誇張地講,如今已經有上千種算法,每年還會有上百種新的算法出現。防止自己迷失在算法中的關鍵,是要記住,任何算法都只是以下三個部件的組合:

  • 表示
    • 一個分類器一定能夠表示成計算機可以看懂的語言。選擇學習器的表示方法,就等同於選擇了一系列分類器,從中我們可以通過學習得到最終的分類器。這個分類器的集合就叫學習器的假設空間。如果一個分類器不在假設空間中,那麼它就不可能通過學習得到。這與另一個問題–輸入特徵的選擇有關,我們將在之後的部分討論。
  • 評價
    • 評價函數是用來從一堆分類器中挑選出好的分類器。通常爲了方便優化,我們實際使用的評價函數與真實的評價函數有一定的差別,關於這一點,在下一部分會講到。
  • 優化
    • 最終,我們需要有一個方法,從衆多的分類器中找出那個評分最高的分類器。優化算法是學習器執行效率的關鍵,而且還可以用來判斷分類器是否存在不止一個最優解。初學者可以先使用成熟的優化算法,熟悉流程之後,再根據需要進行定製。

表1展示的是上述三個部件的例子。比如,k近鄰通過尋找k個最接近的訓練樣本,對樣本中的主要成分進行分類。 基於超平面的方法對於每一類進行特徵線性組合,然後根據這些組合進行分類。決策樹在其中的每一個節點上測試一種特徵,樹枝代表了不同的特徵值範圍,決策樹的決策結果就在樹葉上。算法1展示了決策樹的訓練流程,其中用到了信息增益和貪婪搜索。信息增益InforGain(xj,y) 也就是特徵xj 和類y的互信息。函數MakeNode(x,c0,c1) 的返回值是一個用於檢測特徵x的節點,對於x=0的特徵,其子節點對應的訓練集是TS0 ,對於x=1的特徵,其子節點對應的訓練集是TS1
當然了,並不是說表1中任意三個部件的組合都能構成有價值的算法。例如,用離散變量表示的模型,就要用組合優化算法;而用連續變量表示的模型,則需要用連續優化算法。不過,許多學習器既有連續的也有連續的,也許不遠的未來,表1中的任何一種組合方式組合出來的學習方法,都是有意義的。
大部分的教材,都主要是在介紹表示方式,這很容易讓人忽略其他兩個重要的部件(評價和優化),然而這三個部件是同等重要的。如何選擇每個部件,沒有訣竅。不過下一部分我們將介紹一些選擇的原則。並且,從接下來的內容中,我們可以知道,在完成機器學習任務的過程中,我們的某些選擇遠比算法本身重要。

泛化

機器學習最基本的價值所在,就是我們可以將其用於訓練樣本之外的其他數據,也就是泛化。這是因爲,不論我們擁有多少數據,都很難將所有可能出現的數據用於訓練(比如說,在垃圾郵件中,可能出現的單詞一共有10000個,那麼垃圾郵件中出現單詞的組合,就有210000 種可能)。在訓練集上獲得好的結果很容易(最直接的方法就是讓學習算法記住所有的訓練樣本)。機器學習初學者常犯的錯誤就是,以爲在訓練集上得到好結果就萬事大吉了。可是一旦將這些分類器用於其他數據,你會發現分類結果與隨機猜測的結果差別不大。所以如果你請別人幫你設計分類器,請記得將你的數據集中的一部分作爲訓練集,用來測試他給你的分類器是否好用。反過來講,如果有人請你來設計分類器,請在一開始就從數據集中劃分出來一部分留作測試數據,在你利用其餘的數據訓練並且得到了分類器之後,再把這些數據拿出來使用。
用一些隱蔽的方法,你可以把測試數據混合進你的分類器中,比如說在調參的過程中使用測試集的數據進行擬合(機器學習中有很多類似的小把戲,這種事情時有發生,所以對於這些細節我們必須更加註意)。當然了,採用保留一部分數據作爲測試集的方法,會導致用於訓練的數據減少。我們可以採用“交叉驗證”的方式進行彌補。“交叉驗證”的過程如下:首先隨機將整個數據集分爲十份,每一次訓練,將其中的九份用於訓練,剩下一份用於測試。這樣進行十次,把十次的結果取平均,就可以知道你用的學習算法好不好了。
在早期,機器學習過程中將訓練集和測試集分開並沒有被廣泛接受,這是因爲當時的學習器能夠擬合出的超平面維度有限,這樣很難完全將樣本區分開,這就導致了在訓練集和測試集上的結果差不多,當時的人們也就認爲沒有這麼做的必要了。但是隨着機器學習研究的深入,學習器越來越複雜、易變(比如決策樹),甚至是線性分類器在使用了大量特徵之後也有了這樣的特性,此時訓練集與測試集分離也就成了必須。
如果將泛化作爲目標,那麼就會導致一個很有意思的結果。這不像其他的優化問題,因爲我們不知道我們的優化函數是什麼。在訓練過程中,我們不得不假定訓練誤差就是測試誤差,然而這存在潛在的問題。如何解決這個問題,我們將在接下來的部分中講到。讓我們積極地考慮這個問題,優化函數僅僅是我們對於真實情況的假定,實際情況是,我們並不一定要徹底地按照優化函數來。事實上,有時候通過貪婪搜索得到的局部最優解甚至會比全局最優解更好。

數據

將泛化作爲目標,帶來了另一個問題:不論用了多少數據,都是不夠的。這樣想想吧:我們想要對100個變量進行擬合,使用了一百萬個數據樣本,那麼我們至少有210026 的數據沒有包含在樣本中。這種情況下,我們怎麼才能知道剩下的這些數據是屬於哪一類呢?由於沒有多餘的信息,我們也就只能瞎猜了。200年前哲學家David Hume首先觀察到了這個問題,然而這麼多年後的今天,仍有人在使用機器學習算法時因爲忽略了這個問題而犯錯。爲了能夠泛化,任何學習器都會或多或少地包含一些訓練數據並沒有告訴它的信息。Wolpert在他著名的“沒有免費的午餐”的理論中,以另一種方式說出了這個道理:沒有任何一個這樣的學習器,其針對所有可能的優化函數學出的分類器,都可以瞎猜的方式更好。
譯者:在這個問題上表現好的算法,用在另一個問題上就可能表現很差,任何算法在統計意義上都差不多,所以只有合適某個特定問題的算法,沒有所謂的最好算法能夠在各種問題上都比其他算法好。關於此理論可以查看資料:
https://en.wikipedia.org/wiki/No_free_lunch_theorem
http://blog.sciencenet.cn/blog-286797-446192.html

這似乎是個令人沮喪的答案:既然如此,那我們搞機器學習還有什麼意義呢?瞎猜就好了嘛!幸運的是,在現實世界裏,我們遇到的問題所需的優化函數並不是均勻分佈的。事實上,很多通用的假設,比如平滑性、相似的數據更有可能屬於同一個類、數據之間有限的相關性、有限的複雜度等等,都能帶來很好的效果。這也就是機器學習被廣泛使用的原因。歸納演繹是一種獲得知識的手段:它可以讓你通過少量的信息獲得大量的額外信息。歸納法比演繹法更加強大,它只需要很少的知識就可以得到有用的結果,不過,爲了能夠得到正確的結果,還是需要給它足夠的信息的。不管我們用任何一種手段來獲得額外的知識,我們給它的信息越多,我們能夠從中獲得的知識也就越多。
從上面的論述我們可以得到一個結論:在機器學習中,選擇表示方法的標準在於,利用這種表示方法,能夠傳達出什麼樣的信息。比如,如果我們知道在我們的問題中樣本有哪些共同點,此時採用從實例出發的方法就是一個很好的選擇。如果我們知道數據的概率相關性,選擇圖模型就很合適。如果我們知道在何種前提下,樣本會歸爲哪一類,就可以選擇“If… Then… ”的判別方法。從這個角度上講,最有用的學習器並不是生拉硬拽一些假設進來,而是其用到的各種假設可以準確地表述出其中的道理,各種假設各有特點各不相同,而且可以有機地結合在一起。
在機器學習中需要額外的知識,這並不奇怪。因爲機器學習不是魔法,它不可能在什麼都不知道的情況下就給你想要的結果。它的作用是,從有限的知識中擴充出更多的有用知識。工程總是有這樣的特點,就像編程需要大量的努力才能從底層建立起整個系統。而機器學習就好像種地,很多工作都是自然地發生的。種地的時候,我們要把種子種在地裏,然後施肥。機器學習則是利用已有的知識,再結合上數據,得到更多的知識。

過擬合

如果我們手中擁有的知識和數據並不足以讓我們得到理想的分類器怎麼辦?這種情況下,我們很可能得到的是一個幻想中的分類器,與真實情況相去甚遠,它把數據中的巧合當真了。這就是過擬合,也是困擾機器學習的一件事情。如果你的學習器可以在訓練集中得到100%的準確率,但是只能在測試集中得到50%的準確率,而在理想情況下它不論在訓練集還是測試集中都應該獲得75%的準確率,此時就發生了過擬合。
在機器學習領域,每個人都聽說過過擬合,但是它會以多種形式出現而且有時候並沒有那麼容易被發現。一種理解過擬合的方式是把泛化誤差分解爲偏置(bias)和方差(variance)。偏置是指學習器總是反同樣的錯誤,而方差是指學習器做出的決斷與輸入信號無關,是隨機的。圖1就展示了這個問題。
圖1. 偏置和方差
如果線性分類器無法完全製造分割兩類的超平面,就會出現偏置。決策樹模型就不會有這樣的問題,因爲它理論上來說可以產生任意超平面的劃分,但是從另一個角度來看,它通常有較大的方差。由同樣的現象引出的問題,在不同的數據集上訓練,決策樹模型會得到完全不同的結果,而理論上來說,它們應該是一樣的。基於相似的道理,在選擇優化算法時,束搜索比貪婪搜索有更低的偏置,但有更高的方差,因爲它用到了更多的假設。因此,與我們的直覺相反,真正優秀的分類器不一定要比差的分類器表現更好。
正如圖2展示的,即使真實情況是:分類器是一系列的判決組成的,在訓練樣本不到1000個的時候,樸素貝葉斯分類器比判決分類器精確度更高。
圖2
在機器學習中,這樣的情況時有發生,較強的錯誤假設會比較弱的正確假設表現更好,這是因爲後者需要更多的數據來避免過擬合。交叉驗證有助於減弱過擬合,比如可以將決策樹設定到合適的大小。然而這並不是萬能的,因爲如果我們人爲的設定了過多的參數,模型本身就一定會發生過擬合。
除了交叉驗證之外,還有其他各種方式來預防過擬合。其中最常用的方法是在評價函數中加入正則項。這樣可以對於過於複雜的模型進行處罰,因而系統更容易產生結構簡單的模型。另外一種方式是在加入新的結構之前通過卡方驗證來檢驗統計顯著性,以此來判斷加入此結構是否有助於提升效果。當數據不足時,這些方法非常有用。然而,如果有誰生成某種方法可以完全“解決”過擬合問題,你應當持懷疑態度。因爲很容易就從過擬合變成欠擬合。想要同時做到避免過擬合和欠擬合需要設計出完美的分類器,然而根據“天下沒有免費的午餐”原理,在沒有足夠知識的前提下,沒有任何一個分類器能夠在各種情況下都表現最好。
一個關於過擬合的誤解是,認爲它是噪聲造成的,比如說訓練樣本的標籤標錯了。這確實會讓過擬合加重,因爲這會讓學習器產生出變換反覆的決策面,以滿足這些樣本的標定。但是在沒有噪聲的情況下, 也可能發生嚴重的過擬合。例如,假設我們有一個布爾型分類器需要把訓練集中的正樣本找出來(換句話說,分類器以析取範式的方式,將訓練集中樣本的特徵結合起來)。這個分類器將訓練集中的樣本正確分類,而將測試集中的正樣本全部錯誤分類,無論訓練集中有沒有噪聲。
多重假設檢驗與過擬合十分相關。標準的統計檢驗一次只能檢驗一種假設,而學習器可以同時檢驗百萬種。結果是,看上去很重要的假設也許實際上並沒有多重要。例如,如果有一家信託基金公司連續十年業績領先於業內,你會覺得它很厲害,但是如果仔細一想,如果每年任何一家公司都會有50%的概率領先,那麼它就有可能很幸運地連續十年領先。這個問題可以通過加入一系列的假設,做顯著性測試來判斷,但同樣會帶來欠擬合的問題。一種更加有效的方式是控制錯誤接受的比例,也稱爲錯誤發現率。

高維度

除了過擬合,機器學習中最大的問題就要數維度的詛咒了。這種表述在1961年由Bellman提出,主要是想說明如下事實:很多在低維度處理時非常有效的算法,一旦輸入換成高維度輸入,算法就無法得到理想的結果。不過在機器學習領域,維度的詛咒這個詞還有更多的含義。正確地泛化隨着維度的升高指數級地越變越難,這是因爲固定數目的訓練集只包含了整個空間中很小的一部分。甚至一箇中等維度的訓練集(比如100維),有很大數量的訓練樣本(比如10億個樣本),其只覆蓋了全空間中樣本數量的大概1/1018 。這也是機器學習很重要但是也很難得原因。
更爲要命的是,機器學習依賴的基於相似度的推理,也隨着維度升高而變差。我們來看一個以Hamming距離作爲度量的最近鄰聚類模型,並且假設其特徵只有x1,x2 。如果樣本中不包含無關的特徵,這本身是一個很簡單的問題。但是如果樣本特徵還有x3,...,x100 ,其噪聲足以擾亂x1,x2 的信息,這就會導致最近鄰聚類模型做隨機的分類。
更加令人煩惱的是,即使說這100個特徵是相關的,最近鄰模型依然會遇到問題。這是因爲,高緯度下所有的樣本看上去都差不多。 比如說樣本在規則網格中分佈,我們可以考慮一個測試樣本xt 。如果這個規則網絡是d維的,那麼xt 的2-d最近鄰離它的距離都是相等的,但是隨着維度增加,越來越多的樣本成爲xt 的最近鄰,使得最近鄰的選擇(也就是這個類)變得隨機。

==========================

未完待續。。。

==========================
本Markdown編輯器使用StackEdit修改而來,用它寫博客,將會帶來全新的體驗哦:

  • Markdown和擴展Markdown簡潔的語法
  • 代碼塊高亮
  • 圖片鏈接和圖片上傳
  • LaTex數學公式
  • UML序列圖和流程圖
  • 離線寫博客
  • 導入導出Markdown文件
  • 豐富的快捷鍵

快捷鍵

  • 加粗 Ctrl + B
  • 斜體 Ctrl + I
  • 引用 Ctrl + Q
  • 插入鏈接 Ctrl + L
  • 插入代碼 Ctrl + K
  • 插入圖片 Ctrl + G
  • 提升標題 Ctrl + H
  • 有序列表 Ctrl + O
  • 無序列表 Ctrl + U
  • 橫線 Ctrl + R
  • 撤銷 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及擴展

Markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,然後轉換成格式豐富的HTML頁面。 —— [ 維基百科 ]

使用簡單的符號標識不同的標題,將某些文字標記爲粗體或者斜體,創建一個鏈接等,詳細語法參考幫助?。

本編輯器支持 Markdown Extra ,  擴展了很多好用的功能。具體請參考Github.

表格

Markdown Extra 表格語法:

項目 價格
Computer $1600
Phone $12
Pipe $1

可以使用冒號來定義對齊方式:

項目 價格 數量
Computer 1600 元 5
Phone 12 元 12
Pipe 1 元 234

定義列表

Markdown Extra 定義列表語法:
項目1
項目2
定義 A
定義 B
項目3
定義 C

定義 D

定義D內容

代碼塊

代碼塊語法遵循標準markdown代碼,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

腳註

生成一個腳註1.

目錄

[TOC]來生成目錄:

數學公式

使用MathJax渲染LaTex 數學公式,詳見math.stackexchange.com.

  • 行內公式,數學公式爲:Γ(n)=(n1)!nN
  • 塊級公式:

x=b±b24ac2a

更多LaTex語法請參考 這兒.

UML 圖:

可以渲染序列圖:

Created with Raphaël 2.1.0張三張三李四李四嘿,小四兒, 寫博客了沒?李四愣了一下,說:忙得吐血,哪有時間寫。

或者流程圖:

Created with Raphaël 2.1.0開始我的操作確認?結束yesno
  • 關於 序列圖 語法,參考 這兒,
  • 關於 流程圖 語法,參考 這兒.

離線寫博客

即使用戶在沒有網絡的情況下,也可以通過本編輯器離線寫博客(直接在曾經使用過的瀏覽器中輸入write.blog.csdn.net/mdeditor即可。Markdown編輯器使用瀏覽器離線存儲將內容保存在本地。

用戶寫博客的過程中,內容實時保存在瀏覽器緩存中,在用戶關閉瀏覽器或者其它異常情況下,內容不會丟失。用戶再次打開瀏覽器時,會顯示上次用戶正在編輯的沒有發表的內容。

博客發表後,本地緩存將被刪除。 

用戶可以選擇 把正在寫的博客保存到服務器草稿箱,即使換瀏覽器或者清除緩存,內容也不會丟失。

注意:雖然瀏覽器存儲大部分時候都比較可靠,但爲了您的數據安全,在聯網後,請務必及時發表或者保存到服務器草稿箱

瀏覽器兼容

  1. 目前,本編輯器對Chrome瀏覽器支持最爲完整。建議大家使用較新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下問題
    1. 不支持離線功能
    2. IE9不支持文件導入導出
    3. IE10不支持拖拽文件導入


  1. 這裏是 腳註內容.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章