回歸、分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R...

2021-01-11 機器之心Pro

選自EliteDataScience機器之心編譯參與:蔣思源、晏奇

在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。而機器之心也在文末給出了這些算法的具體實現細節。

對機器學習算法進行分類不是一件容易的事情,總的來看,有如下幾種方式:生成與判別、參數與非參數、監督與非監督等等。

然而,就實踐經驗來看,這些都不是實戰過程中最有效的分類算法的方式。因為對於應用機器學習而言,開發者一般會在腦海中有一個最終目標,比如預測一個結果或是對你的觀察進行分類。

因此,我們想介紹另一種對算法進行分類的路數,其基於機器學習任務來分類。

沒有免費午餐定理

在機器學習中,有個定理被稱為「沒有免費的午餐」。簡而言之,就是說沒有一個算法可以完美解決所有問題,而且這對於監督學習(即對預測的建模)而言尤其如此。

舉個例子,你不能說神經網絡就一定任何時候都比決策樹優秀,反過來也是。這其中存在很多影響因素,比如你數據集的規模和結構。

所以,當你使用一個固定的數據測試集來評估性能,挑選最適合算法時,你應該針對你的問題嘗試多種不同的算法。

當然,你所使用的算法必須要適合於你試圖解決的問題,這也就有了如何選擇正確的機器學習任務這一問題。做個類比,如果你需要打掃你的房子,你可能會用吸塵器、掃帚或者是拖把,但是你絕不會掏出一把鏟子然後開始挖地。

機器學習任務

在本次梳理中,我們將涵蓋目前「三大」最常見機器學習任務:

回歸方法分類方法聚類方法

說明:

本文的梳理不會涵蓋具體領域的問題,比如自然語言處理。本文也不會對每個算法都進行梳理。因為現有太多算法,而且新的算法也層出不窮。然而,這份清單將向讀者展現對每個任務而言目前具有代表性的算法概覽。

1、回歸方法

回歸方法是一種對數值型連續隨機變量進行預測和建模的監督學習算法。使用案例一般包括房價預測、股票走勢或測試成績等連續變化的案例。

回歸任務的特點是標註的數據集具有數值型的目標變量。也就是說,每一個觀察樣本都有一個數值型的標註真值以監督算法。

1.1 線性回歸(正則化)

線性回歸是處理回歸任務最常用的算法之一。該算法的形式十分簡單,它期望使用一個超平面擬合數據集(只有兩個變量的時候就是一條直線)。如果數據集中的變量存在線性關係,那麼其就能擬合地非常好。

在實踐中,簡單的線性回歸通常被使用正則化的回歸方法(LASSO、Ridge 和 Elastic-Net)所代替。正則化其實就是一種對過多回歸係數採取懲罰以減少過擬合風險的技術。當然,我們還得確定懲罰強度以讓模型在欠擬合和過擬合之間達到平衡。

優點:線性回歸的理解與解釋都十分直觀,並且還能通過正則化來降低過擬合的風險。另外,線性模型很容易使用隨機梯度下降和新數據更新模型權重。缺點:線性回歸在變量是非線性關係的時候表現很差。並且其也不夠靈活以捕捉更複雜的模式,添加正確的交互項或使用多項式很困難並需要大量時間。

Python 實現:http://scikit-learn.org/stable/modules/linear_model.htmlR 實現:https://cran.r-project.org/web/packages/glmnet/index.html

1.2 回歸樹(集成方法)

回歸樹(決策樹的一種)通過將數據集重複分割為不同的分支而實現分層學習,分割的標準是最大化每一次分離的信息增益。這種分支結構讓回歸樹很自然地學習到非線性關係。

集成方法,如隨機森林(RF)或梯度提升樹(GBM)則組合了許多獨立訓練的樹。這種算法的主要思想就是組合多個弱學習算法而成為一種強學習算法,不過這裡並不會具體地展開。在實踐中 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://scikit-learn.org/stable/modules/ensemble.html#classification梯度提升樹 R 實現:https://cran.r-project.org/web/packages/gbm/index.html

