Python3 Machine Learning !算法實現總結

感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.htmlhtml

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。前端

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:算法

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。網絡

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。架構

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。併發

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。框架

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。機器學習

爲何bagging類集成學習能下降過擬合?函數

Python機器學習—算法總結

誤差方差的感性認識高併發

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30746.html

機器學習算法太多了,分類、迴歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,因此在實際應用中,咱們通常都是採用啓發式學習方式來實驗。一般最開始咱們都會選擇你們廣泛認同的算法,諸如SVM,GBDT,Adaboost,如今深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在意精度(accuracy)的話,最好的方法就是經過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,而後調整參數確保每一個算法達到最優解,最後選擇最好的一個。可是若是你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裏有些技巧能夠參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於咱們去選擇它。

誤差&方差

在統計學中,一個模型好壞,是根據誤差和方差來衡量的,因此咱們先來普及一下誤差和方差:

從一個訓練集中隨機選取一部分樣本進行訓練獲得一個模型。重複上面的工做,獲得k個模型。

Python機器學習—算法總結

Python機器學習—算法總結

若是是小訓練集,高誤差/低方差的分類器(例如,樸素貝葉斯NB)要比低誤差/高方差大分類的優點大(例如,KNN),由於後者會過擬合。可是,隨着你訓練集的增加,模型對於原數據的預測能力就越好,誤差就會下降,此時低誤差/高方差分類器就會漸漸的表現其優點(由於它們有較低的漸近偏差),此時高誤差分類器此時已經不足以提供準確的模型了。

從上面的過程咱們能夠理解,從不一樣採樣數據集進行模型訓練,結果越類似越好,也就是說模型對不一樣的數據集不敏感,那麼對於待測數據也會同等對待,也就不容易過擬合。

誤差 (bias) 定義爲:爲模型的指望預測與真實值之間的差別。

方差 (variance) 定義爲衡量模型對不一樣數據集D的敏感程度,也能夠認爲是衡量模型的不穩定性。若方差大,則表示數據的微小變更就能致使學習出的模型產生較大差別。可能的情形是在訓練集上擬合的很好,到了測試集上因爲數據的改變導致準確率降低不少,這是典型的過擬合。

爲何bagging類集成學習能下降過擬合?

Python機器學習—算法總結

誤差方差的感性認識

Python機器學習—算法總結

固然,你也能夠認爲這是生成模型(NB)與判別模型(KNN)的一個區別。

爲何說樸素貝葉斯是高誤差低方差?

如下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來說是咱們要在訓練集上學習一個模型,而後拿到測試集去用,效果好很差要根據測試集的錯誤率來衡量。但不少時候,咱們只能假設測試集和訓練集的是符合同一個數據分佈的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的狀況下,去衡量測試錯誤率呢?

因爲訓練樣本不多(至少不足夠多),因此經過訓練集獲得的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分佈,要知道刻畫真實的數據分佈纔是咱們的目的,而不是隻刻畫訓練集的有限的數據點)。並且,實際中,訓練樣本每每還有必定的噪音偏差,因此若是太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裏面的偏差都當成了真實的數據分佈特徵,從而獲得錯誤的數據分佈估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。可是也不能用太簡單的模型,不然在數據分佈比較複雜的時候,模型就不足以刻畫數據分佈了(體現爲連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合代表採用的模型比真實的數據分佈更復雜,而欠擬合表示採用的模型比真實的數據分佈要簡單。

在統計學習框架下,你們刻畫模型複雜度的時候,有這麼個觀點,認爲Error = Bias + Variance。這裏的Error大概能夠理解爲模型的預測錯誤率,是有兩部分組成的,一部分是因爲模型太簡單而帶來的估計不許確的部分(Bias),另外一部分是因爲模型太複雜而帶來的更大的變化空間和不肯定性(Variance)。

因此,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。因此,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高誤差而低方差。

在實際中,爲了讓Error儘可能小,咱們在選擇模型的時候須要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

Python機器學習—算法總結

當模型複雜度上升的時候,誤差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要仍是在因而否是要求聯合分佈),很是簡單,你只是作了一堆計數。若是注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,因此你只須要較少的訓練數據便可。即便NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互做用,用mRMR中R來說,就是特徵冗餘。引用一個比較經典的例子,好比,雖然你喜歡Brad Pitt和Tom Cruise的電影,可是它不能學習出你不喜歡他們在一塊兒演的電影。

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。

