盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

AI100發表於2017-06-02

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

推薦理由

對於機器學習演算法的盤點,網上屢見不鮮。但目前,還沒人能結合使用場景來把問題說明白,而這一點正是本文的目的所在。

在文章中,作者將結合他的實際經驗,細緻剖析每種演算法在實踐中的優勢和不足。

本文的目的,是務實、簡潔地盤點一番當前機器學習演算法。儘管人們已做過不少盤點,但始終未能給出每一種演算法的真正優缺點。在這裡,我們依據實際使用中的經驗,將對此詳加討論。

歸類機器學習演算法,一向都非常棘手,常見的分類標準是這樣的:生成/判別、引數/非引數、監督/非監督,等等。

舉例來說,Scikit-Learn 對演算法的分類是根據它們的學習機制,由此所產生的類別如下:

廣義線性模型

支援向量機

最近鄰

決策樹

神經網路

……

然而,根據我們的經驗,這都不是最實用的演算法分類方式。這是因為,在使用機器學習的時候,你不會這麼去想:“我今天想訓練一個支援向量機出來!”

相反,你一般是想著那個最終的目標,比如預測某個結果,或是將觀察結果進行分類。

因而,我們想基於你的任務目標,來對機器學習演算法進行分類。

天下沒有免費的午餐

在機器學習領域,一個基本的定理就是“沒有免費的午餐”。換言之,就是沒有演算法能完美地解決所有問題,尤其是對監督學習而言(例如預測建模)

舉例來說,你不能去說神經網路任何情況下都能比決策樹更有優勢,反之亦然。它們要受很多因素的影響,比如你的資料集的規模或結構。

其結果是,在用給定的測試集來評估效能並挑選演算法時,你應當根據具體的問題來採用不同的演算法。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

當然,所選的演算法必須要適用於你自己的問題,這就要求選擇正確的機器學習任務。作為類比,如果你需要打掃房子,你可能會用到吸塵器、掃帚或是拖把,但你絕對不該掏出鏟子來挖地。

機器學習的任務

這裡,我們將首先討論當前的「三大」最常見的機器學習任務:

1、迴歸(Regression

2、分類(Classification

3、聚類(Clustering

以及兩大資料降維(Dimensionality Reduction)問題:

4、特徵選取(Feature Selection

5、特徵提取(Feature Extraction

後續的文章,我們還將討論密度估計(Density Estimation)和異常檢測()的任務。

說明:本文將不討論具體的細分領域,如自然語言處理。

本文也不會覆蓋到每一個具體的演算法。畢竟當前的演算法數不勝數,而新的演算法更是層出不窮。儘管如此,本文仍能針對每項任務給出當下最有代表性的演算法。

1.迴歸

迴歸是一種用於連續型數值變數預測和建模的監督學習演算法,使用案例包括房地產價格、股價走勢或學生成績等的預測。

迴歸任務的特徵是具有數值型目標變數的標註資料集。換言之,每一個用以監督演算法的觀察樣本,都有一個數值型真值。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

線性迴歸

1.1 (正則化)線性迴歸

線性迴歸是迴歸任務最常用的演算法。它最簡的形式,是用一個連續的超平面來擬合資料集(比如,當你僅有兩個變數時就用一條直線)。如果資料集內的變數存線上性關係,擬合程度就相當高。

在實踐中,簡單線性迴歸通常會被其正則化形式(LASSO、Ridge 及彈性網路)所取代。正則化是對過多回歸係數所採取的一種避免過擬合的懲罰技巧,同時,懲罰的強度需要被平衡好。

  • 優點:線性迴歸的理解和解釋都非常直觀,還能通過正則化來避免過擬合。此外,線性模型很容易通過隨機梯度下降來更新資料模型。

  • 缺點:線性迴歸在處理非線性關係時非常糟糕,在識別複雜的模式上也不夠靈活,而新增正確的相互作用項或多項式又極為棘手且耗時。

  • 實現

Python - 

scikit-learn.org/stable/modu…

R - 

cran.r-project.org/web/package…

1.2 迴歸樹(整合方法)

迴歸樹,又名決策樹,通過將資料集重複分割成不同的分支來最大化每次分離的資訊增益,從而讓迴歸樹很自然地學到非線性關係。

整合的方法,如隨機森林(RF)或梯度提升樹(GBM),則能結合許多獨立訓練樹的預測。我們在這裡不會詳述其中的機制,但在實踐中,隨機森林一般都有很出色的表現,梯度提升樹則較難調參,但往往能有更高的效能上限。

  • 優點:決策樹能學習非線性關係,對異常值也具有很強的穩健性。整合學習在實踐中表現優異,經常贏得經典的(非深度學習)機器學習競賽。

  • 缺點:由於無約束,單棵樹容易過擬合,這是因為單棵樹可保留分支直至記住訓練的資料。不夠,整合方法可以弱化這一缺點。

  • 實現:隨機森林

Python - 

scikit-learn.org/stable/modu…

R - 

cran.r-project.org/web/package…
  • 實現:梯度提升樹

Python - 

scikitlearn.org/stable/modu…

R - 

cran.r-project.org/web/package…

1.3 深度學習

深度學習是指能夠學習極端複雜模式的多層神經網路。它們在輸入層和輸出層之間使用隱藏層來對資料的中間表徵建模,這一點是其他演算法很難做到的。

深度學習還有幾個重要的機制,如卷積、漏失等,這使該演算法可以有效學習高維資料。然而,相對於其他演算法,深度學習需要更多的資料來進行訓練,因為該模型需要估算更大數量級的引數。

  • 優點:深度學習是當前特定領域的最先進技術,如計算機視覺與語音識別。深度神經網路在影象、音訊和文字資料上表現優異,也很容易通過反向傳播演算法來更新資料模型。它們的架構(即層級的數量和結構)能適用於多種問題,同時隱藏層還能降低演算法對特徵工程的依賴。

  • 缺點:深度學習演算法往往不適合用於通用目的,因為它們需要大量的資料。事實上,對於經典的機器學習問題,深度學習的表現並不比整合方法好。此外,由於訓練所需的密集型計算,它們需要更多的專門知識才能進行調參(如設定架構與超引數)。

  • 實現

Python - 

keras.io/

R - 

mxnet.io/

1.4 榮譽獎:最近鄰演算法

最近鄰演算法是“基於例項的”,也就意味著它需要保留每一個訓練觀察值。最近鄰演算法通過搜尋最相似的訓練樣本來預測新樣本的觀察值。

它是記憶體密集型演算法,處理高維資料時的效果並不理想,同時還需要高效的距離函式來計算相似度。在實踐中,使用正則化的迴歸或樹型整合方法通常是更好的選擇。

2.分類

分類是一種用於分類變數建模及預測的監督學習演算法,使用案例包括員工流失、郵件過濾、金融欺詐等的預測。

正如你所見,許多回歸演算法都有其對應的分類形式,分類演算法往往適用於類別(或其可能性)的預測,而非數值。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

邏輯迴歸

2.1 (正則化)邏輯迴歸

邏輯迴歸是線性迴歸所對應的分類方法,基本概念由線性迴歸推導而出。邏輯迴歸通過邏輯函式將預測對映到 0 到 1 的區間,因此預測值可被視為某一類別的概率。

該模型依舊是線性的,只有當資料線性可分時(例如,資料可被某決策平面完全分離),這一演算法才會有很好的表現。邏輯迴歸同樣能懲罰模型係數以進行正則化。

  • 優點:輸出結果會有很好的概率解釋,而演算法也能通過正則化以避免過擬合。邏輯模型很容易通過隨機梯度下降來更新資料模型。

  • 缺點:邏輯迴歸在面對多元或非線性決策邊界時效能較差。

  • 實現

Python - 

scikit-learn.org/stable/modu…

R - 

cran.r-project.org/web/package…

2.2 分類樹(整合方法)

對應於迴歸樹的分類演算法是分類樹。通常,它們都是指決策樹,更為嚴謹的說法是“分類迴歸樹(CART)”,也就是非常有名的 CART 演算法。

  • 優點:跟迴歸方法一樣,分類樹的整合方法在實踐中的表現同樣十分優異。它們在應對異常資料時有著相當的穩健性與可擴充套件性。由於其層級結構,分類樹的整合方法能夠很自然地對非線性決策邊界建模。

  • 缺點:不可約束,單棵樹容易過擬合,整合方法可削弱這一影響。

  • 實現:隨機森林

Python - 

scikit-learn.org/stable/modu…

R - 

cran.r-project.org/web/package…
  • 實現:梯度提升樹

Python - 

scikitlearn.org/stable/modu…

R - 

cran.r-project.org/web/package…

2.3 深度學習

深度學習同樣很容易適應於分類問題。實際上,深度學習應用地更多的是分類任務,如影象分類等。

  • 優點:深度學習非常適合於音訊、文字與影象資料的分類。

  • 缺點:與迴歸方法一樣,深度神經網路需要大量的資料進行訓練,所以也不是一個通用目的演算法。

  • 實現

Python - 

keras.io/

R - 

mxnet.io/

2.4 支援向量機

支援向量機使用一個名為核函式的技巧,來將非線性問題變換為線性問題,其本質是計算兩個觀測資料的距離。支援向量機演算法所尋找的是能夠最大化樣本間隔的決策邊界,因此又被稱為大間距分類器。

舉例來說,使用線性核函式的支援向量機類似於邏輯迴歸,但更具穩健性。因而在實踐中,支援向量機最大用處是用非線性核函式來對非線性決策邊界進行建模。

  • 優點:支援向量機能對非線性決策邊界建模,又有許多可選的核函式。在面對過擬合時,支援向量機有著極強的穩健性,尤其是在高維空間中。

  • 缺點:不過,支援向量機是記憶體密集型演算法,選擇正確的核函式就需要相當的j技巧,不太適用較大的資料集。在當前的業界應用中,隨機森林的表現往往要優於支援向量機。

  • 實現

Python - 

scikit-learn.org/stable/modu…

R - 

cran.r-project.org/web/package…

2.5 樸素貝葉斯

樸素貝葉斯是一種基於條件概率和計數的簡單演算法,其本質是一個概率表,通過訓練資料來更新其中的概率。它預測新觀察值的過程,就是根據樣本的特徵值在概率表中來尋找最為可能的類別。

被稱為“樸素”原因,是其核心的特徵條件獨立性假設(例如,每一項輸入特徵都相互獨立),在現實中幾乎是不成立的。

  • 優點:即便條件獨立性假設很難成立,但實踐中的樸素貝葉斯演算法卻能表現得很好。該演算法易於實現且能伴隨資料集更新。

  • 缺點:因為樸素貝葉斯的演算法太過簡單,所以很容易被上述分類演算法所取代。

  • 實現

Python - 

scikit-learn.org/stable/modu…

R - 

cran.r-project.org/web/package…

3.聚類

聚類是基於資料內部結構來尋找樣本自然族群(叢集)的無監督學習任務,使用案例包括使用者畫像、電商物品聚類、社交網路分析等。

由於聚類屬於無監督學習,也就不會輸出“正確的答案”,評價結果時往往要用到資料視覺化。如果你需要“正確的答案”,亦即訓練集中存在預標註的叢集,那麼用分類演算法會更加合適。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

K 均值

3.1 K 均值

K 均值是基於樣本點間的幾何距離來度量聚類的通用目的演算法。由於叢集圍繞在聚類中心,結果會接近於球狀並具有相似的大小。

我們之所以推薦該演算法給初學者,是因為它不僅足夠簡單,而且足夠靈活,對於大多數問題都能給出合理的結果。

  • 優點:K 均值是最為流行的聚類演算法,因為它足夠快速、足夠簡單,如果你的預處理資料和特徵工程都做得十分有效,那它將具備令人驚歎的靈活性。

  • 缺點:該演算法需要指定叢集的數量,而 K 值的選擇通常都不是那麼容易確定的。另外,如果訓練資料中的真實叢集並不是類球狀的,那麼 K 均值聚類會得出一些比較差的叢集。

  • 實現

Python - 

scikit-learn.org/stable/modu…

R - 

stat.ethz.ch/R-manual/R-…

3.2 仿射傳播

仿射傳播是一種相對較新的聚類演算法,它基於兩個樣本點之間的圖形距離來確定叢集,其結果傾向於更小且大小不等的叢集。

  • 優點:仿射傳播不需要指出明確的叢集數量,但需要指定“sample preference”和“damping”等超引數。

  • 缺點:仿射傳播的主要缺點是訓練速度較慢,且需要大量記憶體,因而難於擴充套件到大資料集。此外,該演算法同樣在假定潛在的叢集要接近於球狀。

  • 實現

Python - http://scikit-learn.org/stable/modules/clustering.html#affinity-propagation

R - https://cran.r-project.org/web/packages/apcluster/index.html

3.3 分層 / 層次

分層聚類,又名層次聚類,其演算法基於以下概念來實現:

1) 每一個叢集都從一個資料點開始;

2) 每一個叢集都可基於相同的標準進行合併;

3) 重複這一過程,直至你僅剩下一個叢集,這就獲得了叢集的層次結構。

  • 優點:層次聚類的最主要優點,是叢集不再假定為類球形。此外,它可以很容易擴充套件到大資料集。

  • 缺點:類似於 K 均值,該演算法需要選定叢集的數量,即演算法完成後所要保留的層次。

  • 實現

Python - http://scikitlearn.org/stable/modules/clustering.html#hierarchical-clustering

R - https://stat.ethz.ch/R-manual/R-devel/library/stats/html/hclust.html

3.4 DBSCAN

DBSCAN 是一種基於密度的聚類演算法,它將樣本點的密集區域組成叢集;其最新進展是HDBSCAN,它允許叢集的密度可變。

  • 優點:DBSCAN 不需要假定類球形叢集,其效能可以擴充套件。此外,它不需要每個點都被分配到叢集中,這就降低了叢集的噪音。

  • 缺點:使用者必須要調整“epsilon”和“min_sample”這兩個超引數來定義叢集密度。DBSCAN 對此非常敏感。

  • 實現

Python - http://scikit-learn.org/stable/modules/clustering.html#dbscan

R - https://cran.r-project.org/web/packages/dbscan/index.html

維度災難

在機器學習領域,“維度(Dimensionality)”通常指資料集中的特徵數量(即輸入變數的個數)。

當特徵的個數特別大的時候(相對於資料集中觀測樣本的數量來說),訓練出一個有效的模型,對演算法要求就會特別高(即,用現有的演算法訓練出一個有效的模型特別困難)。這就是所謂的“維度災難(Curse of Dimensionality)”,特別是對依賴於距離計算的聚類演算法而言。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

對於“維度災難”,有位 Quora 使用者給出了一個非常好的類比:

假設有一條100碼的直線,而你在該直線的某處掉了一枚硬幣。要找回硬幣並不難,你只需沿著這條線走就行了,最多花上你2分鐘時間。
然後,假設有一個長和寬都是100碼的廣場,而你是把硬幣掉在廣場的某個位置。現在再想找回它,可就不容易了,這好比在兩個並排的足球場中找針,可能會耗上你幾天時間。
再然後,假設是一個長、寬、高都是100碼的立方體,那就好比是在30層樓高的大型體育場內找zhen找針……

隨著維度的增加,在空間中搜尋的難度也會變得愈加困難。

Quora連結:www.quora.com/What-is-the…

這就需要資料降維的辦法:特徵選取和特徵提取。

4.特徵選取

特徵選取是從你的資料集中過濾掉不相關或冗餘的特徵。特徵選取與特徵提取的關鍵區別在於:特徵選取是從原特徵集中選取一個子特徵集,而特稱提取則是在原特徵集的基礎上重新構造出一些(一個或多個)全新的特徵。

需要注意的是,某些監督式機器學習演算法已經具備了內在的特徵選取機制:比如正則迴歸與隨機森林。通常,我們是建議一開始優先嚐試這些演算法,如果它們能匹配上你的問題的話。對此我們已經做過介紹。

作為獨立的任務,特徵選取既可以是非監督式的(如方差閾值),又可以是監督式的(比遺傳演算法)。有必要的話,你還可以把多種方法以某種合理的方式整合在一起。

4.1 方差閾值

方差閾值會摒棄掉觀測樣本那些觀測值改變較小的特徵(即,它們的方差小於某個設定的閾值)。這樣的特徵的價值極小。

舉例來說,如果你有一份公共健康資料,其中96%的人都是35歲的男性,那麼去掉“年齡”和“性別”的特徵也不會損失重要資訊。

由於方差閾值依賴於特徵值的數量級,你應該對特徵值先做歸一化處理。

  • 優點:使用方差閾值方式進行資料降維只需一個非常可靠的直覺:特徵值不怎麼改變的特徵,不會帶來什麼有用的資訊。這是在你建模初期進行資料降維相對安全的一種方式。

  • 缺點:如果你正在解決的問題並不需要進行資料降維,即便使用了方差閾值也幾乎沒有什麼作用。此外,你需要手工設定、調整方差閾值,這個過程相當具有技術含量。我們建議從一個保守(也就是,較低)的閾值開始。

  • 實現

Python - http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.VarianceThreshold.html

R - https://www.rdocumentation.org/packages/caret/versions/6.0-76/topics/nearZeroVar

4.2 相關性閾值

相關性閾值會去掉那些高度相關的特徵(亦即,這些特徵的特徵值變化與其他特徵非常相似)。它們提供的是冗餘資訊。

舉例來說,如果你有一個房地產資料,其中兩個特徵分別是“房屋面積(單位:平方英尺)”和“房屋面積(單位:平方米)”,那麼,你就可以去掉其中的任何一個(這非常安全,也不會給你的模型帶來任何負面影響)。

問題是,你該去掉哪一個特徵呢?首先,你應該計算所有特徵對的相關係數。而後,如果某個特徵對的相關係數大於設定的閾值,那你就可以去掉其中平均絕對相關係數較大的那一個。

  • 優點:使用相關性閾值同樣只需一個可靠的直覺:相似的特徵提供了冗餘的資訊。對於某些含有強相關性特徵較多的資料集,有些演算法的穩健性並不好,因此,去掉它們可以提升整個模型的效能(計算速度、模型準確度、模型穩健性,等等)。

  • 缺點:同樣,你還是必須手動去設定、調整相關性閾值,這同樣是個棘手且複雜的過程。此外,如果你設定的閾值過低,那麼你將會丟失掉一些有用的資訊。無論在什麼時候,我們都更傾向於使用那些內建了特徵選取的演算法。對於沒有內建特徵提取的演算法,主成分分析是一個很好的備用方案。

  • 實現

Python - https://gist.github.com/Swarchal/881976176aaeb21e8e8df486903e99d6

R - https://www.rdocumentation.org/packages/caret/versions/6.0-73/topics/findCorrelation

4.3 遺傳演算法

遺傳演算法是可用於不同任務的一大類演算法的統稱。它們受進化生物學與自然選擇的啟發,結合變異與交叉,在解空間內進行高效的遍歷搜尋。這裡有一篇非常棒的簡介:“遺傳演算法背後的原理引入”。

在機器學習領域,遺傳演算法主要有兩大用處。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

其一,用於最優化,比如去找神經網路的最佳權重。

其二,是用於監督式特徵提取。這一用例中,“基因”表示單個特徵,同時“有機體”表示候選特徵集。“種群體”內的每一個有機體都會基於其適應性進行評分,正如在測試資料集上進行模型效能測試。最能適應環境的有機體將會生存下來,並不斷繁衍,一直迭代,直至最終收斂於某個最優的解決方案。

  • 優點:在窮舉搜尋不可行的情況下,對高維資料集使用遺傳演算法會相當有效。當你的演算法需要預處理資料卻沒有內建的特徵選取機制(如最近鄰分類演算法),而你又必須保留最原始的特徵(也就是不能用任何主成分分析演算法),遺傳演算法就成了你最好的選擇。這一情況在要求透明、可解釋方案的商業環境下時有發生。

  • 缺點:遺傳演算法為你解決方案的實施帶來了更高的複雜度,而多數情況下它們都是不必要的麻煩。如果可能的話,主成分分析或其它內建特徵選取的演算法將會更加高效和簡潔。

  • 實現

Python - https://pypi.python.org/pypi/deap

R - https://cran.r-project.org/web/packages/GA/vignettes/GA.html

4.4 榮譽獎:逐步搜尋

逐步搜尋是一個基於序列式搜尋的監督式特徵選取演算法。它有兩種形式:前向搜尋和反向搜尋。

對於前向逐步搜尋,你從沒有任何特徵開始。接著,從候選特徵集中,選擇一個特徵來訓練模型;然後,儲存模型效能最好對應的那個特徵;再往下,你不斷往訓練模型的特徵集中新增特徵,一次新增一個特徵,直到你模型的效能不再提升。

反向逐步搜尋的過程相同,只不過順序相反:從把所有的特徵都用於訓練模型,接著一次性移除一個特徵,直到模型的效能驟降。

我們提及這一演算法純粹是源於某些歷史原因。儘管很多教科書都把逐步搜尋演算法作為一個有效的方法,但它所表現出來的效能總是不及其它監督式方法,比如正則化。逐步搜尋有很多明顯的缺陷,最致命的一點就是它是一個貪心演算法,無法面對未來變化的衝擊。我們並不推薦這個演算法。

5.特徵提取

特徵提取是用來創造一個新的、較小的特徵集,但仍能保留絕大部分有用的資訊。值得再提的是,特徵選取是用來保留原始特徵集中的一部分子特徵集,而特徵提取則是創造全新的特徵集。

跟特徵選取一樣,某些演算法內部已經具有了特徵提取的機制。最好的案例就是深度學習,它可以通過每一層隱神經層,提取出越來越有用的能表徵原始資料的特徵。我們在“深度學習”部分已給出相關的講解。

作為獨立的任務,特徵提取可以是非監督式的(如主成分分析)或監督式的(如線性判別分析)。

5.1 主成分分析

主成分分析是一個非監督式演算法,它用來創造原始特徵的線性組合。新創造出來的特徵他們之間都是正交的,也就是沒有關聯性。具體來說,這些新特徵是按它們本身變化程度的大小來進行排列的。第一個主成分代表了你的資料集中變化最為劇烈的特徵,第二個主成分代表了變化程度排在第二位的特徵,以此類推。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

因此,你可以通過限制使用主成分的個數來達到資料降維的目的。例如,你可以僅採用能使累積可解釋方差為90%的主成分數量。

你需要在使用主成分分析之前,對資料進行歸一化處理。否則,原始資料中特徵值數量級最大的那個特徵將會主導你新創造出來的主成分特徵。

  • 優點:主成分分析是一項多用途技術,實用效果非常好。它部署起來快速、簡單,也就是說,你可以很方便地測試演算法效能,無論使用還是不使用主成分分析。此外,主成分分析還有好幾種變體和擴充套件(如:核主成分分析(kernel PCA),稀疏主成分分析(sparse PCA)),用以解決特定的問題。

  • 缺點:新創造出來的主成分並不具備可解釋性,因而在某些情況下,新特徵與應用實際場景之間很難建立起聯絡。此外,你仍然需要手動設定、調整累積可解釋方差的閾值。

  • 實現

Python - http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html

R - https://stat.ethz.ch/R-manual/R-devel/library/stats/html/prcomp.html

5.2 線性判別分析

線性判別分析不是隱含狄利克雷分佈,它同樣用來構造原始特徵集的線性組合。但與主成分分析不同,線性判別分析不會最大化可解釋方差,而是最大化類別間的分離程度。

因此,線性判別分析是一種監督式學習方式,它必須使用有標記的資料集。那麼,線性判別分析與主成分分析,到底哪種方法更好呢?這要視具體的情況而定,“沒有免費的午餐”原理在這裡同樣適用。

線性判別分析同樣依賴於特徵值的數量級,你同樣需要先對特徵值做歸一化處理。

  • 優點:線性判別分析是一種監督式學習,基於這種方式獲取到的特徵可以(但並不總是能)提升模型效能。此外,線性判別分析還有一些變體(如二次線性判別分析),可用來解決特定的問題。

  • 缺點:與主成分分析一樣,新創造出來的特徵不具有可解釋性。而且,你同樣要手動設定、調整需要保留的特徵數量。線性判別分析需要已經標記好的資料,因此,這也讓它更加接地氣兒。

  • 實現

Python - http://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html#sklearn.discriminant_analysis.LinearDiscriminantAnalysis

R - https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/lda.html

5.3 自編碼機

自編碼機是一種人工神經網路,它是用來重新構建原始輸入的。例如,影象自編碼機是訓練來重新表徵原始資料的,而非用以區分圖片裡面的小貓、小狗。

但這有用嗎?這裡的關鍵,是在隱含層搭建比輸入層和輸出層更少數量的神經元。這樣,隱含層就會不斷學習如何用更少的特徵來表徵原始影象。

盤點|最實用的機器學習演算法優缺點分析,沒有比這篇說得更好了

因為是用輸入影象來作為目標輸出,自編碼機被視為無監督學習。它們可被直接使用(如:影象壓縮)或按順序堆疊使用(如:深度學習)。

  • 優點:自編碼機是人工神經網路中的一種,這表示它們對某些特定型別的資料表現會非常好,比如影象和語音資料。

  • 缺點:自編碼機是一種人工神經網路。這就是說,它們的優化需要更多的資料來進行訓練。它們並不能作為一般意義上的資料降維演算法來用。

  • 實現

Python - https://keras.io/

R - http://mxnet.io/api/r/index.html

小結

基於我們的經驗,以下是一些有用的建議:

  1. 練習,練習,練習。要找到一些資料集,趁熱打鐵。瞭解這些演算法只是一個開頭,掌握好它們就需要你不停地實踐。

  2. 掌握好基礎。掌握這裡演算法,能為你去運用機器學習打下堅實的基礎,因為其他所有的演算法都是基於上述演算法的一些變形。舉例來說,先掌握主成分分析和線性判別分析之前的區別,而後再去學習線性判別分析的相關細節以及二次線性判別分析之間的差別,效果會更好。

  3. 鐵律,好的資料遠勝於花哨的演算法。在機器學習應用領域,演算法總是可以替換的;而有效的探索性分析、資料清洗與特徵工程總是能大力提升你的結果。我們會經常提及這一點,因為這就是該死的真相!

原文連結:

elitedatascience.com/machine-lea…

elitedatascience.com/dimensional…


相關文章