1.3 深度學習

深度學習是指能學習極其複雜模式的多層神經網絡。該算法使用在輸入層和輸出層之間的隱藏層對數據的中間表徵建模,這也是其他算法很難學到的部分。

深度學習還有其他幾個重要的機制,如卷積和 drop-out 等,這些機制令該算法能有效地學習到高維數據。然而深度學習相對於其他算法需要更多的數據,因為其有更大數量級的參數需要估計。

優點:深度學習是目前某些領域最先進的技術,如計算機視覺和語音識別等。深度神經網絡在圖像、音頻和文本等數據上表現優異,並且該算法也很容易對新數據使用反向傳播算法更新模型參數。它們的架構(即層級的數量和結構)能夠適應於多種問題,並且隱藏層也減少了算法對特徵工程的依賴。缺點:深度學習算法通常不適合作為通用目的的算法,因為其需要大量的數據。實際上,深度學習通常在經典機器學習問題上並沒有集成方法表現得好。另外,其在訓練上是計算密集型的,所以這就需要更富經驗的人進行調參(即設置架構和超參數)以減少訓練時間。

Python 資源:https://keras.io/R 資源:http://mxnet.io/

1.4 最近鄰算法

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

而這種算法是內存密集型,對高維數據的處理效果並不是很好,並且還需要高效的距離函數來度量和計算相似度。在實踐中,基本上使用正則化的回歸或樹型集成方法是最好的選擇。

2、分類方法

分類方法是一種對離散型隨機變量建模或預測的監督學習算法。使用案例包括郵件過濾、金融欺詐和預測僱員異動等輸出為類別的任務。

許多回歸算法都有與其相對應的分類算法,分類算法通常適用於預測一個類別(或類別的概率)而不是連續的數值。

2.1 Logistic 回歸(正則化)

Logistic 回歸是與線性回歸相對應的一種分類方法,且該算法的基本概念由線性回歸推導而出。Logistic 回歸通過 Logistic 函數(即 Sigmoid 函數)將預測映射到 0 到 1 中間,因此預測值就可以看成某個類別的概率。

該模型仍然還是「線性」的,所以只有在數據是線性可分(即數據可被一個超平面完全分離)時,算法才能有優秀的表現。同樣 Logistic 模型能懲罰模型係數而進行正則化。

優點:輸出有很好的概率解釋,並且算法也能正則化而避免過擬合。Logistic 模型很容易使用隨機梯度下降和新數據更新模型權重。缺點:Logistic 回歸在多條或非線性決策邊界時性能比較差。

Python 實現:http://scikit-learn.org/stable/modules/linear_model.html#logistic-regressionR 實現: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://scikit-learn.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 支持向量機

支持向量機(SVM)可以使用一個稱之為核函數的技巧擴展到非線性分類問題,而該算法本質上就是計算兩個稱之為支持向量的觀測數據之間的距離。SVM 算法尋找的決策邊界即最大化其與樣本間隔的邊界,因此支持向量機又稱為大間距分類器。

支持向量機中的核函數採用非線性變換,將非線性問題變換為線性問題

例如,SVM 使用線性核函數就能得到類似於 logistic 回歸的結果,只不過支持向量機因為最大化了間隔而更具魯棒性。因此,在實踐中,SVM 最大的優點就是可以使用非線性核函數對非線性決策邊界建模。

優點:SVM 能對非線性決策邊界建模,並且有許多可選的核函數形式。SVM 同樣面對過擬合有相當大的魯棒性,這一點在高維空間中尤其突出。缺點:然而,SVM 是內存密集型算法,由於選擇正確的核函數是很重要的,所以其很難調參,也不能擴展到較大的數據集中。目前在工業界中,隨機森林通常優於支持向量機算法。

Python 實現:http://scikit-learn.org/stable/modules/svm.html#classificationR 實現:https://cran.r-project.org/web/packages/kernlab/index.html

