經驗之談:如何為你的機器學習問題選擇合適的演算法

隨著機器學習越來越流行,也出現了越來越多能很好地處理任務的演算法。但是,你不可能預先知道哪個演算法對你的問題是最優的。如果你有足夠的時間,你可以嘗試所有的演算法來找出最優的演算法。本文介紹了如何依靠已有的方法(模型選擇和超參數調節)去指導你更好地去選擇演算法。本文作者為華盛頓大學 eScience Institute 和 Institute for Neuroengineering 的數據科學博士後 Michael Beyeler。

步驟 0:了解基本知識

在我們深入學習之前,我們先重溫基礎知識。具體來說,我們應該知道機器學習裡面三個主要類別:監督學習,無監督學習和強化學習。

  • 在監督學習(supervised learning)中,每個數據點都會獲得標註,如類別標籤或與數值相關的標籤。一個類別標籤的例子:將圖片分類為「貓」或「狗」;數值標籤的例子如:預測一輛二手車的售價。監督學習的目的是通過學習許多有標籤的樣本,然後對新的數據做出預測。例如,準確識別新照片上的動物(分類)或者預測二手車的售價(回歸)。

  • 在無監督性學習(unsupervised learning)中,數據點沒有相關的標籤。相反,無監督學習演算法的目標是以某種方式組織數據,然後找出數據中存在的內在結構。這包括將數據進行聚類,或者找到更簡單的方式處理複雜數據,使複雜數據看起來更簡單。

  • 在強化學習(reinforcement learning)中,演算法會針對每個數據點來做出決策(下一步該做什麼)。這種技術在機器人學中很常用。感測器一次從外界讀取一個數據點,演算法必須決定機器人下一步該做什麼。強化學習也適合用於物聯網應用。在這裡,學習演算法將收到獎勵信號,表明所做決定的好壞,為了獲得最高的獎勵,演算法必須修改相應的策略。

步驟 1:對問題進行分類

接下來,我們要對問題進行分類,這包含兩個過程:

  • 根據輸入數據分類:如果我們的數據有標籤,這就是一個監督學習問題;如果數據沒有標籤而且我們想找出數據的內在結構,那這就是無監督學習;如果我們想通過與環境交互來優化目標函數,這是強化學習。

  • 根據輸出結果分類:如果模型輸出結果是一個數值,這是回歸問題;如果輸出結果是一個類別,這是分類問題;如果輸出結果是一組輸入數據,那這是聚類問題。

就是這麼簡單!

更一般地說,我們可以詢問我們自己:我們的演算法要實現什麼目標,然後以此來找到正確的演算法類別。

上面的描述包括了幾個我們還沒有提到的專業術語:

  • 分類(classification):當使用數據來預測類別時,監督學習也被叫做分類。比如將含有「貓」或「狗」的圖片識別出來,分類為「貓」或「狗」,這就是二分類問題(two-class or binomial classification)。當存在更多類別時(例如預測下一屆諾貝爾物理學家的獲得者是誰),這就是所謂的多分類問題(multi-class classification)。

  • 回歸(regression):當要預測數值時(比如預測股價),監督學習也被稱為回歸。

  • 聚類(clustering):聚類或聚類分析(cluster analysis)是無監督學習中最常見的方法之一。聚類是將一組對象以某種方式分組,使得同一組中的數據比不同組的數據有更多的相似性。

  • 異常檢測(Anomaly detection):有時我們需要找出數據點中的異常點。例如,在欺詐檢測中,任何極不尋常的信用卡消費都是可疑的;欺詐具有大量不同的形式,而訓練樣本又非常少,使得我們不可能完全了解欺詐活動應該是什麼樣。異常檢測所採取的方法就是了解正常情況下的表現行為(使用非欺詐交易的歷史數據),並識別出顯著不同的表現行為。

步驟 2:尋找可用的演算法

現在我們已經將問題進行了分類,我們就可以使用我們所掌握的工具來識別出適當且實用的演算法。

Microsoft Azure 創建了一個方便的演算法列表,其展示了哪些演算法可用於哪種類別的問題。雖然該表單是針對 Azure 軟體定製的,但它具有普遍的適用性(該表單的 PDF 版本可查閱 suo.im/3Ss2zW ):

