機器學習之多種算法優缺點總結及優化方法


算法思維導圖:
這裏寫圖片描述

一、無監督算法:

1、聚類算法:Kmeans

Kmeans中心思想:事先確定常數K,常數K意味着最終的聚類類別數,首先隨機選定初始點爲質心,並通過計算每一個樣本與質心之間的相似度(這裏爲歐式距離),將樣本點歸到最相似的類中,接着,重新計算每個類的質心(即爲類中心),重複這樣的過程,直到質心不再改變,最終就確定了每個樣本所屬的類別以及每個類的質心。

優點:
1、算法原理簡單、處理速度較快
2、當聚類是密集的,且類與類之間區別明顯時,效果較好

缺點:
1、在K-means算法中,K是事先給定的,比較難確定
2、對孤立點比較敏感,噪聲敏感(中心點易偏移)
3、結果不穩定,初始值的選定對結果有一些影響,結果不一定全局最優,只能保證局部最優(與k的個數及初選值有關)
4、空間複雜度o(N),時間複雜度o(IKN #N-樣本點個數;K-中心點個數;I-迭代次數)。

優化算法:
K-means++
二分K-means
ISODATA
Kernel K-means
mini bath K-Means

K均值算法的調優一般可以從以下幾個角度出發。

(1) 數據歸一化和離羣點處理。

K均值聚類本質上是一種基於歐氏距離度量的數據劃分方法,均值和方差大的維度將對數據的聚類結果產生決定性的影響,所以未做歸一化處理和統一單位的數據是無法直接參與運算和比較的。同時,離羣點或者少量噪聲數據就會對均值產生較大的影響,導致中心偏移,因此使用K均值聚類算法之前通常需要對數據做預處理。

(2)合理選擇K值。

K值的選擇是K均值聚類最大的問題之一,這也是K均值聚類算法的主要缺點。K值的選擇一般基於經驗或者多次實驗結果。例如手肘法,就是嘗試不同的K值,並將不同K值所對應的損失函數畫成折線,橫軸爲K的取值,縱軸爲誤差平方和定義的損失函數。手肘法認爲拐點就是K的最優值。

手肘法是一個經驗方法,缺點是不能夠自動化,因此研究員又提出來更先進的方法,其中包括比較有名的Gap Statistics方法,Gap Statistics方法的優點是不需要肉眼判斷,只需要找到最大的Gap Statistics所對應的K即可,因此該方法也適用於批量優化作業。

(3)採用核函數。

採用核函數是另一種可以嘗試的改進方向。傳統的歐氏距離度量方式,使得K均值算法本質上假設了各個數據簇的數據具有一樣的先驗嫌疑,並呈現球形或者高維球形分佈,這種分佈在實際生活中並不常見。面對非凸的數據分佈數據時,可能需要引入核函數來優化,這時算法又是通過一個非線性映射,將輸入空間中的數據點映射到高位的特徵空間中,並在新的特徵空間中進行聚類。非線性映射增加了數據點線性可分的概率,從而在經典的聚類算法失效的情況下,通過引入核函數可以達到更爲準確的聚類結果。

應用場景:
1、用戶畫像、廣告推薦 / Data Segmentation / 搜索引擎的流量推薦 / 惡意流量識別
2、基於位置信息的商業推送 / 新聞聚類 / 篩選排序
3、圖像分割,降維,識別 / 離羣點檢測,信用卡異常消費 / 發掘相同功能的基因片段

算法詳細鏈接:https://blog.csdn.net/sinat_30353259/article/details/80887779

2、關聯規則算法:Apriori

Apriori算法:算法是一種挖掘關聯規則的算法,用於挖掘其內含的、未知的卻又實際存在的數據關係,其核心是基於兩階段頻集思想的遞推算法

優點:
1、使用先驗性質,大大提高了頻繁項集逐層產生的效率
2、簡單易理解,數據集要求低

缺點:
1、計算量很大,當商品數據量大時更顯著,基本是不可計算的
2、在驗證候選頻繁K項集的時候,需要對整個數據庫進行掃描,非常耗時
3、商品並不是全部平等銷售的, 僅使用支持度衡量,容易導致出現假性關聯

應用:
1、交叉銷售
2、捆綁銷售
3、買了還買、看了還看、買了還同時買……
4、基於興趣的實時新聞推薦

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/80950824

3、關聯算法:FP–growth

FP(FP-growth)關聯算法:將數據存儲在一種稱爲FP樹的緊湊數據結構中。FP代表頻繁模式(Frequent Pattern)。一棵FP樹看上去與計算機科學中的其他樹結構類似,但是它通過鏈接(link)來連接相似元素,被連起來的元素項可以看成一個鏈表。
支持度:指某頻繁項集在整個數據集中的比例。假設數據集有 10 條記錄,包含{‘雞蛋’, ‘麪包’}的有 5 條記錄,那麼{‘雞蛋’, ‘麪包’}的支持度就是 5/10 = 0.5。
置信度:是針對某個關聯規則定義的。有關聯規則如{‘雞蛋’, ‘麪包’} -> {‘牛奶’},它的置信度計算公式爲{‘雞蛋’, ‘麪包’, ‘牛奶’}的支持度/{‘雞蛋’, ‘麪包’}的支持度。假設{‘雞蛋’, ‘麪包’, ‘牛奶’}的支持度爲 0.45,{‘雞蛋’, ‘麪包’}的支持度爲 0.5,則{‘雞蛋’, ‘麪包’} -> {‘牛奶’}的置信度爲 0.45 / 0.5 = 0.9。
停止條件:支持度或者置信度小於某個閾值

https://www.cnblogs.com/zlslch/p/6789179.html

二、有監督算法

1、分類算法

決策樹(Decision Tree)

決策樹是一個基本的分類迴歸算法
決策樹:是一種樹形結構,其中每個內部節點表示一個屬性上的判斷,每個分支代表一個判斷結果的輸出,最後每個葉節點代表一種分類結果,本質是一顆由多個判斷節點組成的樹。

經典決策樹算法:
ID3:只能對離散型屬性的數據集構造決策樹,信息增益作爲節點特徵選擇
C4.5:ID3的擴展、可以處理連續型變量、可以處理缺失值、剪枝,信息增益比作爲節點特徵選擇
CART:可以處理離散型或連續型變量、並可以分類/迴歸,使用gini係數作爲節點特徵選擇

優點:
1、生成的決策樹結果很直觀
2、基本不需要預處理,不需要提前歸一化,處理缺失值
3、既可以處理離散值也可以處理連續值
4、可以很容易處理分類問題
5、相比於神經網絡之類的黑盒分類模型,決策樹的可解釋性很好
6、可以用交叉驗證的剪枝來選擇模型,從而提高泛化能力
7、對於異常值的容錯能力號,健壯性高

缺點:
1、決策樹算法容易過擬合
2、決策樹會因爲樣本發生一點點的改動而導致結果變化
3、尋找最優的決策樹是一個NP難的問題,容易陷入局部最優
4、有些複雜的關係,決策樹很難學習到,例如異或關係
5、沒有在線學習

適用情景:
因爲它能夠生成清晰的基於特徵(feature)選擇不同預測結果的樹狀結構,數據分析師希望更好的理解手上的數據的時候往往可以使用決策樹。

同時它也是相對容易被攻擊的分類器[3]。這裏的攻擊是指人爲的改變一些特徵,使得分類器判斷錯誤。常見於垃圾郵件躲避檢測中。因爲決策樹最終在底層判斷是基於單個條件的,攻擊者往往只需要改變很少的特徵就可以逃過監測。

應用場景:
1、熵的例子:論壇流失性跟性別還是和活躍度有關
2、基尼的列子:拖欠貸款和是否有房、婚姻狀況、收入的關聯性
3、貸款風險評估
4、保險推廣預測

優化算法:
C4.5 預剪枝和後剪枝
CART 預剪枝和後剪枝

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/80917362

支持向量機(SVM)

SVM:尋找到一個超平面使樣本分成兩類,並且間隔最大。

SVM分爲:
線性可分支持向量機、線性近似可分支持向量機、非線性支持向量機

優點:
1、解決小樣本下機器學習問題。
2、解決非線性問題。
3、無局部極小值問題。(相對於神經網絡等算法)
4、可以很好的處理高維數據集。
5、泛化能力比較強。

缺點:
1、對於核函數的高維映射解釋力不強,尤其是徑向基函數。
2、對缺失數據敏感。
3、大規模數據計算複雜度大

應用場景:
機器視覺:
1、行人檢測及目標識別
2、病理診斷
數據挖掘:
1、基因序列檢測
2、生物蛋白質檢測
自然語言處理: 文本分類

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/80991273

K近鄰(kNN,k-NearestNeighbor)

K近鄰法實際上利用訓練集對特徵向量空間進行劃分,並作爲其分類模型(分類迴歸)
三個基本要素:K值的選擇(交叉驗證),距離度量(歐氏距離),分類決策函數(多數表決)
實現方法:kd樹
具體方法:給定一個訓練集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的k個實例,這k個實例的多數屬於某個類,就把該輸入實例分爲這個類。

流程:
1) 計算已知類別數據集中的點與當前點之間的距離
2) 按距離遞增次序排序
3) 選取與當前點距離最小的k個點
4) 統計前k個點所在的類別出現的頻率
5) 返回前k個點出現頻率最高的類別作爲當前點的預測分類

