我想把之前數據科學&機器學習所學系統地整理、融合一下,所以寫了一些筆記。沒想到光是第一部分就還挺長……我其實真正想整理的是神經網絡部分的筆記,不知道還有沒有足夠的意願了。
這學期開了數據科學課,很開心,我校信管還挺跟時代嘛。聽c老師說學院甚至打算把整個專業改名,安上「大數據」,但後來發現如此的話教學內容也要大改而師資不匹配。總之我挺高興的,這是我這學期最感興趣的課之一了。
這課兩周內把前四章基礎的東西講完了,數據導入和簡單數據預處理之類的,比我想像中快,我還比較期待後面能學到新東西。
第五章開了個頭,講的是「選擇和評價模型」,大抵是介紹機器學習中的常用模型,分清遇到不同數據分析需求時適用的模型。令我失望的是,真的真的只是講了一下模型的種類,告訴你模型可以用來做什麼,連一點點原理都沒有涉及。我希望今天把課程所學溫習,把上學期的實踐課學到的機器學習原理整合進知識框架裡,順道把之前的筆記好好整理一下。
不同於Machine Learning角度,把機器學習模型分為監督學習和無監督學習;Data Science是從業務問題的角度出發,把模型分為分類、打分、概率、排名、聚類等。我顯然更喜歡前者的分法,相比較之下後者的分法互相交叉,令人迷惑。
但我今天還是按照ds的分類來整理一下吧。
分類問題 Classification分類問題決定如何為對象分配(已知的)標籤 。分類問題屬於監督學習,即訓練模型時需要數據已經被分類好了。監督(Supervised)本質上說的就是正確答案已知(right answer given),比如訓練模型去學習貓狗圖片分類時,每張圖片已經事先被打上了「貓貓」或者「狗狗」的標籤。模型拿到一張圖片,給出自己的判斷,再查看標準答案,得知自己答對了沒有;然後不斷修正自己,直到達到令人滿意的準確率。這種數據標籤都是人工打的,說起來l老師還提起過這甚至催生了一個新興職業來著,叫「數據標註員」,還挺賺錢?
分類問題的常用算法,ds課上介紹了樸素貝葉斯、決策樹、邏輯斯諦回歸和支持向量機。我很遺憾的是這裡介紹的幾種算法都比較基礎,並且不知道為什麼似乎甚至不打算提及神經網絡的樣子……樸素貝葉斯、決策樹和邏輯回歸都是比較簡易的模型,支持向量機雖然很深,但l老師說它是上個世紀的經典,現在已經逐漸過時,被很多算法給取代了……不過從應用角度來說,我們本科生處理處理小規模數據,用簡單算法可能比神經網絡效果好多了,學這些先入個門也挺合適把。
(都是適合比較簡單的任務,高級的還是神經網絡給力)
樸素貝葉斯很簡單,所以適合處理比較多的變量;尤其在應用中發現它很適合文本分類。但是現在深度學習領域的自然語言處理不是靠譜多了……另一方面,樸素貝葉斯成立有一個必須的假設:各輸入變量是相互獨立的——這很限制它的靠譜性。
決策樹就比較適合輸入變量之間有相關性的情況,它的分類邏輯是一層一層的。
邏輯回歸是可以輸出概率值的。
支持向量機是上世紀的經典,能解決比較複雜的問題;但是巧了,神經網絡也很適合解決這類問題,而且效果更好……
好了現在切換到ml頻道,我想整理一下邏輯回歸的算法原理。
然而線性回歸是邏輯回歸的基礎,所以我需要先整理一下線性回歸的原理orz。
線性回歸Linear Regression線性回歸很好理解,輸入的是對象的一系列特徵值x1、x2、x3……,輸出則是需要預測的變量y。比如經典的房價預測問題,輸入某地的一些特徵值(比如犯罪率啊、住宅數啊、人均收入啊等等),輸出預測的該地房價。公式表示起來是這樣:
剛開始非常迷惑我的是已知量未知量的問題。在訓練的時候,輸入值x1、x2和輸出值y都是已知量,而參數θ0、θ1、θ2…才是未知量,機器的根本任務就是擬合出合適的θ值;而在模型投入使用的時候,θ的值已經敲定了,我們拿輸入的一堆x來預測未知的y。
接下來精彩的來了:模型怎樣才能有方向地優化它的參數θ呢?這裡所發生的事情實在很巧妙。
要實現模型優化,需要依次解決兩個問題:
建模誤差:反映模型所預測的值與訓練集中實際值之間的差距
自動優化:自動找出讓誤差更小的參數取值
1. 用代價函數來建模誤差Cost Function這個其實很容易想到。預測值和真實值之間的差即為誤差,那所有的這些差的平均值就能表示整個模型的誤差水平了。
假如圖中黑色直線就是我們擬合出來的線,直線上的每一個點,意味著在x取相應值時,y即為預測值;而同一橫坐標的紅色叉叉對應的y表示真實值。那麼每一條藍色線段即為一次預測的誤差,所有藍色線段長度加起來再除以總數就可以表示整個線的誤差程度了。
當然,預測值與真實值的差可正可負,要全部加起來需要取絕對值;為了方便後續的計算,這裡在定義代價函數的時候取了平方。代價函數的定義出來了:
(呃……本來除以訓練個數m就夠了,前面這個2是哪冒出來的?現在只好說是未卜先知,這個2是為了方便下一步的計算。)
好!有了代價函數來表示誤差水平,那麼模型接下來要做的事情就可以量化了:選取合適的參數θ,使代價函數值最小。
2. 用梯度下降算法來優化參數Gradient Descent怎麼說呢,在我對機器學習膚淺的掌握中,我認為最精妙在於神經網絡;其次就在於這裡的梯度下降算法了。誰能想到一個不怎麼起眼的數學原理,可以應用於這麼巧妙的地方,促進回歸乃至神經網絡的實現,奠定如今一整個蓬勃發展的ml領域的基礎。(……我可能太扯了)
說回我們的目標,要取代價函數的最小值。函數的最值問題,這很容易讓人聯想到——導數。
假如代價函數是如圖所示的拋物線形狀(事實上單變量線性回歸的代價函數確實總會是這樣的形狀),橫坐標代表不同的θ取值,縱坐標是代價函數J(θ)。曲線的底部正是J(θ)的最小值,在這一點導數為0。
一個容易被忽視的現象來了:在最低點右邊,導數值總為正(導數的幾何意義就是切線斜率);在最低點左邊,導數值總為負。而且更仔細想一想,越接近低谷,曲線越平緩,斜率的絕對值越小,導數值也越小;反之越遠則導數值越大。
那麼,如果對θ進行迭代,總是讓當前的θ值減去它對應點的導數值,會發生什麼?答案是θ值會越來越接近最優值!在最低點右邊的θ會減去一個正數,從而向左移動;在左邊的θ會減去一個負數,從而向右移動。離得遠的點會減去一個更大的數,從而蹭蹭靠近;離得近的點會減去一個很小的數,從而緩緩趨近。如下圖:
那麼梯度下降的迭代公式即是:
其中的即為代價函數對的偏導數,α則是學習率,用來調節每次下降的步伐。
至此,我們已經搞明白了線性回歸時,參數自動優化的原理。真正實現線性回歸,只需要利用梯度下降算法,不斷優化參數θ。具體一點來講,只需要將代價函數的偏導數求解出來,代入梯度下降公式,所得即是最終的算法。如下:
Repeat{
}
邏輯回歸Logistic Regression邏輯回歸跟線性回歸的輸入是一樣的,即對象的一系列特徵值;而輸出的是0或1,代表將對象分為兩種類型。比如經典的垃圾郵件分類問題,可以將垃圾郵件的特徵值(比如文本長短啊、發件郵箱地址啊之類的,我也不知道具體是啥)輸入,模型就會給出預測,1代表是垃圾郵件,0代表不是。
邏輯回歸看起來比線性回歸簡單,只能預測出0、1兩個分類,而後者能預測出一整個連續型數值,很厲害的樣子。然而事實上,邏輯回歸只是在線性回歸的結果上加了一個sigmoid函數,暴力讓結果涇渭分明。sigmoid函數是這個:
它長這樣:
其中自變量z是線性回歸的輸出結果,值的大小表明對象跟某類的相似程度。比如說,想預測一封郵件是否垃圾郵件,z=999,就是說:這也太太太太太像一封垃圾郵件了;反之z=-999,就是說:這一點點點點也不像垃圾郵件。這麼說的話,sigmoid函數的作用仿佛就顯現了:它就是把取值範圍很跳脫的z值,轉換成一個(0,1)間的值,正好可以表示概率。極小的z值對應的概率趨於0,極大的z值對應的概率趨於1。
那麼,邏輯回歸的公式可以這麼表示:
其中前一個式子中,e的指數即是線性回歸的輸出,也就是上面說的自變量z。後一個式子是指在參數為θ,輸入為x時,y=1的概率。
這樣的話輸出的值仍然是一些諸如0.2、0.4、0.8這樣的概率,為了讓結果更明確,這裡只需要再進行一個簡單的判決,大於0.5的判為1,小於0.5的判為0。(這裡我理解了很久為什麼如此粗暴且似乎沒有必要,後來想明白經手sigmoid函數的值往往不是很趨近0就是很趨近1,直接判定為0、1是可以比較篤定的。)