缺點:

  • 須要計算先驗機率;
  • 分類決策存在錯誤率;
  • 對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯迴歸)

屬於判別式模型,有不少正則化模型的方法(L0, L1,L2,etc),並且你沒必要像在用樸素貝葉斯那樣擔憂你的特徵是否相關。與決策樹與SVM機相比,你還會獲得一個不錯的機率解釋,你甚至能夠輕鬆地利用新數據來更新模型(使用在線梯度降低算法,online gradient descent)。若是你須要一個機率架構(好比,簡單地調節分類閾值,指明不肯定性,或者是要得到置信區間),或者你但願之後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數:

g(x)=11+exp(−x)g(x)=11+exp(−x)

優勢

  • 實現簡單,普遍的應用於工業問題上;
  • 分類時計算量很是小,速度很快,存儲資源低;
  • 便利的觀測樣本機率分數;
  • 對邏輯迴歸而言,多重共線性並非問題,它能夠結合L2正則化來解決該問題;

缺點

  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,通常準確度不過高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;
  • 對於非線性特徵,須要進行轉換;

3.線性迴歸

線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

優勢: 實現簡單,計算簡單;

缺點: 不能擬合非線性數據.

4.最近鄰算法——KNN

KNN即最近鄰算法,其主要過程爲:

計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等); 2. 對上面全部的距離值進行排序; 3. 選前k個最小距離的樣本; 4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

KNN算法的優勢

  • 理論成熟,思想簡單,既能夠用來作分類也能夠用來作迴歸;
  • 可用於非線性分類;
  • 訓練時間複雜度爲O(n);
  • 對數據沒有假設,準確度高,對outlier不敏感;(outlier是離羣點,使用KNN時,離羣點多半不會是距離最近的前K個)

缺點

  • 計算量大;
  • 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);
  • 須要大量的內存;

5.決策樹

易於解釋。它能夠毫無壓力地處理特徵間的交互關係而且是非參數化的,所以你沒必要擔憂異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,而後類別A又出如今特徵維度x前端的狀況)。它的缺點之一就是不支持在線學習,因而在新樣本到來後,決策樹須要所有重建。另外一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提高樹boosted tree)之類的集成方法的切入點。另外,隨機森林常常是不少分類問題的贏家(一般比支持向量機好上那麼一丁點),它訓練快速而且可調,同時你無須擔憂要像支持向量機那樣調一大堆參數,因此在之前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

信息熵的計算公式以下:

Python機器學習—算法總結

其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

如今選中一個屬性xixi用來進行分枝,此時分枝規則是:若是xi=vxi=v的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H′=p1H1+p2H2,則此時的信息增益ΔH=H−H′。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

決策樹自身的優勢

  • 計算簡單,易於理解,可解釋性強;
  • 比較適合處理有缺失屬性的樣本;(決策樹自己會對缺失值進行處理)
  • 可以處理不相關的特徵;
  • 在相對短的時間內可以對大型數據源作出可行且效果良好的結果。

缺點

  • 容易發生過擬合(隨機森林能夠很大程度上減小過擬合);
  • 忽略了數據之間的相關性;
  • 對於那些各種別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具備更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。

5.1 Adaboosting

Adaboost是一種加和模型,每一個模型都是基於上一次模型的錯誤率來創建的,過度關注分錯的樣本,而對正確分類的樣本減小關注度,逐次迭代以後,能夠獲得一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優勢

  • adaboost是一種有很高精度的分類器。
  • 可使用各類方法構建子分類器,Adaboost算法提供的是框架。
  • 當使用簡單分類器時,計算出的結果是能夠理解的,而且弱分類器的構造極其簡單。
  • 簡單,不用作特徵篩選。(由於樣本的特徵權重會自動發生變化,當權重下降到0時,天然就把該特徵篩掉了)
  • 不容易發生overfitting。