k近鄰既可以分類又可以迴歸
k近鄰算法的實現:kd樹
kd樹:是二叉樹,是一種對k維空間中的實例點進行存儲以便對其進行快速檢索的樹形數據結構
構造方法:通常依次選擇座標軸對空間切分,選擇訓練實例點在選定座標軸上的中位數爲切分點,這樣得到的kd樹是平衡的,但未必是最優的

優點:
1、思想簡單、易於理解,易於實現
2、無需估計參數,無須訓練
3、算法複雜度低
4、適合類域交叉樣本
5、適用大樣本自動分類

缺點:
1、惰性學習
2、類別分類不標準化
3、輸出可解釋性不強
4、不均衡性
5、進行分類時計算量大(要掃描全部訓練樣本計算距離)

應用場景:
1、約會網站的匹配
2、手寫數字識別

優化算法: KD樹

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/80901746

樸素貝葉斯

樸素貝葉斯是基於概率論的分類算法,屬於生成模型

樸素貝葉斯的基本方法::通過已知樣本求得先驗概率P(Y)和條件概率P(X|Y),對於給定的實例,計算聯合概率,進而求出後驗概率。
也就是說,它嘗試去找到底這個數據是怎麼生成的(產生的),然後再進行分類。哪個類別最有可能產生這個信號,就屬於那個類別。
基於貝葉斯定理與特徵條件獨立假設分類方法(多分類)

生成方法:由訓練數據集學習聯合概率分佈P(X,Y),然後求得後驗概率分佈P(Y|X)
具體方法:利用訓練數據學習P(X|Y)和P(Y)的估計,得到聯合概率分佈 P(X,Y) = P(Y)P(X|Y)

優點:
1, 算法邏輯簡單,易於實現( 算法思路很簡單, 只要使用貝葉斯公式轉化即可! )
2, 分類過程中時空開銷小( 假設特徵相互獨立, 只會涉及到二維存儲)
3,適用於數據集少的情景

缺點:
理論上, 樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。 但是實際上並非總是如此, 這是因爲樸素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時, 分類效果不好。

應用場景:
病人分類
社區賬號分類
性別分類

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/80932111

邏輯迴歸

邏輯迴歸(LR):邏輯迴歸假設數據服從伯努利分佈,通過極大化似然函數的方法,運用梯度下降來求解參數,來達到將數據二分類的目的。

是由輸入的線性函數表示的輸出的對數機率模型

學習策略:極大似然估計或正則化極大似然估計
學習算法:梯度下降,擬牛頓法
在這裏插入圖片描述
邏輯迴歸爲什麼要用sigmoid?:
邏輯迴歸模型之所以是sigmoid 的形式,源於我們假設y服從伯努利分佈,伯努利分佈又屬於指數分佈族,經過推導,將伯努利分佈變成指數分佈族的形式後。我們發現伯努利分佈的唯一參數Φ與指數分佈族中的參數η具有sigmoid函數關係,於是我們轉而求η與x的關係,此時,我們又假設η與x具有線性關係。至此,找到了我們要用的模型的樣子,也就是邏輯迴歸。
鏈接:https://www.jianshu.com/p/a8d6b40da0cf

優點:

  • 實現簡單,廣泛的應用於工業問題上;
  • 簡單易於理解,直接看到各個特徵的權重
  • 能容易地更新模型吸收新的數據
  • 對邏輯迴歸而言,多重共線性並不是問題,它可以結合L2正則化來解決該問題;
  • 適用於大規模數據集

缺點:

  • 對數據和場景的適應能力有侷限性,不如決策樹算法適應性那麼強。
  • 當特徵空間很大時,邏輯迴歸的性能不是很好;
  • 容易欠擬合,一般準確度不太高
  • 不能很好地處理大量多類特徵或變量;
  • 只能處理兩分類問題(在此基礎上衍生出來的softmax可以用於多分類),且必須線性可分,對於非線性特徵,需要進行轉換;
  • 使用前提: 自變量與因變量是線性關係。
  • 只是廣義線性模型,不是真正的非線性方法 。

應用領域:
1、預測是否發生、發生的概率(流失、客戶響應等預測)
2、影響因素、危險因素分析(找出影響結果的主要因素)
3、判別、分類

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/81138453

2、迴歸算法

迴歸分析是在一系列的已知或能通過獲取的自變量與因變量之間的相關關係的基礎上,建立變量之間的迴歸方程,把迴歸方程作爲算法模型,通過其來實現對新自變量得出因變量的關係。因此迴歸分析是實用的預測模型或分類模型。

線性迴歸

迴歸的目的是預測數值型的目標值。最直接的辦法是依據輸入寫出一個目標值的計算公式,該公式就是所謂的迴歸方程(regression equation)。求迴歸方程中的迴歸係數的過程就是迴歸。

線性迴歸的幾個特點:

  1. 建模速度快,不需要很複雜的計算,在數據量大的情況下依然運行速度很快。
  2. 可以根據係數給出每個變量的理解和解釋
  3. 對異常值很敏感

多項式迴歸

如果一個迴歸,它的自變量指數超過1,則稱爲多項式迴歸

多項式迴歸的特點:

  1. 能夠擬合非線性可分的數據,更加靈活的處理複雜的關係
  2. 因爲需要設置變量的指數,所以它是完全控制要素變量的建模
  3. 需要一些數據的先驗知識才能選擇最佳指數
  4. 如果指數選擇不當容易出現過擬合.

3、集成算法

a、bagging(Bootstrapped Aggregation)

Bagging(Bootstrapped Aggregation的簡稱)對於給定數據處理任務,採用不同的模型、參數、特徵訓練出多個模型,最後採用投票或者加權平均的方式輸出最終結果。

隨機森林

Bagging算法實現隨機森林(有放回抽樣),是用隨機的方式建立一個森林,森林裏面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。

隨機森林的生成方法:
1.從樣本集中通過重採樣的方式隨機選擇n個樣本
2.假設樣本中的特徵數量爲a,再從這些特徵中,隨機選擇k個特徵,用建立決策樹的方式選擇最佳分割點,構建決策樹樹
3.重複m次,產生m棵決策樹
4.多數投票機制來進行預測

優點:

  • 所有的數據都能夠有效利用,而且不用人爲的分出一部分數據來做cross-validation;
  • 隨機森林可以實現很高的精確度,但是隻有很少的參數,而且對於分類和迴歸都適用;
  • 不用擔心過擬合的問題;
  • 不需要事先做特徵選擇,每次只用隨機的選取幾個特徵來訓練樹。

缺點:

  • 相比於其他算法,其輸出預測可能較慢。

隨機森林應用場景:應用於各項AI大賽。
數據維度相對低(幾十維),同時對準確性有較高要求時。
因爲不需要很多參數調整就可以達到不錯的效果,基本上不知道用什麼方法的時候都可以先試一下隨機森林。

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/81034749
隨機森林:
https://blog.csdn.net/sinat_30353259/article/details/81409980

b、boosting算法

訓練基分類器時採用串行方式,各個基分類器之間有依賴。它的基本思路是將基分類器層層疊加,每一層在訓練的時候,對前一層基分類器分錯的樣本,給予更高的權重。測試時,根據各層分類器的加權得到最終結果。
boosting能夠提升弱分類器性能的原因是降低了偏差
算法實現:adaboost
具體做法:
一、針對訓練集修改權值,提高被前一輪弱分類器錯誤分類樣本的權值,而降低那些被正確分類樣本的權值。
二、弱分類器的組合,採取加權多數表決的方法。針對弱分類器修改權值,加大分類誤 差率小的弱分類器的權值,使其在表決中起較大作用,減小分類誤差率大的弱分類器的權值,使其在表決中起較小作用

Adaboost算法

AdaBoost,是英文”Adaptive Boosting”(自適應增強)的縮寫,由Yoav Freund和Robert Schapire在1995年提出。它的自適應在於:前一個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下一個基本分類器。同時,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數。

AdaBoost優點:

  • 容易實施
  • 幾乎沒有參數需要調整
  • 不用擔心過擬合

缺點:

  • 不能保證是最優解
  • 對噪聲很敏感

使用情景:
好的Boosting算法,它的準確性不遜於隨機森林。雖然在[1]的實驗中只有一個擠進前十,但是實際使用中它還是很強的。因爲自帶特徵選擇(feature selection)所以對新手很友好,是一個“不知道用什麼就試一下它吧”的算法。

算法鏈接:https://blog.csdn.net/sinat_30353259/article/details/81071505

GBDT(梯度提升決策樹)

梯度提升決策樹(Gradient Boosting Decision Tree,GBDT)算法是近年來被提及比較多的一個算法,這主要得益於其算法的性能,以及該算法在各類數據挖掘以及機器學習比賽中的卓越表現,在梯度提升決策樹中,其基學習器是分類迴歸樹CART,使用的是CART樹中的迴歸樹。

GBDT: 首先gbdt 是通過採用加法模型(即基函數的線性組合),以及不斷減小訓練過程產生的殘差來達到將數據分類或者回歸的算法。針對一般損失函數優化困難問題,利用損失函數的負梯度在當前模型的值作爲殘差的近似值進行求解。
採用決策樹作爲弱分類器的Gradient Boosting算法被稱爲GBDT

損失函數:殘差
https://blog.csdn.net/tinkle181129/article/details/79681702

優點:
1、精度高(boosting的共同特點)
2、能處理非線性數據,能做迴歸和分類
3、能適應多種損失函數(Gradient梯度的特點)

缺點:
1、計算複雜度大,耗時(Boosting的共性缺點)

梯度提升和梯度下降的區別:
相同點:每一輪迭代中,都利用損失函數相對於模型的負梯度方向的信息來對當前模型進行更新
梯度提升:模型並不需要進行參數化表示,而直接定義在函數空間中,大大擴展使用模型的種類
梯度下降:模型是以參數化表示,從而模型的更新等價於參數的更新。

XGBoost

XGBoost:採用最大化這個差值作爲準則來進行決策樹的構建,通過遍歷所有特徵的取值,尋找使得損失函數前後相差最大時對應的分裂方式。是GBDT的工程實現
https://blog.csdn.net/v_july_v/article/details/81410574
核心思想:

  1. 不斷地添加樹,不斷地進行特徵分裂來生長一棵樹,每次添加一個樹,其實是學習一個新函數,去擬合上次預測的殘差。
  2. 當我們訓練完成得到k棵樹,我們要預測一個樣本的分數,其實就是根據這個樣本的特徵,在每棵樹中會落到對應的一個葉子節點,每個葉子節點就對應一個分數
  3. 最後只需要將每棵樹對應的分數加起來就是該樣本的預測值。

xgboost在代價函數里加入了正則項,用於控制模型的複雜度。正則項裏包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。

優點:
1、除了可以是CART也可以是線性分類器
2、損失函數中加入了正則項,用於控制模型的複雜度
3、借鑑了隨機森林的做法,支持特徵抽樣,不僅防止過擬合,還能減少計算
4、XGBoost工具支持並行化
5、XGBoost的運算速度和算法都會優於GBDT

缺點:
1、XGBoostScikit-learn目前在Scikit-learn中沒有實現,但可以通過python調用

使用場景:
凡是結構化數據上的競賽,基本都是XGBoost勝;非結構化數據,如視頻、音樂都是深度學習勝!

算法鏈接:https://blog.csdn.net/a358463121/article/details/68617389

GBDT和XGBoost區別(百面機器學習):
1、GBDT是機器學習算法,XGBoost是該算法的工程實現
2、在使用CART作爲基分類器時,XGBoost顯式的加入正則項來控制模型的複雜度,有利於防止過擬合,從而提高模型的泛化能力
3、GBDT在模型訓練時只使用了代價函數的一階導數信息,XGBoost對代價函數進行二階泰勒展開,可以同時使用一階和二階導數
4、傳統的GBDT採用CART作爲基分類器,XGBoost支持多種類型的基分類器,比如線性分類器
5、傳統的GBDT在每輪迭代時使用全部的數據,XGBoost則採用了與隨機森林相似的策略,支持對數據進行採樣
6、傳統的GBDT沒有設計對缺失值進行處理,XGBoost能夠自動學習出缺失值得處理策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章