一些值得注意的演算法如下:

  • 分類:

  • 支持向量機(SVM)可用於找到儘可能寬的分類的邊界。當兩個分類不能被清楚地分開時,該演算法會找到其所能找到的最佳邊界。其真正的亮點在於處理特徵密集的數據,比如文本或者基因組(特徵數量> 100)。在這些情況下,除了僅需要適量的記憶外,支持向量機(SVM)能夠比其它大多數演算法更快且更少過擬合地進行分類。

  • 人工神經網路是涵蓋二分類、多分類和回歸問題的腦啟發式學習演算法。它們有無限的種類,包括感知器和深度學習。它們需要很長時間來訓練,但已知其在多種應用領域都實現了當前最佳的表現。

  • logistic 回歸:即便名字中有著「回歸」,但 logistic 回歸實際上是一種可用於二分類和多分類問題的強大工具。它快速且簡單。事實上,它使用「S」形曲線而非直線,所以它自然適合用於數據分組。logistic 回歸可以給出線性分類邊界,所以如果你要使用它,你一定要確保你能接受線性的近似。

  • 決策樹和隨機森林:決策森林(decision forests)(回歸、二分類、多分類),決策叢林(decision jungles)(二分類和多分類)和提升決策樹(boosted decision trees)(回歸和二分類)都基於決策樹。這是一個基本的機器學習概念。決策樹有許多不同的變體,但它們都在做同樣的事情—將特徵空間(feature space)細分為具有大致相同標籤的區域。這些區域可以是一致的類別或者恆定值,具體取決於你進行的是分類還是回歸。

  • 回歸:

  • 線性回歸是將一條線(或平面、或超平面)擬合到一個數據集上。這是一種主要的工具,簡單且快速,但對於一些問題而言,它可能過於簡單。

  • 貝葉斯線性回歸有著非常理想的特性:它可以避免過擬合。貝葉斯方法通過事先對答案的可能分布做出一些假設來做到這一點。這種方法的另一個副產品是它們具有非常少的參數。

  • 提升決策樹回歸(Boosted decision tree regression):如上所述,提升決策樹(回歸和二分類)均基於決策樹,並通過將特徵空間細分為具有大致相同標籤的區域發揮效用。提升決策樹通過限制其可以細分的次數以及每個區域中所允許的最少數據點來避免過擬合。該演算法會構造一個樹的序列,其中每棵樹都會學習彌補之前的樹留下來的誤差。這能得到一個會使用大量的內存的非常精確的學習器。

  • 聚類:

  • 層次聚類(Hierarchical Clustering)的目標是構建聚類的層次結構,它有兩種形式。聚集聚類(agglomerative clustering)是一種「自下而上」的方法,其中每個觀察(observation)在其自己的聚類中開始,隨著其在層次中向上移動,成對的聚類會進行融合。分裂聚類(divisive clustering)則是一種「自上而下」的方法,其中所有的觀察都從一個聚類開始,並且會隨觀察向下的層次移動而遞歸式地分裂。整體而言,這裡的融合和分裂是以一種激進的方式確定的。層次聚類的結果通常表示成樹狀圖(dendrogram)的形式。

  • k-均值聚類(k-means clustering)的目標是將 n 組觀測值分為 k 個聚類,其中每個觀測值都屬於其接近的那個均值的聚類——這些均值被用作這些聚類的原型。這會將數據空間分割成 Voronoi 單元。

  • 異常檢測:

  • k 最近鄰(k-nearest neighbors / k-NN)是用於分類和回歸的非參數方法。在這兩種情況下,輸入都是由特徵空間中與 k 最接近的訓練樣本組成的。在 k-NN 分類中,輸出是一個類成員。對象通過其 k 最近鄰的多數投票來分類,其中對象被分配給 k 最近鄰中最常見的類(k 為一正整數,通常較小)。在 k-NN 回歸中,輸出為對象的屬性值。該值為其 k 最近鄰值的平均值。

  • 單類支持向量機(One-class SVM):使用了非線性支持向量機的一個巧妙的擴展,單類支持向量機可以描繪一個嚴格概述整個數據集的邊界。遠在邊界之外的任何新數據點都是非正常的,值得注意。

步驟 3:實現所有適用的演算法

對於任何給定的問題,通常有多種候選演算法可以完成這項工作。那麼我們如何知道選擇哪一個呢?通常,這個問題的答案並不簡單,所以我們必須反覆試驗。

原型開發最好分兩步完成。在第一步中,我們希望通過最小量的特徵工程快速且粗糙地實現一些演算法。在這個階段,我們主要的目標是大概了解哪個演算法表現得更好。這個步驟有點像招聘:我們會儘可能地尋找可以縮短我們候選演算法列表的理由。

一旦我們將列表減少至幾個候選演算法,真正的原型開發開始了。理想情況下,我們會建立一個機器學習流程,使用一組經過仔細選擇的評估標準來比較每個演算法在數據集上的表現。在這個階段,我們只處理一小部分的演算法,所以我們可以把注意力轉到真正神奇的地方:特徵工程。

步驟 4:特徵工程

或許比選擇演算法更重要的是正確選擇表示數據的特徵。從上面的列表中選擇合適的演算法是相對簡單直接的,然而特徵工程卻更像是一門藝術。

主要問題在於我們試圖分類的數據在特徵空間的描述極少。利如,用像素的灰度值來預測圖片通常是不佳的選擇;相反,我們需要找到能提高信噪比的數據變換。如果沒有這些數據轉換,我們的任務可能無法解決。利如,在方向梯度直方圖(HOG)出現之前,複雜的視覺任務(像行人檢測或面部檢測)都是很難做到的。

雖然大多數特徵的有效性需要靠實驗來評估,但是了解常見的選取數據特徵的方法是很有幫助的。這裡有幾個較好的方法:

  • 主成分分析(PCA):一種線性降維方法,可以找出包含信息量較高的特徵主成分,可以解釋數據中的大多數方差。

  • 尺度不變特徵變換(SIFT):計算機視覺領域中的一種有專利的演算法,用以檢測和描述圖片的局部特徵。它有一個開源的替代方法 ORB(Oriented FAST and rotated BRIEF)。

  • 加速穩健特徵(SURF):SIFT 的更穩健版本,有專利。

  • 方向梯度直方圖(HOG):一種特徵描述方法,在計算機視覺中用於計數一張圖像中局部部分的梯度方向的 occurrence。

  • 更多演算法請參考:Visual descriptor

當然,你也可以想出你自己的特徵描述方法。如果你有幾個候選方法,你可以使用封裝好的方法進行智能的特徵選擇。

  • 前向搜索:

  • 最開始不選取任何特徵。

  • 然後選擇最相關的特徵,將這個特徵加入到已有特徵;計算模型的交叉驗證誤差,重複選取其它所有候選特徵;最後,選取能使你交叉驗證誤差最小特徵,並放入已選擇的特徵之中。

  • 重複,直到達到期望數量的特徵為止!

  • 反向搜索:

  • 從所有特徵開始。

  • 先移除最不相關的特徵,然後計算模型的交叉驗證誤差;對其它所有候選特徵,重複這一過程;最後,移除使交叉驗證誤差最大的候選特徵。

  • 重複,直到達到期望數量的特徵為止!

使用交叉驗證的準則來移除和增加特徵!

步驟 5:超參數優化

最後,你可能想優化演算法的超參數。例如,主成分分析中的主成分個數,k 近鄰演算法的參數 k,或者是神經網路中的層數和學習速率。最好的方法是使用交叉驗證來選擇。

一旦你運用了上述所有方法,你將有很好的機會創造出強大的機器學習系統。但是,你可能也猜到了,成敗在於細節,你可能不得不反覆實驗,最後才能走向成功。

選自Ask a Swiss機器之心編譯

推薦閱讀:

國內圍棋 AI 挑戰世界冠軍,並非嘩眾取寵,而是深度學習的勝利
轉型AI產品經理,原來不需要學那麼深的演算法和數學模型
【名師課堂】如何快速舉一反三!機器學習演算法與原理深入解析
淺析 Hinton 最近提出的 Capsule 計劃
BAT機器學習面試1000題系列(第1~10題)

TAG:人工智能算法 | 机器学习 |