大數據與機器學習(2)
文中涉及的「數據目錄」和「源代碼目錄」見雲盤:https://pan.baidu.com/s/1slJntRR
4、常見機器學習方法及使用場景
總的來說,機器學習面臨的任務是從數據中學習規律,根據數據特點的不同、問題的不同,機器學習的任務也有區別。對於機器學習面對的數據問題,如果從數據的特點來分,一般可以分為離散和連續兩類;如果從問題的特點來分,一般可以分為有監督和無監督兩類。
離散和連續很容易理解,這裡解釋一下有監督和無監督的區別。如果問題是「有監督」的,那麼首先要求數據是有「標記」的,比如做圖像識別,用來學習的數據不但要有圖片,而且有每張圖片到底代表了是「貓」還是「狗」的標記,相當於一直有一個「標準答案」在「監督」學習的過程並給出反饋。反之,有些問題則是「無監督」的,比如給了一個股票的價格數據,需要學習股票價格波動的規律,這時股票價格數據並沒有額外的「標記」,因此需要全靠演算法自行發現規律。
根據數據特點的不同和問題特點的不同,可以把機器學習的任務大致分為以下四類:
針對不同的任務,都有相應的機器學習方法來處理。當然,有些方法並不是只能做某一類的任務,比如很多方法既可以用來做分類、也可以用來做回歸。下面,就來簡單介紹常見的各種機器學習的方法,以及大致適用的場景。
機器學習是一個涉及很廣的領域,下面每一種學習方法的掌握並運用都需要時間和精力的投入。這個章節的主要目的是介紹各種學習方法的大致特點,在內容上避免描述太多細節。
最近鄰法
最近鄰(Nearest Neighbors)的學習方法主要原理是在一個 N 維空間上尋找和目標點「距離」最近的若干個參考點,來考察這些參考點對目標點的影響。越是離目標點「距離」近的,對目標點產生的影響權重越是大。這是一種實現非常簡單的演算法,但是比較適合低維度的問題,如果維度太多,那麼檢索臨近的數據點會變得非常困難。
最近鄰法中最常用的是 kNN 方法,k 代表尋找一個數據點附近最多 k 個參考點進行評估。下圖最左側是若干數據點,右側是 k 分別取 1 和 5 的時候對數據的分類情況。顯然,k 的選擇對計算結果有非常重要的影響。
示例來源:http://cs231n.github.io/classification/
這裡,我們隨機生成 4 類呈正態分布的二維數據點,然後使用 kNN 方法進行學習(見源代碼目錄下 k_nearest_neighbor.py),效果如下:
高斯過程方法
高斯過程(Gaussian Process)方法可用於分類或回歸,其前提假設是分析的自變數,均符合高斯分布。
這裡,我們用一個夏威夷二氧化碳歷史含量數據(數據目錄下 co2.csv)來預測未來 30 年可能的二氧化碳含量(見源代碼目錄下 gp_co2.py),結果如下,其中紅色代表歷史數據,黃色代表未來的預測值,灰色區域代表估計預測結果的標準差範圍:
決策樹
決策樹(Decision Tree)是一種結構簡單的、可以用於處理分類和回歸問題的模型。比如,下面就是一棵簡單的用於預測用戶流失的決策樹:
決策樹學習就要從數據中學習生成上面的這個模型,假設一個用戶很長時間不登陸了、或者雖然間歇性登陸,但是每次停留時間很短,那麼這樣的用戶就很有可能會馬上流失了,因此,我們要把登錄間隔、停留時長這些特徵學習出來。從模型可以看到,決策樹具有很好的可解釋性。
這裡,我們以一個收入數據 為例,從這個數據我們可以了解到,一個人的收入可能和年齡、教育程度、性別、種族、每周工作時長等因素都有關係,現在,嘗試從這個數據學習生成一個決策樹模型,來提取這些因素對一個人收入的影響(見源代碼目錄下 decision_tree_income.py):
如果設置決策樹最大深度為 3,則得到模型的 ROC-AUC 評分為 0.735,得到決策樹如下:
如果設置決策樹最大深度為 6,則得到模型的 ROC-AUC 評分為 0.857,得到決策樹如下:
可見,通過調整參數,可以找到使模型評分儘可能高的參數配置,此時,決策樹模型會擁有相對更好的泛化性能。
支持向量機(SVM)
SVM 是一類二元分類的演算法,它特點在於將所有數據視為為 N 維空間中的「向量」,這樣目標就變為尋找 N 維空間中的 N-1 維超平面將數據一分為二,並且離兩部分數據最近點離這個平面的距離儘可能地大,如下圖所示:
但現實中很多時候數據並不是直接線性可分的,這個時候就需要將數據映射到更加高維度的空間中去。但是數據維度的增加又會帶來計算量的極大增加,所以在這裡引入了核函數來簡化高維空間中的距離計算,這就是基於核函數的學習方法(核方法)。
看一個簡單的例子,我們有一個數據,將數據繪製到平面上是這個樣子的:
現在我們希望尋找 SVM 模型可以將這個數據很好地分開,顯然,無論如何畫一條直線,都不可能將數據完全分開。因此,這裡選擇 RBF 核函數對數據進行核化,然後再進行分割(見源代碼目錄下 svm.py),最終得到結果如下:
貝葉斯演算法
貝葉斯演算法是基於貝葉斯公式的一種學習演算法,最常見的貝葉斯演算法是樸素貝葉斯(Naive Bayes),「樸素」的意思是假設所有的特徵兩兩相互獨立。這種方法大量運用於文本分類,在將文本按詞切分後,再通過對詞頻等特徵進行學習來對文本進行分類,可以判斷文本內容是不是垃圾郵件、情緒是不是正面的、是不是殭屍用戶產生的內容等等。
顯然,樸素貝葉斯學習方法的效果和貝葉斯公式中的概率分布關係很大。常用的樸素貝葉斯採用的概率分布有高斯分布、二項分布、伯努利分布等。一般來說,如果數據分布比較連續,可能比較適用高斯分布;如果數據大部分是離散值,可能比較適用二項分布;如果數據是二元離散值、或者分布比較稀疏,則可能比較適用伯努利分布。
比如這個豆瓣影評數據(數據目錄下 douban_comments.csv)中,包含了用戶給一部電影的評分(Star)以及評論(Comment),我們認為評分 >3 的屬於正面評價,否則屬於負面評價。現在,我們想要從用戶的評論文字去推測這個用戶對電影的觀感如何,到底是屬於偏正面的還是偏負面的,這個時候就可以用樸素貝葉斯學習器去學習(見源代碼目錄下 naive_bayes_douban_movies.py,這個例子運行時間比較久)。
最後得到一個準確率大概為 70% 的模型,輸入一段文字「這部電影還是值得一看的,起碼打鬥場面相當不錯」,使用這個模型可以預測這是一句正面的評價;而「不行啊,看得都快睡著了」,模型預測就是一句負面的評價。
推薦閱讀:
※複習:決策樹
※《Scikit-Learn與TensorFlow機器學習實用指南》第1章 機器學習概覽
※Fenchel-Lengendre Duality觀點下的優化演算法們(I):前言
※面壁者系列:線性回歸