上學期花了一個多月讀完了李航老師的《統計學習方法》,現在帶着新入團隊的新同學以讀書會的形式讀這本書,書里邊全是干貨,對於我理解基本的機器學習算法很有幫助,也筆頭做了一些總結(不完全基於此書),現將其摘錄於此作為在博客園的第一篇博客。因為並不是為了掃盲,所以僅僅是抓出脈絡以及關鍵點,方便以后快速溫習,而不是預習。
概論
機器學習很多時候也被稱作統計機器學習,這是因為大部分機器學習方法或多或少基於統計的方法,或者有基於統計方法的版本,即便是早期不涉及統計方法的算法在后來也都有了統計學的解釋。
統計學習的三要素:模型、策略、算法,決定了一個統計學習的方法。整本書的算法均可從這三個思路去思考,並且從這三個思路思考可以培養一定的統計建模的意識。
- 模型是一個可以根據合法輸入產生輸出的“黑盒子”,也即一個從輸入空間(或特征空間)到輸出空間的映射。
- 策略是衡量模型好壞的一個判斷標准,以此可以確定向什么方向修改/優化模型。
- 算法是確定了模型和策略,為了盡量滿足策略所采用的優化模型的做法。
簡單的說,整個學習就是要學習出一個模型,而策略決定了我們所想要的模型,而算法是用來得到模型參數所采用的方法而已。
這本書討論的是有監督學習,而對於有監督學習來說,共有的一個問題就是過擬合問題(overfitting),簡單地來講,這是模型過分“迎合”訓練數據而導致模型在訓練數據上表現良好,而對未知輸入的泛化能力很差的現象。
首先,過擬合是無法避免的。畢竟統計學習在訓練時避免不了要擬合訓練數據,這是因為我們的模型參數就是由訓練數據訓練而來的。這里的“過”指的是模型過於復雜(迎合數據),導致泛化能力急劇下降。這里舉個例子:
這里有多少盒子在樹后?按照我們的直覺應該是只有一個盒子,然而事實上可能是:
顯然,根據我們的直觀認識,對於一個未知的參數(即這里的盒子數),越簡單可能越符合我們的先驗知識。也即簡單的模型對未知的情況泛化能力更高(更加可能是對的)。所以“從貝葉斯估計的角度來看,正則化項對應於模型的先驗概率”,模型越復雜,先驗越小(經驗告訴我們如此復雜的情況不太可能)。
因此,一個自然的想法便是要在策略中限制這種復雜的模型,雖然其在訓練數據上比簡單模型的表現更好。最常見的思路的就是添加正則化項,此項表示了模型的復雜度。在策略中和原始目標求和,即可得到既能得到較大的目標函數值,又不使模型較為復雜的模型參數。一個最簡單的例子就是線性回歸。
另一個常用的方法即交叉驗證,意思是將訓練數據分塊,一部分作為訓練數據,一部分作為測試數據,多次不同地分塊以后取在測試數據上表現最優的模型參數。這種方法的缺點是計算開銷太大,畢竟要多訓練很多次模型。
感知機
這是一個線性的模型,意在用一條線(超平面)對訓練數據進行二分。
- 輸入:訓練數據的特征向量
- 輸出:二值類標
前提是數據嚴格線性可分,即存在一條線(超平面)能將正負例完美分開。而學習的目的即為學出這個分離線(超平面)。
學習的策略為經驗風險最小化,即誤分類點數最少,而假設是線性可分,因此誤分類點數一定可以降為0。但是,誤分類點數並不能指導我們如何修改模型(不能導出有效的算法),因此我們修改了一下策略的表示,改為誤分類點到分離平面的距離之和。因此損失函數為:
\begin{equation}
L(w, b) = -\sum\limits_{x_i\in M} y_i(w_i+b)
\end{equation}
其中,(M)為誤分類點集,(w)和(b)為參數,(y_i)是標准類標,乘上(y_i)乘積保證為正。為求其極小,分別對參數求導並令其導數為0即可:
\begin{align}\notag &\nabla_w L(w, b) = -\sum\limits_{x_i\in M}y_ix_i \\\\ &\nabla_b L(w, b) = -\sum\limits_{x_i\in M}y_i \end{align}
學習算法為梯度下降法,有原始形式和對偶形式之分。 **原始形式核心遞歸式:**\begin{align}\notag &w_{new} = w_{old}+\eta y_{i}x_{i} \\\\ &b_{new} = b_{old}+\eta y_{i} \end{align}
其中\(\eta\)為梯度下降的步長。初始值\(w\)和\(b\)隨機初始化。 如果將\(w\)和\(b\)初始化為0,那么根據原始形式的遞歸式,\(w\)和\(b\)分別可以寫作\(y_{i}x_{i}\)和\(y_{i}\)的線性組合形式,即:\begin{align}\notag &w = -\sum\limits_{i=1}^{N}\alpha_{i}y_{i}x_{i} \\\\ &b = -\sum\limits_{i=1}^{N}\alpha_{i}y{i} \end{align}
系數相同的原因是因為每次更新w和b走過了相同個數的步長。這樣就能將對\(w\)和\(b\)的更新改為對\(\alpha\)和\(b\)的更新,節約了乘法的計算開銷。 **對偶形式的核心遞歸式:**\begin{align}\notag &\alpha_{i} = \alpha_{i}+\eta \\\\ &b = b+\eta y_{i} \end{align}
注意到感知機算法的梯度下降法是用的隨機梯度下降,即每次隨機選擇一個誤分點進行更新,而沒有使用批量梯度下降,這是因為感知機是必然線性可分的,也即最后超平面必然存在,即算法必然收斂,因此可以選擇計算開銷更小的隨機梯度下降法。 #KNN算法 根據近鄰來估計實例點的屬性。有兩種方式,一種是Top-K最近鄰,一種是根據距離確定近鄰。前者算最近的k個鄰居,而后者計算離實例的距離在一定范圍以內的所有鄰居。分別適用於分布密集和分布稀疏的情況。 KNN算法最大的問題在於計算pair之間的距離,這是\(O(n^2)\)的問題,而每次增加點,都需要進行N次計算,這是不可接受的,於是對實例存在的特征空間進行切分,具體算法即kd樹算法。按維度進行切分,思想類似於二分查找。 #朴素貝葉斯 模型為條件概率模型,即目的為學習一個條件概率分布(和一個先驗分布)。 - 輸入:實例的特征向量 - 輸出:多值類標模型假設:對於任一實例,在已知類標時,各特征相互獨立。這其實是將指數級參數個數((2^n))的聯合分布降為了線性參數個數((2n+1))的條件概率與先驗之積。
\begin{equation}
P(c_k|x_1, x_2, \dots, x_n) = \frac{P(x_1, \dots, x_n|c_k)\cdot P(c_k)}{P(x_1,x_2, \dots, x_n)}
\end{equation}
由於分母是平凡的,對於相同實例不同類標都是相同的。因此可以略去。分母中的條件概率因為模型假設,可以寫為:
\begin{equation}
P(x_1, \dots, x_n | c_k) = \prod\limits_{i=1}^{n}P(x_i|c_k)
\end{equation}
策略是期望風險最小化,即分類正誤的期望,可等價於后驗概率最小化(證明略)。也即只用找到后驗概率最大的類標賦給實例即可。這里模型未知參數為(P(x_i|c_k))和(P(c_k)),為了估計其值,使用的是極大似然估計,通俗的說就是用訓練樣本中對應項出現的頻率來作為估計的概率(因為極大似然估計和強假設,因此被叫做朴素貝葉斯,或者傻瓜貝葉斯)。
所有涉及到共現矩陣,也即觀測的頻率,以及概率的算法,都需要考慮概率值為0的情況,或者分母為0的情況。朴素貝葉斯加入拉普拉斯平滑使避免出現0。
決策樹
if-then結構的樹,目的即為學習出這樣一棵樹,非葉子節點是特征,葉子節點是類標。
- 輸入:特征向量
- 輸出:多值類標
策略是特征選擇,越靠近根的特征應該有更好的區分能力,然而這一條件無法直接指導算法優化,因此引入信息增益定義。
幾個定義:
- 熵:表示隨機變量X的不確定程度:
\begin{equation}
H(X) = -\sum\limits_{i=1}^{n}P_i\log P_{i}
\end{equation}
這里遍歷了X可能的i個取值,限制條件為所有取值概率之和為1 - 經驗熵:將數據集D做分類的不確定程度:
\begin{equation}
H(D) = -\sum\limits_{k=1}^{K}\frac{\vert C_k\vert}{\vert D\vert}\log\frac{\vert C_k\vert}{\vert D\vert}
\end{equation}
其中D可被分成K個類,並且第k個類的實例個數為(\vert C_k\vert),D中實例個數為(\vert D\vert) - 經驗條件熵:給定特征下,將數據集做分類的不確定性(用分成某子類的概率對子類的經驗熵進行加權)。
\begin{equation}
\begin{aligned}
H(D|A)&=\sum\limits_{i=1}^n\frac{|D_i|}{D}H(D_i) \\
&=-\sum\limits_{i=1}^n\frac{|D_i|}{|D|}\sum\limits_{k=1}^K\frac{|D_{ik}|}{|D_i|}\log\frac{|D_{ik}|}{|D_i|}
\end{aligned}
\end{equation}
然后信息增益可以定義為:給定特征A時D上的經驗熵與經驗條件熵之差。
\begin{equation}
g(D, A) = H(D)-H(D|A)
\end{equation}
定義信息增益比:信息增益與數據集關於特征A的值的熵之比。
\begin{equation}
g_{R}(D, A) = \frac{g(D, A)}{H_A(D)},
\end{equation}
其中(H_{A}(D) = -\sum\limits_{i=1}^n\frac{|D_i|}{|D|}\log\frac{|D_i|}{|D|}),n是A可取的值的個數,(D_i)是根據特征A進行分類以后得到的子類,可以被看作是經驗熵。
算法中,ID3算法遞歸建樹,對每個節點,選擇當前使信息增益最大的特征。C4.5算法,用信息增益比來替代ID3中的信息增益。這是因為消息增益越大,表明該特征對全局熵減少得也就最大,也即能使全局不確定性降低最大,若一個特征可以取的值越多,每個分支下的實例數就越少,相應的不確定程度就越低,換句話說,信息增益會偏向取值更多的特征,因此ID3算法偏向生成那種寬而淺的樹,這其實是不合理的。而信息增益比用經驗熵做約束,懲罰了取值數多的特征,因此可以得到更好的樹。
決策樹模型為了防止過擬合,需要一定的剪枝,其做法是用節點個數作為正則化項。
CART算法(建樹、剪枝),用即你最小化建二叉樹,即對於所有可能的特征的所有可能取值,取基尼最大的作為當前節點特征。
基尼指數:
\begin{equation}
\text{Gini}(p) = \sum\limits_{k=1}^K p_{k}(1-p_{k})=1-\sum\limits_{k=1}^Kp_k^2
\end{equation}