本章節主要介紹機器學習傳統算法的監督學習部分。監督學習算法主要解決回歸和分類兩大問題。只能做回歸的算法是線性回歸,只能做分類的算法是邏輯回歸和貝葉斯分類。其他的算法既可以做回歸又可以做分類。
1. 線性回歸(Linear Regression)
線性回歸屬于監督學習,因此方法和監督學習應該是一樣的,先給定一個訓練集,根據這個訓練集學習出一個線性函數,然后測試這個函數訓練的好不好(即此函數是否足夠擬合訓練集數據),挑選出最好的函數(cost function最小)即可。
1.1 線性回歸分類
(1) 單變量回歸
我們能夠給出單變量線性回歸的模型:
我們需要使用到Cost Function(代價函數),代價函數越小,說明線性回歸地越好(和訓練集擬合地越好),當然最小就是0,即完全擬合。
(2) 多變量回歸
多變量線性回歸之前必須要Feature Scaling。思想:將各個feature的值標準化,使得取值范圍大致都在-1<=x<=1之間。
這里我們可以定義出多變量線性回歸的模型:
1.2 求擬合方程方法
(1) 最小二乘法
“最小二乘法”的核心就是保證所有數據偏差的平方和最小。(“平方”的在古時侯的稱謂為“二乘”)。
(2) 嶺回歸
嶺回歸(Ridge Regression)是在平方誤差的基礎上增加正則項。通過確定lamda的值可以使得在方差和偏差之間達到平衡。
嶺回歸優于最小二乘回歸的原因在于方差-偏倚選擇。隨著lambda的增大,模型方差減小而偏倚(輕微的)增加。
嶺回歸的一個缺點:在建模時,同時引入p個預測變量,罰約束項可以收縮這些預測變量的待估系數接近0,但并非恰好是0(除非lambda為無窮大)。這個缺點對于模型精度影響不大,但給模型的解釋造成了困難。這個缺點可以由lasso來克服。(所以嶺回歸雖然減少了模型的復雜度,并沒有真正解決變量選擇的問題)
(3) Lasso回歸
lasso是在RSS最小化(Residual Sum of Squares)的計算中加入一個l1范數作為罰約束:
l1范數的好處是當lambda充分大時可以把某些待估系數精確地收縮到0。
2. 邏輯回歸(Logistic Regression)
(1 ) 邏輯回歸模型
簡單來說線性回歸就是直接將特征值和其對應的概率進行相乘得到一個結果,邏輯回歸則是這樣的結果上加上一個邏輯函數,這里選用的就是Sigmoid函數。邏輯回歸分為二分類和多分類。
假設我們的樣本是{x, y},y是0或者1,表示正類或者負類,x是我們的m維的樣本特征向量。那么這個樣本x屬于正類,也就是y=1的“概率”可以通過下面的邏輯函數來表示:
所以說上面的logistic回歸就是一個線性分類模型,它與線性回歸的不同點在于:為了將線性回歸輸出的很大范圍的數,例如從負無窮到正無窮,壓縮到0和1之間,這樣的輸出值表達為“可能性”才能說服廣大民眾。當然了,把大值壓縮到這個范圍還有個很好的好處,就是可以消除特別冒尖的變量的影響(不知道理解的是否正確)。而實現這個偉大的功能其實就只需要平凡一舉,也就是在輸出加一個logistic函數。另外,對于二分類來說,可以簡單的認為:如果樣本x屬于正類的概率大于0.5,那么就判定它是正類,否則就是負類。
所以說,LogisticRegression 就是一個被logistic方程歸一化后的線性回歸,僅此而已。
(2) 代價函數
那代價函數有了,我們下一步要做的就是優化求解了。我們先嘗試對上面的代價函數求導,看導數為0的時候可不可以解出來,也就是有沒有解析解,有這個解的時候,就皆大歡喜了,一步到位。如果沒有就需要通過迭代了,耗時耗力。
我們先變換下L(θ):取自然對數,然后化簡(不要看到一堆公式就害怕哦,很簡單的哦,只需要耐心一點點,自己動手推推就知道了。注:有xi的時候,表示它是第i個樣本,下面沒有做區分了,相信你的眼睛是雪亮的),得到:
然后我們令該導數為0,你會很失望的發現,它無法解析求解。不信你就去嘗試一下。所以沒辦法了,只能借助高大上的迭代來搞定了。運用用了經典的梯度下降算法就可以了。
3. 貝葉斯分類(Bayes Classification)
貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。本文作為分類算法的第一篇,將首先介紹分類問題,對分類問題進行一個正式的定義。然后,介紹貝葉斯分類算法的基礎——貝葉斯定理。最后,通過實例討論貝葉斯分類中最簡單的一種:樸素貝葉斯分類。
(1) 貝葉斯定理
這個定理解決了現實生活里經常遇到的問題:已知某條件概率,如何得到兩個事件交換后的概率,也就是在已知P(A|B)的情況下如何求得P(B|A)。這里先解釋什么是條件概率:
(2) 樸素貝葉斯分類
樸素貝葉斯分類是一種十分簡單的分類算法,叫它樸素貝葉斯分類是因為這種方法的思想真的很樸素,樸素貝葉斯的思想基礎是這樣的:對于給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬于哪個類別。通俗來說,就好比這么個道理,你在街上看到一個黑人,我問你你猜這哥們哪里來的,你十有八九猜非洲。為什么呢?因為黑人中非洲人的比率最高,當然人家也可能是美洲人或亞洲人,但在沒有其它可用信息下,我們會選擇條件概率最大的類別,這就是樸素貝葉斯的思想基礎。
4. 決策樹(Decision Tree)
決策樹(Decision Tree)是一種簡單但是廣泛使用的分類器。通過訓練數據構建決策樹,可以高效的對未知的數據進行分類。決策數有兩大優點:1)決策樹模型可以讀性好,具有描述性,有助于人工分析;2)效率高,決策樹只需要一次構建,反復使用,每一次預測的最大計算次數不超過決策樹的深度。
決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。其每個非葉節點表示一個特征屬性上的測試,每個分支代表這個特征屬性在某個值域上的輸出,而每個葉節點存放一個類別。使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特征屬性,并按照其值選擇輸出分支,直到到達葉子節點,將葉子節點存放的類別作為決策結果。
4.1 決策樹的構造
不同于貝葉斯算法,決策樹的構造過程不依賴領域知識,它使用屬性選擇度量來選擇將元組最好地劃分成不同的類的屬性。所謂決策樹的構造就是進行屬性選擇度量確定各個特征屬性之間的拓撲結構。
構造決策樹的關鍵步驟是分裂屬性。所謂分裂屬性就是在某個節點處按照某一特征屬性的不同劃分構造不同的分支,其目標是讓各個分裂子集盡可能地“純”。盡可能“純”就是盡量讓一個分裂子集中待分類項屬于同一類別。分裂屬性分為三種不同的情況:
1、屬性是離散值且不要求生成二叉決策樹。此時用屬性的每一個劃分作為一個分支。
2、屬性是離散值且要求生成二叉決策樹。此時使用屬性劃分的一個子集進行測試,按照“屬于此子集”和“不屬于此子集”分成兩個分支。
3、屬性是連續值。此時確定一個值作為分裂點split_point,按照>split_point和<=split_point生成兩個分支。
構造決策樹的關鍵性內容是進行屬性選擇度量,屬性選擇度量是一種選擇分裂準則,是將給定的類標記的訓練集合的數據劃分D“最好”地分成個體類的啟發式方法,它決定了拓撲結構及分裂點split_point的選擇。
屬性選擇度量算法有很多,一般使用自頂向下遞歸分治法,并采用不回溯的貪心策略。這里介紹ID3和C4.5兩種常用算法。
4.2 ?量化純度
4.3 停止條件
決策樹的構建過程是一個遞歸的過程,所以需要確定停止條件,否則過程將不會結束。一種最直觀的方式是當每個子節點只有一種類型的記錄時停止,但是這樣往往會使得樹的節點過多,導致過擬合問題(Overfitting)。另一種可行的方法是當前節點中的記錄數低于一個最小的閥值,那么就停止分割,將max(P(i))對應的分類作為當前葉節點的分類。
4.4 優化方案
采用上面算法生成的決策樹在事件中往往會導致過濾擬合。也就是該決策樹對訓練數據可以得到很低的錯誤率,但是運用到測試數據上卻得到非常高的錯誤率。過渡擬合的原因有以下幾點:
(1) 修剪枝葉
決策樹過渡擬合往往是因為太過“茂盛”,也就是節點過多,所以需要裁剪(Prune Tree)枝葉。裁剪枝葉的策略對決策樹正確率的影響很大。主要有兩種裁剪策略。
前置裁剪在構建決策樹的過程時,提前停止。那么,會將切分節點的條件設置的很苛刻,導致決策樹很短小。結果就是決策樹無法達到最優。實踐證明這中策略無法得到較好的結果。
后置裁剪決策樹構建好后,然后才開始裁剪。采用兩種方法:1)用單一葉節點代替整個子樹,葉節點的分類采用子樹中最主要的分類;2)將一個子樹完全替代另外一顆子樹。后置裁剪有個問題就是計算效率,有些節點計算后就被裁剪了,導致有點浪費。
(2) K-Fold Cross Validation
首先計算出整體的決策樹T,葉節點個數記作N,設i屬于[1,N]。對每個i,使用K-Fold Cross Validation方法計算決策樹,并裁剪到i個節點,計算錯誤率,最后求出平均錯誤率。這樣可以用具有最小錯誤率對應的i作為最終決策樹的大小,對原始決策樹進行裁剪,得到最優決策樹。
(3) Random Forest
Random Forest是用訓練數據隨機的計算出許多決策樹,形成了一個森林。然后用這個森林對未知數據進行預測,選取投票最多的分類。實踐證明,此算法的錯誤率得到了經一步的降低。這種方法背后的原理可以用“三個臭皮匠定一個諸葛亮”這句諺語來概括。一顆樹預測正確的概率可能不高,但是集體預測正確的概率卻很高。
5. K最近鄰法(KNN)
K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別。KNN算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法雖然從原理上也依賴于極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由于KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
KNN算法不僅可以用于分類,還可以用于回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成正比(組合函數)。
該算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本占多數。 該算法只計算“最近的”鄰居樣本,某一類的樣本數量很大,那么或者這類樣本并不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量并不能影響運行結果。可以采用權值的方法(和該樣本距離小的鄰居權值大)來改進。該方法的另一個不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該算法比較適用于樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域采用這種算法比較容易產生誤分。
K-NN可以說是一種最直接的用來分類未知數據的方法。基本通過下面這張圖跟文字說明就可以明白K-NN是干什么的。
簡單來說,K-NN可以看成:有那么一堆你已經知道分類的數據,然后當一個新數據進入的時候,就開始跟訓練數據里的每個點求距離,然后挑離這個訓練數據最近的K個點看看這幾個點屬于什么類型,然后用少數服從多數的原則,給新數據歸類。
6. 支持向量機( SVM)
6.1 SVM原理
SVM從線性可分情況下的最優分類面發展而來。最優分類面就是要求分類線不但能將兩類正確分開(訓練錯誤率為0),且使分類間隔最大。SVM考慮尋找一個滿足分類要求的超平面,并且使訓練集中的點距離分類面盡可能的遠,也就是尋找一個分類面使它兩側的空白區域(margin)最大。
過兩類樣本中離分類面最近的點且平行于最優分類面的超平面上H1,H2的訓練樣本就叫做支持向量。
6.2 核函數
看一個例子來知道核函數是干什么用的。
故事是這樣子的:在很久以前的情人節,大俠要去救他的愛人,但魔鬼和他玩了一個游戲。
魔鬼在桌子上似乎有規律放了兩種顏色的球,說:“你用一根棍分開它們?要求:盡量在放更多球之后,仍然適用。”
一般用線性核和高斯核,也就是Linear核與RBF核
需要注意的是需要對數據歸一化處理,很多使用者忘了這個小細節
然后一般情況下RBF效果是不會差于Linear
但是時間上RBF會耗費更多,其他同學也解釋過了
下面是吳恩達的見解:
1. 如果Feature的數量很大,跟樣本數量差不多,這時候選用LR或者是Linear Kernel的SVM
2. 如果Feature的數量比較小,樣本數量一般,不算大也不算小,選用SVM+Gaussian Kernel
3. 如果Feature的數量比較小,而樣本數量很多,需要手工添加一些feature變成第一種情況
6.3 松弛變量
如果兩個分類樣本有重疊,如下圖:
這時候可以考慮采取松弛變量 。
7. AdaBoost
Adaboost是一種迭代算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然后把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)。Adaboost算法本身是通過改變數據分布來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的準確率,來確定每個樣本的權值。將修改過權值的新數據集送給下層分類器進行訓練,最后將每次得到的分類器最后融合起來,作為最后的決策分類器。
7.1 算法概述
1、先通過對N個訓練樣本的學習得到第一個弱分類器;
2、將分錯的樣本和其他的新數據一起構成一個新的N個的訓練樣本,通過對這個樣本的學習得到第二個弱分類器;
3、將1和2都分錯了的樣本加上其他的新樣本構成另一個新的N個的訓練樣本,通過對這個樣本的學習得到第三個弱分類器
4、最終經過提升的強分類器。即某個數據被分為哪一類要由各分類器權值決定。
7.2 Adaboost算法的基本思路
7.3 示例
每個區域是屬于哪個屬性,由這個區域所在分類器的權值綜合決定。比如左下角的區域,屬于藍色分類區的權重為h1 中的0.42和h2 中的0.65,其和為1.07;屬于淡紅色分類區域的權重為h3 中的0.92;屬于淡紅色分類區的權重小于屬于藍色分類區的權值,因此左下角屬于藍色分類區。因此可以得到整合的結果如上圖所示,從結果圖中看,即使是簡單的分類器,組合起來也能獲得很好的分類效果。
7.4 分類器權值調整的原因
由公式可以看到,權值是關于誤差的表達式。每次迭代都會提高錯分點的權值,當下一次分類器再次錯分這些點之后,會提高整體的錯誤率,這樣就導致分類器權值變小,進而導致這個分類器在最終的混合分類器中的權值變小,也就是說,Adaboost算法讓正確率高的分類器占整體的權值更高,讓正確率低的分類器權值更低,從而提高最終分類器的正確率。
7.5 優缺點分析
優點:
1)Adaboost是一種有很高精度的分類器
2)可以使用各種方法構建子分類器,Adaboost算法提供的是框架
3)當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單
4)簡單,不用做特征篩選
5)不用擔心overfitting(過度擬合)
缺點:
1)容易受到噪聲干擾,這也是大部分算法的缺點
2)訓練時間過長
3)執行效果依賴于弱分類器的選擇