2.5 樸素貝葉斯

樸素貝葉斯(NB)是一種基於貝葉斯定理和特徵條件獨立假設的分類方法。本質上樸素貝葉斯模型就是一個概率表,其通過訓練數據更新這張表中的概率。為了預測一個新的觀察值,樸素貝葉斯算法就是根據樣本的特徵值在概率表中尋找最大概率的那個類別。

之所以稱之為「樸素」,是因為該算法的核心就是特徵條件獨立性假設(每一個特徵之間相互獨立),而這一假設在現實世界中基本是不現實的。

優點:即使條件獨立性假設很難成立,但樸素貝葉斯算法在實踐中表現出乎意料地好。該算法很容易實現並能隨數據集的更新而擴展。缺點:因為樸素貝葉斯算法太簡單了,所以其也經常被以上列出的分類算法所替代。

Python 實現:http://scikit-learn.org/stable/modules/naive_bayes.htmlR 實現:https://cran.r-project.org/web/packages/naivebayes/index.html

3、聚類

聚類是一種無監督學習任務,該算法基於數據的內部結構尋找觀察樣本的自然族群(即集群)。使用案例包括細分客戶、新聞聚類、文章推薦等。

因為聚類是一種無監督學習(即數據沒有標註),並且通常使用數據可視化評價結果。如果存在「正確的回答」(即在訓練集中存在預標註的集群),那麼分類算法可能更加合適。

3.1 K 均值聚類

K 均值聚類是一種通用目的的算法,聚類的度量基於樣本點之間的幾何距離(即在坐標平面中的距離)。集群是圍繞在聚類中心的族群,而集群呈現出類球狀並具有相似的大小。聚類算法是我們推薦給初學者的算法,因為該算法不僅十分簡單,而且還足夠靈活以面對大多數問題都能給出合理的結果。

優點:K 均值聚類是最流行的聚類算法,因為該算法足夠快速、簡單,並且如果你的預處理數據和特徵工程十分有效,那麼該聚類算法將擁有令人驚嘆的靈活性。缺點:該算法需要指定集群的數量,而 K 值的選擇通常都不是那麼容易確定的。另外,如果訓練數據中的真實集群並不是類球狀的,那麼 K 均值聚類會得出一些比較差的集群。

Python 實現:http://scikit-learn.org/stable/modules/clustering.html#k-meansR 實現:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html

3.2 Affinity Propagation 聚類

AP 聚類算法是一種相對較新的聚類算法,該聚類算法基於兩個樣本點之間的圖形距離(graph distances)確定集群。採用該聚類方法的集群擁有更小和不相等的大小。

優點:該算法不需要指出明確的集群數量(但是需要指定「sample preference」和「damping」等超參數)。缺點:AP 聚類算法主要的缺點就是訓練速度比較慢,並需要大量內存,因此也就很難擴展到大數據集中。另外,該算法同樣假定潛在的集群是類球狀的。

Python 實現:http://scikit-learn.org/stable/modules/clustering.html#affinity-propagationR 實現:https://cran.r-project.org/web/packages/apcluster/index.html

3.3 層次聚類(Hierarchical / Agglomerative)

層次聚類是一系列基於以下概念的聚類算法:

最開始由一個數據點作為一個集群對於每個集群,基於相同的標準合併集群重複這一過程直到只留下一個集群,因此就得到了集群的層次結構。

優點:層次聚類最主要的優點是集群不再需要假設為類球形。另外其也可以擴展到大數據集。缺點:有點像 K 均值聚類,該算法需要設定集群的數量(即在算法完成後需要保留的層次)。

Python 實現:http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clusteringR 實現: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#dbscanR 實現:https://cran.r-project.org/web/packages/dbscan/index.html

結語

