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

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

請點擊此處輸入圖片描述

推薦理由

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

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

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

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

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

廣義線性模型

支持向量機

最近鄰

決策樹

神經網絡

……

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

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

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

天下沒有免費的午餐

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

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

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

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

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

機器學習的任務

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

1、迴歸(Regression)

2、分類(Classification)

3、聚類(Clustering)

以及兩大數據降維(Dimensionality Reduction)問題:

4、特徵選取(Feature Selection)

5、特徵提取(Feature Extraction)

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

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

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

▌1.迴歸

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

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

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

線性迴歸

1.1 (正則化)線性迴歸

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

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

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

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

  • 實現:

Python - http://scikit-learn.org/stable/modules/linear_model.html

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

1.2 迴歸樹(集成方法)

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

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

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

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

  • 實現:隨機森林

Python - http://scikit-learn.org/stable/modules/ensemble.html#random-forests

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

  • 實現:梯度提升樹

Python - http://scikitlearn.org/stable/modules/ensemble.html#classification

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

1.3 深度學習

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

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

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

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

  • 實現:

Python - https://keras.io/

R - http://mxnet.io/

1.4 榮譽獎:最近鄰算法

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

它是內存密集型算法,處理高維數據時的效果並不理想,同時還需要高效的距離函數來計算相似度。在實踐中,使用正則化的迴歸或樹型集成方法通常是更好的選擇。

▌2.分類

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

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

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

邏輯迴歸

2.1 (正則化)邏輯迴歸

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

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

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

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

  • 實現:

Python - http://scikit-learn.org/stable/modules/linear_model.html#logistic-regression

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

2.2 分類樹(集成方法)

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

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

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

  • 實現:隨機森林

Python - http://scikit-learn.org/stable/modules/ensemble.html#regression

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

  • 實現:梯度提升樹

Python - http://scikitlearn.org/stable/modules/ensemble.html#classification

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

2.3 深度學習

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

  • 優點:深度學習非常適合於音頻、文本與圖像數據的分類。

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

  • 實現:

Python - https://keras.io/

R - http://mxnet.io/

2.4 支持向量機

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

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

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

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

  • 實現:

Python - http://scikit-learn.org/stable/modules/svm.html#classification

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

2.5 樸素貝葉斯

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

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

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

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

  • 實現:

Python - http://scikit-learn.org/stable/modules/naive_bayes.html

R - htps://cran.r-project.org/web/packages/naivebayes/index.html

▌3.聚類

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

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

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

K 均值

3.1 K 均值

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

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

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

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

  • 實現:

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

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

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鏈接:

https://www.quora.com/What-is-the-curse-of-dimensionality/answer/Kevin-Lacker

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

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

原文鏈接:

https://elitedatascience.com/machine-learning-algorithms

https://elitedatascience.com/dimensionality-reduction-algorithms

➤版權申明:如需轉載請先徵得同意。

相關推薦

推薦中...