機器學習中基本知識及資源
Resource of Machine Learning
還有臺灣大學林軒田教授在coursera上的兩門關於機器學習的課程。
模型中中數學
這裏有一篇關於參數估計的文章,講的比較清楚。先驗概率、最大似然估計、貝葉斯估計、最大後驗概率
常見算法優缺點
1.樸素貝葉斯
樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要還是在於是否是要求聯合分佈),非常簡單,你只是做了一堆計數。
如果注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯迴歸,所以你只需要較少的訓練數據即可。即使NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。
它的主要缺點是它不能學習特徵間的相互作用,用mRMR中R來講,就是特徵冗餘。引用一個比較經典的例子,比如,雖然你喜歡Brad Pitt和Tom Cruise的電影,但是它不能學習出你不喜歡他們在一起演的電影。
優點:
1 樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率。
2 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;
3 對缺失數據不太敏感,算法也比較簡單,常用於文本分類。
缺點:
1 需要計算先驗概率;
2 分類決策存在錯誤率;
3 對輸入數據的表達形式很敏感。
2.邏輯迴歸
屬於判別式模型,有很多正則化模型的方法(L0, L1,L2,etc),而且你不必像在用樸素貝葉斯那樣擔心你的特徵是否相關。
與決策樹與SVM機相比,你還會得到一個不錯的概率解釋,你甚至可以輕鬆地利用新數據來更新模型(使用在線梯度下降算法,online gradient descent)。
如果你需要一個概率架構(比如,簡單地調節分類閾值,指明不確定性,或者是要獲得置信區間),或者你希望以後將更多的訓練數據快速整合到模型中去,那麼使用它吧。
Sigmoid函數:
優點:
1 實現簡單,廣泛的應用於工業問題上;
2 分類時計算量非常小,速度很快,存儲資源低;
3 便利的觀測樣本概率分數;
4 對邏輯迴歸而言,多重共線性並不是問題,它可以結合L2正則化來解決該問題;
缺點:
1 當特徵空間很大時,邏輯迴歸的性能不是很好;
2 容易欠擬合,一般準確度不太高
3 不能很好地處理大量多類特徵或變量;
4 只能處理兩分類問題(在此基礎上衍生出來的softmax可以用於多分類),且必須線性可分;
5 對於非線性特徵,需要進行轉換;
3.線性迴歸
線性迴歸是用於迴歸的,而不像Logistic迴歸是用於分類,其基本思想是用梯度下降法對最小二乘法形式的誤差函數進行優化,當然也可以用normal equation直接求得參數的解,結果爲:
而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:
由此可見LWLR與LR不同,LWLR是一個非參數模型,因爲每次進行迴歸計算都要遍歷訓練樣本至少一次。
優點: 實現簡單,計算簡單;
缺點: 不能擬合非線性數據.
4.最近鄰算法——KNN
KNN即最近鄰算法,其主要過程爲:
1計算訓練樣本和測試樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等);
2 對上面所有的距離值進行排序;
3 選前k個最小距離的樣本;
4 根據這k個樣本的標籤進行投票,得到最後的分類類別;
如何選擇一個最佳的K值,這取決於數據。一般情況下,在分類時較大的K值能夠減小噪聲的影響。但會使類別之間的界限變得模糊。
一個較好的K值可通過各種啓發式技術來獲取,比如,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減小。
近鄰算法具有較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論誤差率。
KNN算法的優點
1 理論成熟,思想簡單,既可以用來做分類也可以用來做迴歸;
2 可用於非線性分類;
3 訓練時間複雜度爲O(n);
4 對數據沒有假設,準確度高,對outlier不敏感;
缺點
1 計算量大;
2 樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);
3 需要大量的內存;
5.決策樹
易於解釋。它可以毫無壓力地處理特徵間的交互關係並且是非參數化的,因此你不必擔心異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,然後類別A又出現在特徵維度x前端的情況)。
它的缺點之一就是不支持在線學習,於是在新樣本到來後,決策樹需要全部重建。
另一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提升樹boosted tree)之類的集成方法的切入點。
另外,隨機森林經常是很多分類問題的贏家(通常比支持向量機好上那麼一丁點),它訓練快速並且可調,同時你無須擔心要像支持向量機那樣調一大堆參數,所以在以前都一直很受歡迎。
決策樹中很重要的一點就是選擇一個屬性進行分枝,因此要注意一下信息增益的計算公式,並深入理解它。
信息熵的計算公式如下:
其中的n代表有n個分類類別(比如假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的概率p1和p2,這樣就可以計算出未選中屬性分枝前的信息熵。
現在選中一個屬性xixi用來進行分枝,此時分枝規則是:如果xi=vxi=v的話,將樣本分到樹的一個分支;如果不相等則進入另一個分支。
很顯然,分支中的樣本很有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H’ =p1 H1+p2 H2,則此時的信息增益ΔH = H - H’。以信息增益爲原則,把所有的屬性都測試一邊,選擇一個使增益最大的屬性作爲本次分枝屬性。
決策樹自身的優點
1 計算簡單,易於理解,可解釋性強;
2 比較適合處理有缺失屬性的樣本;
3 能夠處理不相關的特徵;
4 在相對短的時間內能夠對大型數據源做出可行且效果良好的結果。
缺點
1 容易發生過擬合(隨機森林可以很大程度上減少過擬合);
2 忽略了數據之間的相關性;
3 對於那些各類別樣本數量不一致的數據,在決策樹當中,信息增益的結果偏向於那些具有更多數值的特徵(只要是使用了信息增益,都有這個缺點,如RF)。
6. Adaboosting
Adaboost是一種加和模型,每個模型都是基於上一次模型的錯誤率來建立的,過分關注分錯的樣本,而對正確分類的樣本減少關注度,逐次迭代之後,可以得到一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。
優點:
1 adaboost是一種有很高精度的分類器。
2 可以使用各種方法構建子分類器,Adaboost算法提供的是框架。
3 當使用簡單分類器時,計算出的結果是可以理解的,並且弱分類器的構造極其簡單。
4 簡單,不用做特徵篩選。
5 不容易發生overfitting。
缺點:對outlier比較敏感
7.SVM支持向量機
高準確率,爲避免過擬合提供了很好的理論保證,而且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。可惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻剛好避開了這些缺點,比較實用。
優點
1 可以解決高維問題,即大型特徵空間;
2 能夠處理非線性特徵的相互作用;
3 無需依賴整個數據;
4 可以提高泛化能力;
缺點
1 當觀測樣本很多時,效率並不是很高;
2 對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數;
3 對缺失數據敏感;
對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):
第一,如果樣本數量小於特徵數,那麼就沒必要選擇非線性核,簡單的使用線性核就可以了;
第二,如果樣本數量大於特徵數目,這時可以使用非線性核,將樣本映射到更高維度,一般可以得到更好的結果;
第三,如果樣本數目和特徵數目相等,該情況可以使用非線性核,原理和第二種一樣。
對於第一種情況,也可以先對數據進行降維,然後使用非線性核,這也是一種方法。
8. 人工神經網絡的優缺點
人工神經網絡的優點:
1 分類的準確度高;
2 並行分佈處理能力強,分佈存儲及學習能力強,
3 對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係;
4 具備聯想記憶的功能。
人工神經網絡的缺點:
1 神經網絡需要大量的參數,如網絡拓撲結構、權值和閾值的初始值;
2 不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;
3 學習時間過長,甚至可能達不到學習的目的。
9. K-Means聚類
關於K-Means的推導,裏面有着很強大的EM思想。
優點
1 算法簡單,容易實現 ;
2 對處理大數據集,該算法是相對可伸縮的和高效率的,因爲它的複雜度大約是O(nkt),其中n是所有對象的數目,k是簇的數目,t是迭代的次數。通常k<<n。這個算法通常局部收斂。< p=””>
3 算法嘗試找出使平方誤差函數值最小的k個劃分。當簇是密集的、球狀或團狀的,且簇與簇之間區別明顯時,聚類效果較好。
缺點
1 對數據類型要求較高,適合數值型數據;
2 可能收斂到局部最小值,在大規模數據上收斂較慢
3 K值比較難以選取;
4 對初值的簇心值敏感,對於不同的初始值,可能會導致不同的聚類結果;
5 不適合於發現非凸面形狀的簇,或者大小差別很大的簇。
對於”噪聲”和孤立點數據敏感,少量的該類數據能夠對平均值產生極大影響。
算法選擇參考
首當其衝應該選擇的就是邏輯迴歸,如果它的效果不怎麼樣,那麼可以將它的結果作爲基準來參考,在基礎上與其他算法進行比較; 然後試試決策樹(隨機森林)看看是否可以大幅度提升你的模型性能。即便最後你並沒有把它當做爲最終模型,你也可以使用隨機森林來移除噪聲變量,做特徵選擇; 如果特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失爲一種選擇。
通常情況下:【GBDT>=SVM>=RF>=Adaboost>=Other…】,現在深度學習很熱門,很多領域都用到,它是以神經網絡爲基礎的,目前我自己也在學習,只是理論知識不是很厚實,理解的不夠深,這裏就不做介紹了。
算法固然重要,但好的數據卻要優於好的算法,設計優良特徵是大有裨益的。假如你有一個超大數據集,那麼無論你使用哪種算法可能對分類性能都沒太大影響(此時就可以根據速度和易用性來進行抉擇)。
參考:
http://www.36dsj.com/archives/68363
http://mp.weixin.qq.com/s/uZdkxm5EJX6nZL51UI0yZg?scene=25#wechat_redirect