本文從回歸問題、分類問題和聚類問題三個角度下初步了解了各個算法的優缺點,也基本了解了那些算法到底是什麼。但以上每一個算法都有更多的概念和細節沒有展現出來,我們不能知道它們的損失函數是什麼、訓練目標是什麼、權重更新策略是什麼等等一些列問題。

原文地址:https://elitedatascience.com/machine-learning-algorithms#regression

相關焦點

  • ...分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R實現)
    選自EliteDataScience機器之心編譯參與:蔣思源、晏奇在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。而機器之心也在文末給出了這些算法的具體實現細節。
  • 回歸、分類與聚類:三大方向剖解機器學習算法的優缺點
    在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。
  • 機器學習之SKlearn(scikit-learn)的K-means聚類算法
    在工程應用中,用python手寫代碼來從頭實現一個算法的可能性非常低,這樣不僅耗時耗力,還不一定能夠寫出構架清晰,穩定性強的模型。更多情況下,是分析採集到的數據,根據數據特徵選擇適合的算法,在工具包中調用算法,調整算法的參數,獲取需要的信息,從而實現算法效率和效果之間的平衡。而sklearn,正是這樣一個可以幫助我們高效實現算法應用的工具包。
  • python機器學習之k-means聚類算法(1)
    k-means算法是一種無監督的機器學習算法,雖然是機器學習,但它簡單易於實現。本篇採用python語言,自主編程實現k-menas算法,當然python用專門的庫函數來實現該算法,但本次主要使用該算法闡述編程思想,所以不採用內置函數。採用自主編寫的程序的方式。
  • 機器學習中的聚類算法有哪幾種?
    來源:博學谷 作者:照照目前,聚類算法被廣泛應用於用戶畫像、廣告推薦、新聞推送和圖像分割等等。聚類算法是機器學習中一種「數據探索」的分析方法,它幫助我們在大量的數據中探索和發現數據的結構。那麼機器學習中的聚類算法有哪幾種呢?
  • 算法應用|機器學習python應用,初識機器學習是怎樣滴感受?
    本系列文章主要介紹機器學習在實踐中的應用,介紹利用 Python 的生態環境,使用機器學習的算法來解決工程實踐中的問題,而不是介紹算法本身。本系列文章參考了《機器學習Python實踐》,會通過例子一步一步地引導大家使用機器學習來處理和分類與回歸模型相關的問題。每個算法模型都介紹其較為通用且實用的建模過程,力爭使基礎較差的讀者也能無障礙利用python來使用機器學習算法。
  • 無監督機器學習算法:聚類
    聚類是另一種無監督機器學習方法,該方法將數據點分為相似的組,稱之為「類」。一個類包含來自數據集的一個觀察子集,同一類中的所有觀察值都被認為是「相似的」。每個類裡觀測值彼此之間接近(稱為內聚),兩個不同的類裡的觀測值彼此遠離或者儘可能不同(稱為分離)。下圖描述了類的內聚和分離。聚類算法在許多投資問題中特別有用。
  • 機器學習算法之聚類算法簡介
    1 聚類算法概述聚類分析又稱群分析,它是研究(樣品或指標)分類問題的一種統計分析方法,同時也是數據挖掘的一個重要算法。俗話說:「物以類聚,人以群分」,在自然科學和社會科學中,存在著大量的分類問題。所謂類,通俗地說,就是指相似元素的集合。
  • 機器學習十大經典算法之K-Means聚類算法
    聚類介紹聚類在機器學習,數據挖掘,模式識別,圖像分析以及生物信息等領域有廣泛的應用。聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性,常見的包括在坐標系中更加短的空間距離(一般是歐式距離)等。
  • 跟著吳恩達老師學習機器學習,Python筆記分享!
    純手擼python線性回歸算法:逐步版上面這篇文章只在單個變量的數據集上有用。但是在現實生活中絕大多數數據集有多個變量。使用同一個簡單公式你可以開發出多變量的算法。python多元線性回歸算法逐步演示多項式回歸這個是線性回歸的姊妹。
  • 「機器學習」機器學習算法優缺點對比(匯總篇)
    文中內容結合了個人在查閱資料過程中收集到的前人總結,同時添加了部分自身總結,在這裡,依據實際使用中的經驗,將對此模型優缺點及選擇詳加討論。主要回顧下幾個常用算法的適應場景及其優缺點!機器學習算法太多了,分類、回歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,所以在實際應用中,我們一般都是採用啟發式學習方式來實驗。
  • Python密度聚類算法-DBSCAN實踐
    一、前言去年學聚類算法的R語言的時候,有層次聚類、系統聚類、K-means聚類、K中心聚類,最後呢,被DBSCAN聚類算法迷上了。為什麼呢,首先它可以發現任何形狀的簇,其次我認為它的理論也是比較簡單易懂的,今年在python這門語言上我打算好好研究DBSCAN。
  • 常見機器學習算法優缺點比較
    7.人工神經網絡的優缺點  人工神經網絡的優點:  · 分類的準確度高;  · 並行分布處理能力強,分布存儲及學習能力強,  · 對噪聲神經有較強的魯棒性和容錯能力  8、K-Means聚類  之前寫過一篇關於K-Means聚類的文章,博文連結:機器學習算法-K-means聚類。關於K-Means的推導,裡面有著很強大的EM思想。
  • 機器學習算法的基本知識(使用Python和R代碼)
    創建本指南背後的理念是簡化全球有抱負的數據科學家和機器學習愛好者的旅程。 本指南能夠使你在研究機器學習問題的過程中獲取經驗。 我提供了關於各種機器學習算法以及R&Python代碼的高級理解以及運行它們,這些應該足以使你得心順手。
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖1假設每個點的維度是n,即每個點有n個特徵維度,計算這些點數據到數據中心A、B、C的距離,從而將每個數據歸類到A或B或C。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。什麼是聚類聚類是根據數據的屬性將數據分為兩個或更多組的任務,更確切地說,是基於數據中或多或少明顯的某些模式。
  • 機器學習 | 算法筆記(五)- K-Means聚類算法以及代碼實現
    概述上一篇講述了《機器學習 | 算法筆記(四)- 決策樹算法以及代碼實現》,本篇講述機器學習算法K-Means聚類,內容包括模型介紹及代碼實現。k-Means算法k-Means算法是一種聚類算法,它是一種無監督學習算法,目的是將相似的對象歸到同一個蔟中。蔟內的對象越相似,聚類的效果就越好。聚類和分類最大的不同在於,分類的目標事先已知,而聚類則不一樣。其產生的結果和分類相同,而只是類別沒有預先定義。
  • 各種機器學習分類算法的優缺點
    機器學習中有許多分類算法。本文將介紹分類中使用的各種機器學習算法的優缺點,還將列出他們的應用範圍。SVM(支持向量機)SVM的優點:1.在高維中表現良好。在現實世界中有無限維度(不僅僅是2D和3D)。例如,圖像數據、基因數據、醫學數據等具有更高的維數,支持向量機在這方面是有用的。基本上,當特徵/列的數量較多時,SVM表現良好。
  • 63種機器學習算法
    對於開始,python或R本身似乎是一個波濤洶湧的大海,需要一些專門的實踐。 但是,對於業務經理而言,掌握這些知識至關重要。 新一代的MBA正在學習它,而較老的一代應該學習它。我的博客系列旨在以簡單易懂的方式解釋這些算法,以便具有python基本知識的人可以實現它們,並從他們的生活和業務中受益。
  • 機器學習中的聚類算法
    機器學習中的聚類算法聚類是一種經典的性能度量由於聚類算法不依賴於樣本的真實類標,就不能像監督學習的分類那般,通過計算分對分錯(即精確度或錯誤率一般聚類有兩類性能度量指標:外部指標和內部指標。>顯然a和b代表著聚類結果好壞的正能量,b和c則表示參考結果和聚類結果相矛盾,基於這四個值可以導出以下常用的外部評價指標: