大數據與機器學習(3)
文中涉及的「數據目錄」和「源代碼目錄」見雲盤:https://pan.baidu.com/s/1slJntRR
各種聚類方法
聚類在現實中的意義非常明確,比如在商業分析中經常需要對用戶進行分類,但是用戶的類型又不是很容易定義清楚,這個時候通過聚類尋找特徵相似的用戶就是一個非常有用的步驟。
聚類分析中,相似的樣本聚集在一起形成一個「簇」,最後數據會被劃分成若干個「簇」。所以,不同的聚類方法的區別就在於判斷「簇」的方法不同,常見的聚類有這樣幾類方法:
- 基於原型的聚類:聚類結構能夠刻畫為「原型」,如 k 均值(K-Means)演算法,刻畫了一個簇內數據圍繞這個簇均值的緊密程度,通常,這類方法在現實中最為常見,比如還有高斯混合模型(Gaussian Mixture Modal,簡稱 GMM)、AP演算法(Affinity Propagation)、譜聚類(Spectral Clustering)等。
- 基於密度的聚類:聚類結構能夠通過樣本分布的緊密程度來確定,如 DBSCAN 演算法、Mean Shift 演算法等。
- 層次化的聚類:在不同的層次上進行聚類劃分,從而形成樹形的聚類結構,如 AGNES(AGglomerative NESting)演算法、Birch 演算法、Ward 演算法等。
下面是若干相同的數據,在不同聚類演算法下得到的結果,從中可以初步了解一下各種演算法的效率以及各演算法的特點:
隱馬爾可夫模型
隱馬爾可夫模型(Hidden Markov Modal,簡稱 HMM)一般用於對時序數據進行建模,在自然語言處理、語音識別、行為預測等領域應用廣泛,其中「隱」的意思是這個模型中隱含有無法被觀測到的狀態。其主要應用場景在於事件按時間順序發生,並且每個事件的觀測值只和上一個或幾個事件有關。
如上圖,隨著事件不斷發生,產生了序列,下標 T 代表了第 T 個事件中包含的狀態信息。其中 z 的序列代表某種隱藏的、無法被觀測到的「隱含狀態」,x 的序列是可以被觀測和度量的「顯式狀態」,HMM 就是希望能夠通過 x 來推測 z ,因為 z 可能反映了系統變化更本質的原因。
這裡有一個標普500指數股票 2016 年到 2017 年跨度一年的數據(數據目錄下 sp500_stocks_1yr.csv),現在選擇其中 Google 的股票為研究對象:
在這個簡單的研究中,將股票市值和每日收盤價的變化作為兩個顯式的變數,使用 HMM 模型來學習 5 種「隱變數」,於是可以得到如下的結果(源代碼目錄下 hmm_stock.py):
圖中每個點代表了股票當日的收盤價,顏色代表了「隱變數」的種類,通過對「隱變數」進行解讀,我們可以預測在不同的系統狀態下,後續發生事件可能的趨勢。比如其中某種「隱變數」代表了股票處於「快速上升」的狀態,那麼對於實際應用來說,就可以設計一種買入股票的操作來進行獲利。
流形學習
所謂「流形」(manifold)是指在局部具有歐氏空間 性質的空間。比如,雖然地球表面是一個三維的球面,但古人就認為地是平的,因為在小範圍看地球表面顯示出了二維空間的性質,這時候可以說,這個局部的二維平面是地球三維球面的一個流形。
在上圖所示這個三維空間中,數據分布的規律其實是沿著一個「柔軟的曲面」構成的,因此,圖中黑色圓圈代表的兩個點的「距離」應該如圖中紅線所示那樣,沿著這個曲面進行度量,否則直接在高維空間中度量這兩個點是得不到準確結果的。所以,這種將「高維空間中柔軟的曲面」展開成一個「低維空間中可以度量距離的流形」的方法,很適合處理高維的數據。而且,這種方法不僅可以用於計算分析,也可以用於數據可視化,因為我們生活在三維空間中,無法直接想像高維空間的樣子,但是我們可以用流形方法來把空間降維到三維甚至二維,這樣就可以直觀地查看和理解數據了。
常見的流形方法有等度量映射(Isometric Mapping,簡稱 Isomap)、多維縮放(Multiple Dimension Scaling,簡稱 MDS)、局部線性嵌入(Locally Linear Embedding,簡稱 LLE)、t 維隨機領域嵌入(t-Stochastic Neighbor Embedding,簡稱 t-SNE)、譜嵌入(Spectral Embedding)、拉普拉斯特徵映射(Laplacian Eigenmaps,簡稱 LE)等等。這些方法中,有些在降維過程中保留了距離度量,如 Isomap、MDS;有些儘可能保留了局部線性關係,如 LLE ;有些儘可能保留鄰接關係,讓原本靠近的數據依然有比較緊密的聯繫,如t-SNE、譜嵌入、LE 等等。
下面是若干相同的數據,在不同流形學習演算法下得到的結果,從中可以初步了解一下各種演算法的效率以及各演算法的特點:
http://scikit-learn.org/stable/auto_examples/manifold/plot_compare_methods.html
集成學習
集成學習,就是集成多個學習器來完成學習任務的方法。集成多個學習器的目的在於改進單一學習器的效果,特別是如果有些學習器效果不佳,集成多個學習器可以提升整體的性能。
比如我們現在要計算人口的分布,雖然我們知道人口和一些數據呈相關性:比如微博簽到數量、夜晚燈光圖、建築物密度數據等等。但是,如果採用其中某一類數據單獨學習,這個效果就相當不好,因為每一類數據和人口的相關性都不是那麼好。這個時候,就需要整合這些不同類別的學習器,集成起來學習人口和各種數據之間的關係,來得到更好的結果。
如何能夠保證若干個效果一般的學習器,整合在一起能夠有比各自學習更好的效果,而不是更差?這需要我們儘可能挑選「好而不同」的學習器,「好」也就是單一的學習器也需要有儘可能好的性能,同時,不同學習器之間要儘可能多地存在差異性,也就是「不同」。
將單一學習器集成的方法大致有兩類,一類是單一學習器之間存在強依賴關係(比如在後一個學習器的樣本中將前一個學習器學習不好的部分增加權重),需要串列的方法,包括各種提升(Boosting)方法,如 AdaBoost 演算法、梯度提升(Gradient Boosting) 演算法等;另一類是單一學習器之間不存在強依賴關係,可以並行的方法,如 Bagging 演算法、隨機森林(Random Forest, 簡稱 RF)演算法等。
下面我們用同一個房價數據(數據目錄下 house_price.csv),來尋找房價(SalePrice)和其它 80 個屬性之間的關係。
先來看一下 Boosting 方法,這裡先使用了梯度提升演算法來集成決策樹學習器(源代碼目錄下 house_price_gb.py),得到回歸分析的 R2 值約為 0.88;再使用隨機森林演算法來集成決策樹學習器(源代碼目錄下 house_price_rf.py),得到回歸分析的 R2 值約為 0.84。下面是兩種演算法分別學習到的影響房價最重要的 10 個因素,雖然最重要的都是些和房屋質量、面積相關的因子,但是顯然,不同演算法對相關性的判斷差別還是很大的。
神經網路
神經網路(Neural Net)可以說是現在機器學習中應用最為廣泛的方法。神經網路從生物的神經系統對真實世界所作的交互反應中得到靈感,通過模擬生物的神經元機制,來達到感知並學習的目的。
從整體看,神經網路就是由一層一層的神經元依次連接而成的一個網路結構,每一層的神經元根據前一層神經元傳遞過來的若干輸入值進行計算,再經過激活函數的計算,給出相應的輸出。可見,不同神經網路的性能差異,主要是由網路結構、激活函數決定的。
目前,使用神經網路、特別是深層神經網路學習(深度學習)在很多類似人類學習的場景下已經能達到非常好的效果,比如:圖像識別、文字識別、語音識別、自然語義理解等等。
比如在圖像識別的場景下,神經網路的每一層相連的神經元都能感知到圖片不同位置、不同深度的特徵;經過多層神經元的反覆提煉,最終能夠得到許多圖片的特徵。當學習的圖片成千上萬以後,神經網路就可以總結出所有比如「汽車」圖片的共同特徵,從而達到識別圖片的目的。
不過,神經網路更類似一個黑盒系統,如何得到最後的結果在邏輯上沒有很好的可解釋性,就好比你看到一個熟人的照片馬上就能知道這是誰,但是讓你去解釋你如何從照片里認出這個人,到底是眼睛比較像、還是鼻子像比較像,這就很難了。
這裡,我們以一個紅酒數據( 數據目錄下 wine.csv)為例來應用一下神經網路,數據的第一列是產地,這些紅酒來自 3 個不同產地,我們不知道各個產地的紅酒都有什麼特點,於是希望神經網路可以自行去感知。這裡設計了一個每層都有 13 個神經元去感知這些信息的 4 層神經網路(見源代碼目錄下 neural_network_wine.py),經過訓練後得到的結果如下:
因為我們採用的是交叉驗證法,因此每次演算法自動提取的訓練集和測試集都不一樣,所以每次結果可能有區別。但總的來說,通過 F1 值可以知道,通過這 13 個物理化學指標去判斷紅酒產地的模型總體性能相當不錯。
深度學習
在上一節中已經介紹了神經網路的大致原理,「深度」的意思是指深度學習使用的神經網路一般層數較多,因為較深的神經網路能夠完成一些高度抽象的弱人工智慧任務:比如下棋、識別圖片、翻譯語音等等。像戰勝李世乭的 AlphaGo 採用的神經網路有 13 層,後來又加深到 40 層;目前在圖像識別領域效果最好的 ResNet 及其變種,網路層數達到幾十層甚至一千多層。
網路結構和學習目的也很有關係,比如在圖像識別領域,大量採用了卷積神經網路(CNN) 結構,通過卷積層來對圖像的局部特性進行感知、再用池化層在不同解析度下對圖像的特性進行反覆提取;而在語音識別、自然語義等領域,由於數據的出現呈時間順序,因此像遞歸神經網路(RNN)結構就重點考慮了信息傳遞的循環依賴關係。總之,如何設計合適的網路層次結構、選擇合適的網路規模,決定了各種目標下不同網路的性能。
下面,以一個圖像識別的例子,來示例如何使用深度學習技術進行圖片分類:
這個示例使用 PyTorch 設計網路並訓練使用,詳細可以參考:http://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html
先來看一下這個簡單的卷積神經網路的結構,其中包含了兩個卷積層,兩個池化層,還有若干全連接層:
使用 5 萬張 32x32 的圖片(https://www.cs.toronto.edu/~kriz/cifar.html)對這個卷積神經網路進行訓練,這些圖片分別對應了飛機、卡車、貓、狗、馬等 10 類對象。訓練完成後,用得到的神經網路模型對剩下的 1 萬張圖片進行預測,可以得到大概 61% 的準確率。
選擇其中幾張圖片預測的結果如下(見源代碼目錄下 deep_learning_cifar.py):
推薦閱讀:
※論文精讀| 附源代碼及數據集 | LeCun的CNN經典之作 | Gradient-Based Learning…
※線性回歸和邏輯回歸代碼部分(五)
※機器學習技法筆記3:核函數SVM
※過擬合與模型容量
※機器學習:用正規方程法求解線性回歸