缺點:

  • 對outlier比較敏感(由於outlier會是分錯的樣本,那麼就會在樣本權重改變的過程當中起到較大的影響)

5.2 xgboost

這是一個近年來出如今各大比賽的大殺器,奪冠選手很大部分都使用了它。

高準確率高效率高併發,支持自定義損失函數,既能夠用來分類又能夠用來回歸

能夠像隨機森林同樣輸出特徵重要性,由於速度快,適合做爲高維特徵選擇的一大利器

在目標函數中加入正則項,控制了模型的複雜程度,能夠避免過擬合

支持列抽樣,也就是隨機選擇特徵,加強了模型的穩定性

對缺失值不敏感,能夠學習到包含缺失值的特徵的分裂方向

另一個廣受歡迎的緣由是支持並行,速度槓槓的

用的好,你會發現他的所有都是優勢

6.SVM支持向量機

高準確率,爲避免過擬合提供了很好的理論保證,並且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。惋惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻恰好避開了這些缺點,比較實用。

優勢

  • 能夠解決高維問題,即大型特徵空間;
  • 可以處理非線性特徵的相互做用;
  • 無需依賴整個數據;
  • 能夠提升泛化能力;
  • 須要對數據提早歸一化,不少人使用的時候忽略了這一點,畢竟是基於距離的模型,因此LR也須要歸一化

缺點

  • 當觀測樣本不少時,效率並非很高;
  • 一個可行的解決辦法是模仿隨機森林,對數據分解,訓練多個模型,而後求平均,時間複雜度下降p倍,分多少份,降多少倍
  • 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
  • 對缺失數據敏感;
  • 對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
  • 第一,若是樣本數量小於特徵數,那麼就不必選擇非線性核,簡單的使用線性核就能夠了;
  • 第二,若是樣本數量大於特徵數目,這時可使用非線性核,將樣本映射到更高維度,通常能夠獲得更好的結果;
  • 第三,若是樣本數目和特徵數目相等,該狀況可使用非線性核,原理和第二種同樣。
  • 對於第一種狀況,也能夠先對數據進行降維,而後使用非線性核,這也是一種方法。
  1. 人工神經網絡的優缺點

人工神經網絡的優勢:

  • 分類的準確度高;
  • 並行分佈處理能力強,分佈存儲及學習能力強,
  • 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
  • 具有聯想記憶的功能。

人工神經網絡的缺點:

  • 神經網絡須要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
  • 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
  • 學習時間過長,甚至可能達不到學習的目的。

八、K-Means聚類

關於K-Means聚類的文章,連接:機器學習算法-K-means聚類。關於K-Means的推導,裏面有着很強大的EM思想。

優勢

  • 算法簡單,容易實現 ;
  • 對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<

算法選擇參考

首當其衝應該選擇的就是邏輯迴歸,若是它的效果不怎麼樣,那麼能夠將它的結果做爲基準來參考,在基礎上與其餘算法進行比較;

而後試試決策樹(隨機森林)看看是否能夠大幅度提高你的模型性能。即使最後你並無把它當作爲最終模型,你也可使用隨機森林來移除噪聲變量,作特徵選擇;

若是特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。

一般狀況下:【XGBOOST>=GBDT>=SVM>=RF>=Adaboost>=Other…】,如今深度學習很熱門,不少領域都用到,它是以神經網絡爲基礎的,目前我本身也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不作介紹了。

算法當然重要,但好的數據卻要優於好的算法**,設計優良特徵是大有裨益的**。假如你有一個超大數據集,那麼不管你使用哪一種算法可能對分類性能都沒太大影響(此時就能夠根據速度和易用性來進行抉擇)

相關文章
相關標籤/搜索