隨著機器學習的進一步火熱,越來越多的演算法已經可以用在許多工的執行上,並且表現出色。

但是動手之前到底哪個演算法可以解決我們特定的實際問題並且執行效果良好,這個答案很多新手是不知道的。如果你處理問題時間可以很長,你可以逐個調研並且嘗試它們,反之則要在最短的時間內解決技術調研任務。

Michael Beyeler的一篇文章告訴我們整個技術選型過程,一步接著一步,依靠已知的技術,從模型選擇到超引數調整。

在Michael的文章裡,他將技術選型分為6步,從第0步到第5步,事實上只有5步,第0步屬於技術選型預積累步驟。

第0步:瞭解基本知識

在我們深入之前,我們要明確我們瞭解了基礎知識。具體來說,我們應該知道有三個主要的機器學習分類:監督學習(supervised learning)、無監督學習(unsupervised learning),以及強化學習(reinforcement learning)。

監督學習:每個資料點被標記或者與一個類別或者感興趣值相關聯。 分類標籤的一個例子是將影像指定為“貓”或者“狗”。價值標籤的一個例子是銷售價格與二手車相關聯。監督學習的目標是研究許多這樣的標記示例,進而能夠堆未來的資料點進行預測,例如,確定新的照片與正確的動物(分類(classification))或者指定其他二手車的準確銷售價格(迴歸(regression))。

無監督學習:資料點沒有標籤對應。相反,一個無監督學習演算法的目標是以一些方式組織資料或者表述它的結構。這意味著將其分組到叢集內部,或者尋找不同的方式檢視複雜資料,使其看起來更簡單。

強化學習:對應於每一個資料點,演算法需要去選擇一個動作。這是一種常見的機器人方法,在一個時間點的感測器讀數集合是一個資料點,演算法必須選擇機器人的下一個動作。這也是很普通的物聯網應用模式,學習演算法接收一個回報訊號後不久,反饋這個決定到底好不好。基於此,演算法修改其策略為了達到更高的回報。

第1步:對問題進行分類

下一步,我們要對手頭上的問題進行分類。這是一個兩步步驟:

通過輸入分類:如果我們有標籤資料,這是一個監督學習問題。如果我們有無標籤資料並且想要去發現結構,這是一個無監督學習問題。如果我們想要通過與環境互動優化目標函式,這是一個強化學習問題。

通過輸出分類:如果一個模型的輸出是一個數字,這是一個迴歸問題。如果模型的輸出是一個類(或者分類),這是一個分類問題。如果模型的輸出是輸入組的集合,這是一個分類問題。

就是那麼簡單。總而言之,我們可以通過問自己演算法需要解決什麼問題,進而發現演算法的正確分類。

上面這張圖包含了一些我們還沒有討論的技術術語:

分類(Classification):當資料被用來預測一個分類,監督學習也被稱為分類。這是一個例子當指定一張相作為“貓”或“狗”的圖片。當只有兩種選擇時,稱為二類(two-class)或二項式分類(binomialclassification)。當有更多類別的時候,當我們預測下一個諾貝爾物理學獎得住,這個問題被稱為多項式分類(multi-classclassification)。

迴歸(Regression):當一個值被預測時,與股票價格一樣,監督學習也被稱為迴歸。

聚類(Clustering):非監督學習最常用的方法是聚類分析或者聚類。聚類是一組物件組的任務,在這樣的一種方式下,在同一組中的物件(稱為叢集)是更加相似的(在某一種意義上),相比其他組(叢集)裡的物件。

異常檢測(Anomalydetection):需要在目標裡找到不尋常的資料點。在欺詐檢測裡,例如,任何非常不尋常的信用卡消費模式都是可以的。可能的變化很多,而訓練示例很少,這看起來不是一種可行方式瞭解欺詐活動。異常檢測需要的方法是簡單地瞭解什麼是正常的活動(使用非欺詐交易歷史記錄),並且確定明顯不同的內容。

第2步:找到可用的演算法

現在我們有分類問題,我們可以使用工具去調研和驗證演算法是可行的和可實踐的。

Microsoft Azure已經建立了一個方便的演算法表格,這個表格顯示演算法可以被用於哪些問題分類。雖然這個表格是針對Azure軟體,它一般適用於:

一些值得關注的演算法是:

分類(Classification):

支援向量機(SVM):通過儘可能寬的邊緣方式發現分離類的邊界。當二分式不能清晰的切分時,演算法找到最好的邊界。這個演算法真正的亮點是強烈的資料特徵,好像文字或者染色體組(>100特性)。在這些情況下,SVMs比其許多其他演算法更快遞切分二項,也更少地過度擬合,除了需要少量的記憶體。

人工神經網路(Artificial neural networks):是大腦啟發學習演算法,覆蓋多項式分類、二項式分類,以及迴歸問題。它們帶來了無限的多樣性,包括感知和深度學習。它們花費很長時間進行訓練,但是帶來各種應用領域的先進效能。

邏輯迴歸(Logistic regression):雖然包含‘迴歸’這個詞看上去有點令人費解,邏輯迴歸事實上是一個對於二項式和多項式分類來說強大的功能。它很快和簡單。事實是它使用了‘S’形曲線代替直線讓它對於切分資料進入組變得很自然。邏輯迴歸給出線性分類邊界(linear class boundaries),所以當你使用它來確保一個線性近似的時候,類似於你生活中可以使用的一些東西。

決策樹和隨機樹(Decision trees、random forests):決策森林(迴歸、二項式,以及多項式),決策叢林(二項式、多項式),以及提高決策樹(迴歸和二項式)所有被稱為決策樹,一種機器學習的基本概念。決策樹的變種有很多,但是它們都做了相同的事情,使用相同的標籤細分特徵空間到各個區域。這些可以是一致類別或者恆定值的區域,依賴於是否你正在做分類或者回歸。

迴歸(Regression):

線性迴歸(Linearregression):線性迴歸擬合直接(或者平臺,或者超平面)資料集。這是一個工具,簡單而快速,但是對於一些問題可能過於簡單。

貝葉斯線性迴歸(Bayesian linearregression):它有非常可取的品質,避免了過度擬合。貝葉斯方式實現它通過對可能分佈的答案作出一些假設。這種方式的其他副產品是它們有很少的引數。

提高決策樹迴歸:如上所述,提高決策樹(迴歸或二項式)是基於決策樹的,並通過細分大多數相同標籤的特徵空間到區域完成。提高決策樹通過限制它們可以細分的次數和每一個區域的最小資料點數量避免過度擬合。演算法構造一顆序列樹,每一顆樹學習補償樹前留下的錯誤。結果是非常準確的學習者,該演算法傾向於使用大量記憶體。

聚合(Clustering):

層次聚類(Hierarchicalclustering):層次聚類的試圖簡歷一個層次結構的聚類,它有兩種格式。聚集聚類(Agglomerativeclustering)是一個“自下而上”的過程,其中每個觀察從自己的聚類開始,隨著其在層次中向上移動,成對的聚類會進行融合。分裂聚類(Divisiveclustering)則是一種“自頂向下”的方式,所有的觀察開始於一個聚類,並且會隨著向下的層次移動而遞迴式地分裂。整體而言,這裡進行的融合和分裂是以一種激進的方式確定。層次聚類的結果通常表示成樹狀圖(dendrogram)形式。

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

異常檢測(Anomaly detection):

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

單類支援向量機(One-classSVM):使用了非線性支援向量機的一個巧妙的擴充套件,單類支援向量機可以描繪一個嚴格概述整個資料集的邊界。遠在邊界之外的任何新資料點都是足夠非正常的,也是值得特別關注的。

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

對於給定的問題,通常會有一些候選演算法可以適用。所以我們如何知道哪一個可以挑選?通常,這個問題的答案不是那麼直截了當的,所以我們必須反覆試驗。

原型開發最好分兩步完成。第一步,我們希望通過最小化特徵工程快速而簡單地完成幾種演算法的實現。在這個階段,我們主要興趣在粗略來看那個演算法表現更好。這個步驟有點類似招聘:我們會盡可能地尋找可以縮短我們候選演算法列表的理由。

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

第4步:特徵工程

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

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

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

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

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

加速穩健特徵(Speeded up robust features,SURF):SIFT 的更穩健版本。

方向梯度直方圖(Histogram of orientedgradients,HOG):一種特徵描述方法,在計算機視覺中用於計數一張影像中區域性部分的梯度方向的發生。

更多演算法請參考: https://en.wikipedia.org/wiki/Visual_deor

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

前向搜尋:

最開始不選取任何特徵。

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

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

反向搜尋:

從所有特徵開始。

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

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

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

第5步:超引數優化(可選)

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

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

相關知識

二項式分類(binomial classification):

適用環境:

各觀察單位只能具有相互對立的一種結果,如陽性或陰性,生存或死亡等,屬於兩分類資料。

已知發生某一結果(陽性)的概率為p,其對立結果的概率為1?p,實際工作中要求p是從大量觀察中獲得比較穩定的數值。

n次試驗在相同條件下進行,且各個觀察單位的觀察結果相互獨立,即每個觀察單位的觀察結果不會影響到其他觀察單位的結果。如要求疾病無傳染性、無家族性等。

符號:b(x,n,p)概率函式*:Cxnpxqn?x,其中x=0,1,?,n為正整數即發生的次數,Cxn=n!x!(n?x)!

例題:擲硬幣試驗。有10個硬幣擲一次,或1個硬幣擲十次。問五次正面向上的概率是多少?

解:根據題意n=10,p=q=12,x=5 b(5,l0,12)=C510p5q10=10!(5!(10?5)!)×(12)5×(12)5=252×(132)×(132)=0.2469所以五次正面向上的概率為0.24609

Support vector machines

是一種監督式學習的方法,可廣泛地應用於統計分類以及迴歸分析。支援向量機屬於一般化線性分類器,也可以被認為是提克洛夫規範化(Tikhonov Regularization)方法的一個特例。這族分類器的特點是他們能夠同時最小化經驗誤差與最大化幾何邊緣區,因此支援向量機也被稱為最大邊緣區分類器。

總結

所有的技術選型原理都是類似的,首先需要你的自身知識積累,然後是明確需要解決的問題,即明確需求。接下來確定一個較大的調研範圍,進而進一步調研後縮小範圍,最後通過實際應用場景的測試挑選出合適的技術方案或者方法。機器學習演算法選擇,也不例外。