官术网_书友最值得收藏!

1.2 機器學習

1.2.1 什么是機器學習

機器學習(Machine Learning)是讓計算機能夠自動地從某些數據中總結出規律,并得出某種預測模型,進而利用該模型對未知數據進行預測的方法。它是一種實現人工智能的方式,是一門交叉學科,綜合了統計學、概率論、逼近論、凸分析、計算復雜性理論等。

目前機器學習的研究和應用大概集中在如圖1-1所示的領域。

圖1-1 機器學習的研究和應用領域

其中,機器學習讓統計學習得到延伸;模式識別側重于“感知”特征,而機器學習則會“學習”特征;數據挖掘領域中用到的算法也經常可在模式識別和機器學習中應用。計算機視覺、語音識別和自然語言處理(這里特指文本處理)目前是機器學習領域最熱門的三大方向。

●計算機視覺是一門研究如何讓機器替代人的眼睛,對“看到”的圖片進行分析、處理的科學,在圖像分類、人臉識別、車牌識別、目標檢測及自動駕駛等均有十分廣泛的應用。

●目前基于深度學習的語音識別和語音合成技術已經非常成熟,應用隨處可見,如智能音箱、實物機器人(例如早教機器人)及虛擬人物等。

●自然語言處理旨在使用自然語言處理技術讓計算機“讀懂”人類的語言,相關應用有機器翻譯、智能客服、垃圾信息識別等。

目前,機器學習大致可以分為以下幾類。

(1)有監督學習(Supervised Learning):當我們已經擁有一些數據及數據對應的類標時,就可以通過這些數據訓練出一個模型,再利用這個模型去預測新數據的類標,這種情況稱為有監督學習。有監督學習可分為回歸問題和分類問題兩大類。在回歸問題中,我們預測的結果是連續值;而在分類問題中,我們預測的結果是離散值。常見的有監督學習算法包括線性回歸、邏輯回歸、K-近鄰、樸素貝葉斯、決策樹、隨機森林、支持向量機等。

(2)無監督學習(Unsupervised Learning):在無監督學習中是沒有給定類標訓練樣本的,這就需要我們對給定的數據直接建模。常見的無監督學習算法包括K-means、EM算法等。

(3)半監督學習(Semi-supervised Learning):半監督學習介于有監督學習和無監督學習之間,給定的數據集既包括有類標的數據,也包括沒有類標的數據,需要在工作量(例如數據的打標)和模型的準確率之間取一個平衡點。

(4)強化學習(Reinforcement Learning):從不懂到通過不斷學習、總結規律,最終學會的過程便是強化學習。強化學習很依賴于學習的“周圍環境”,強調如何基于“周圍環境”而做出相應的動作。

具體分類如圖1-2所示。

圖1-2 機器學習的分類

1.2.2 用機器學習解決問題的一般流程

用機器學習解決問題的一般流程如圖1-3所示。

圖1-3 用機器學習解決問題的一般流程

(1)收集數據

業界有一句非常流行的話:“數據和特征決定了機器學習的上界,而模型和算法只是去逼近這個上界”,由此可見,數據對于整個機器學習項目來說至關重要。當我們面臨一個實際的問題時,如果既有想法,又有一些相關數據,有可能是有用的,也有可能是無用的,則這里的數據收集是指根據需求從已有數據中找出我們真正需要的數據;而如果只有想法,沒有數據,則這里的數據收集是指對數據的搜尋和整理等,如利用網絡爬蟲技術從互聯網爬取數據,或因學習和研究的便利而使用公開數據集。

輸入數據較簡單,此處略寫。

(2)數據預處理

無論是我們自己收集的數據還是公開數據集,通常都會存在各種各樣的問題,例如數據不完整、格式不一致、存在異常數據,以及正負樣本數量不均衡等。因此,需要對數據進行一系列的處理,如清洗、轉換、規范等之后才能拿來使用,這個過程即為數據預處理。

(3)特征工程

目前在機器學習或深度學習相關的書籍中,很少會有專門把特征工程拿出來單獨介紹的(在一些與數據分析或數據挖掘相關的書籍中可能會介紹得相對多一些)。的確,對于整個機器學習的項目來說,特征工程只是其中很小的一部分工作,但是千萬不能忽略這“很小的一部分工作”的重要性。一個機器學習任務的成功與否往往在很大程度上取決于特征工程。簡單來說,特征工程的任務是從原始數據中抽出最具代表性的特征,從而讓模型能夠更有效地學習這些數據。通常我們可以使用scikit-learn這個庫來處理數據和提取特征,scikit-learn是機器學習中使用非常廣泛的第三方模塊,本身封裝了很多常用的機器學習算法,同時還有很多數據處理和特征提取相關的方法。

(4)訓練和測試模型

處理好數據之后,就可以選擇合適的機器學習算法進行模型訓練了。可供選擇的機器學習算法有很多,每個算法都有自己的適用場景,那么如何選擇合適的算法呢?

首先,要對處理好的數據進行分析,判斷數據是否有類標,若有類標,則應該考慮使用有監督學習的相關算法,否則可以作為無監督學習問題處理;其次,判斷問題類型,屬于分類問題還是回歸問題;最后根據問題的類型選擇具體的算法訓練模型。實際工作上會使用多種算法,或者相同算法的不同參數進行評估。

此外,還要考慮數據集的大小,若數據集小,訓練的時間較短,則通常考慮采用樸素貝葉斯等輕量級算法,否則就要考慮采用SVM等重量級算法,甚至考慮使用深度學習的算法。

(5)模型的評估

常用的模型評估方法及相關的評估指標可參見1.2.5節介紹。

到此已經介紹了機器學習的大致流程和相關方法,接下來將進一步介紹其中重要環節——數據預處理、特征工程,以及模型的選擇與評估。

1.2.3 數據預處理

根據數據類型的不同,數據預處理的方式和內容也不盡相同,這里簡單介紹幾種較常用的方式。

(1)歸一化

歸一化指將不同變化范圍內的值映射到一個固定的范圍里,例如,常使用min-max等方法將數值歸一化到[0,1]的區間內(有些時候也會歸一化到[-1,1]的區間內)。歸一化的作用包括無量綱化假設要對人進行分類,人的身高和體重這兩個信息是同等重要的,但是身高和體重的單位和取值范圍是不一樣的,這會造成數據不好統一處理,歸一化就能解決這一問題。、加快模型的收斂速度,以及避免小數值的特征被忽略等。

(2)標準化

標準化指在不改變數據原分布的前提下,將數據按比例縮放,使之落入一個限定的區間,讓數據之間具有可比性。需要注意的是,歸一化和標準化各有其適用的情況,例如在涉及距離度量或者數據符合正態分布的時候,應該使用標準化而不是歸一化。常用的標準化方法有z-score等。

(3)離散化

離散化指把連續的數值型數據進行分段,可采用相等步長或相等頻率等方法對落在每一個分段內的數值型數據賦予一個新的統一的符號或數值。離散化是為了適應模型的需要,有助于消除異常數據,提高算法的效率。

(4)二值化

二值化指將數值型數據轉換為0和1兩個值,例如通過設定一個閾值,當特征的值大于該閾值時轉換為1,當特征的值小于或等于該閾值時轉換為0。二值化的目的在于簡化數據,有些時候還可以消除數據(例如圖像數據)中的“雜音”。

(5)啞編碼

啞編碼,又稱為獨熱編碼(One-Hot Encoding),作用是對特征進行量化。例如某個特征有三個類別:“大”“中”和“小”,要將這一特征用于模型中,必須將其數值化,很容易想到直接給它們編號為“1”“2”和“3”,但這種方式引入了額外的關系(例如數值間的大小關系),“誤導”模型的優化方向。一個更好的方式就是使用啞編碼,例如“大”對應編碼“100”,“中”對應編碼“010”,“小”對應編碼“001”。如果將其對應到一個三維的坐標系中,則每個類別對應一個點,且三個點之間的歐氏距離相等,均為

1.2.4 特征工程

特征工程的目的是把原始的數據轉換為模型可用的數據,主要包括三個子問題:特征構造、特征提取和特征選擇。

●特征構造一般是在原有特征的基礎上做“組合”操作,例如,對原有特征進行四則運算,從而得到新的特征。

●特征提取指使用映射或變換的方法將維數較高的原始特征轉換為維數較低的新的特征。

●特征選擇即從原始的特征中挑選出一些具有代表性、使模型效果更好的特征。

其中,特征提取和特征選擇最為常用。

(1)特征提取

特征提取又叫作“降維”,目前線性特征的常用提取方法有主成分分析(Principle Component Analysis,PCA)、線性判別分析(Linear Discriminant Analysis,LDA)和獨立成分分析(Independent Component Analysis,ICA)。

① 主成分分析

主成分分析是一種經典的無監督降維方法,主要思想是用“減少噪聲”和“去冗余”來降維。具體來說:

●“減少噪聲”指在將維數較高的原始特征轉換為維數較低的新特征的過程中保留維度間相關性盡可能小的特征維度,這一操作實際上是借助協方差矩陣實現的;

●“去冗余”指把“減少噪聲”操作之后保留下來的維度進行進一步篩選,去掉含有“特征值”較小的維度,使得留下來的特征維度含有的“特征值”盡可能大,特征值越大,方差就會越大,進而所包含的信息量就會越大。

主成分分析完全無參數限制,也就是說,結果只與數據有關,而用戶是無法進行干預的。這是它的優點,同時也是缺點。針對這一特點,Kernel-PCA被提出,使得用戶可以根據先驗知識預先對數據進行非線性轉換,因而成為當下流行的方法之一。

② 線性判別分析

線性判別分析是一種經典的有監督降維算法,主要思想是借助協方差矩陣、廣義瑞利熵等實現數據類別間距離的最大化和類別內距離的最小化。二分類線性判別分析中,二維特征是通過一系列矩陣運算實現從二維平面到一條直線的投影的,同時借助協方差矩陣、廣義瑞利熵等實現類間數據的最大化與類內數據的最小化。從二分類推廣到多分類,是通過在二分類的基礎上增加“全局散度矩陣”來實現最終目標優化函數設定的,從而實現類間距離的最大化和類內距離的最小化。顯然,由于它是針對各個類別做的降維,所以數據經過線性判別分析降維后,最多只能降到原來的類別數減1的維度。

因此,線性判別分析除實現降維外,還可以實現分類。另外,對比主成分分析可以看出,線性判別分析在降維過程中著重考慮分類性能,而主成分分析著重考慮特征維度之間的差異性與方差的大小,即信息量的大小。

③ 獨立成分分析

獨立成分分析的主要思想是在降維的過程中保留相互獨立的特征維度。這比主成分分析更進一步,在保證特征維度之間不相關的同時保證相互獨立。不相關只是保證了特征維度之間沒有線性關系,而并不能保證它們之間是獨立的。

獨立成分分析正因為以保證特征維度之間的相互獨立為目標,往往會有比主成分分析更好的降維效果,目前已經被廣泛應用于數據挖掘、圖像處理等多個領域。

(2)特征選擇

不同的特征對模型的影響程度不同,我們要選擇出對模型影響大的特征,移除不太相關的特征,這個過程就是特征選擇。特征選擇的最終目的是通過減少冗余特征來減少過擬合、提高模型準確度、減少訓練時間。特征選擇是對原始特征取特征子集的操作,而特征提取則是對原始特征進行映射或者變換操作,以得到低維的新特征。

特征選擇在特征工程中十分重要,往往可以在很大程度上決定模型訓練結果的好壞。常用的特征選擇方法包括過濾式(Filter)、包裹式(Wrapper)及嵌入式(Embedding)。

① 過濾式

過濾式特征選擇一般通過統計度量的方法來評估每個特征和結果的相關性,以對特征進行篩選,留下相關性較強的特征。其核心思想是:先對數據集進行特征選擇,再進行模型的訓練。過濾式特征選擇是獨立于算法的。正因此,過濾式特征選擇擁有較高的通用性,可適用于大規模數據集;也正因此,過濾式特征選擇在分類準確率上的表現欠佳。常用的過濾式特征選擇方法有Pearson相關系數法、方差選擇法、假設檢驗、互信息法等,這些方法通常是單變量的。

② 包裹式

包裹式特征選擇通常把最終機器學習模型的表現作為特征選擇的重要依據,一步步篩選特征。這一一步步篩選特征的過程可以被看作目標特征組合的搜索過程,而這一搜索過程可應用最佳優先搜索、隨機爬山算法等。目前比較常用的一種包裹式特征選擇法是遞歸特征消除法,其原理是使用一個基模型(如隨機森林、邏輯回歸等)進行多輪訓練,每輪訓練結束后,消除若干權值系數較低的特征,再基于新的特征集進行新的一輪訓練。

由于包裹式特征選擇是根據最終的模型表現來選擇特征的,所以它通常比過濾式特征選擇有更好的模型訓練表現。但是,由于訓練過程時間久,系統的開銷也更大,一般來說,包裹式特征選擇不太適用于大規模數據集。

③ 嵌入式

嵌入式特征選擇同樣根據機器學習的算法、模型來分析特征的重要性,從而選擇比較重要的N個特征。與包裹式特征選擇最大的不同是,嵌入式特征選擇將特征選擇過程與模型的訓練過程結合為一體,這樣就可以更高效且快速地找到最佳的特征集合。簡而言之,嵌入式特征選擇將全部的數據一起輸入模型中進行訓練和評測,而包裹式特征選擇一般一步步地篩選和減少特征進而得到所需要的特征維度。常用的嵌入式特征選擇方法有基于正則化項(如Lasso)和基于樹模型的特征選擇(如GBDT)。

1.2.5 模型的評估和選擇

1.評估方法

我們肯定希望訓練得到的模型在新的數據集上總能表現出很好的性能,因此我們希望模型能夠盡可能多地學習到有代表性的樣本數據的特征。在機器學習中有兩個常見的現象,分別是“過擬合”和“欠擬合”。當模型把訓練數據的特征學習得“太好”的時候,往往會出現“過擬合”的現象,與之相對的就是“欠擬合”,即模型沒有學習好訓練數據的特征。圖1-4所示的是一個簡單的例子。

圖1-4 “過擬合”和“欠擬合”示例

(從左至右依次為:理想情況、欠擬合和過擬合)

無論是“過擬合”還是“欠擬合”,都不是我們希望看到的。“欠擬合”通常是由于模型過于簡單或者學習不夠充分等原因導致的,相對來說比較容易解決。而“過擬合”一般是由于數據中的“噪聲”或者模型將訓練數據特有的一些特征當成了該類數據都會具有的一般特征而導致的,通常容易出現在訓練數據過少、模型過于復雜或者參數過多的情況中。

為了得到一個效果好的模型,通常會選擇多種算法,對每種算法都會嘗試不同的參數組合,并比較哪一種算法、哪一種參數設置更好,這就是模型的選擇,并有一些相應的評價方法和標準來對選擇的模型進行評估,即模型的“性能度量”。

在介紹具體的模型評估方法之前,先澄清兩個問題:什么是“參數”和“超參數”;怎么劃分“訓練集”“測試集”和“驗證集”。

“參數”即模型需要學習的內容,是模型“內部”的變量,比如模型的權重矩陣和偏置。而“超參數”指在一個模型中可以人為設定和修改的參數,例如神經網絡的層數、學習率及隱藏層神經元的個數等。實際操作中,我們除選擇具體的模型外(例如,選擇LSTM還是選擇Bi-LSTM),還要選擇模型的“超參數”。

“訓練集”“測試集”和“驗證集”的劃分是模型的選擇和訓練過程中的一個重要環節。“測試集”很好理解,當我們訓練好一個模型之后,要想知道這個模型的泛化能力好不好,可以用模型在“測試集”上的表現來近似評估模型的泛化能力。“驗證集”又是什么呢?舉個簡單的例子,假設有一個訓練集A和一個測試集B,兩個數據集沒有重疊,用訓練集A來訓練模型,然后用測試集B來評估模型的“好壞”。此時可能會出現問題,即由于我們是以模型在測試集B上的表現來評價模型的“好壞”的,最后選擇的模型可能剛好只能在測試集B上的表現比較好。因此,這樣的模型是不具有代表性的。那么如何避免這個問題呢?方法就是再增加一個“驗證集”,在選擇模型的時候,使用“驗證集”來評估模型的“好壞”。對于最終選定和訓練好的模型,我們用“測試集”來評估模型的泛化能力。“訓練集”“測試集”和“驗證集”的數據均不能有重疊,通常三個數據集的劃分比例為8∶1∶1。雖然在平時表述的時候,我們通常不會嚴格地區分“測試集”和“驗證集”(一般習慣性地都用“測試集”表述),但是為了避免混淆并確保規范,在本書中統一使用“驗證集”。

接下來介紹模型評估的常見方法:留出法、交叉驗證法、留一法交叉驗證法的一個特例。及自助法。

(1)留出法

留出法(Hold-out)是一種較為簡單的方法,它直接將數據集D劃分為訓練集T和驗證集V,集合T和集合V是互斥的,即D=TV,且TV=?。

需要注意的是,為了確保“訓練集”和“驗證集”中數據分布的一致性,要使用“分層采樣”劃分數據集。舉個簡單的例子,假設數據集中有100個樣本,其中有50個正例和50個負例,訓練集T和驗證集V的樣本數比例為4:1,即訓練集T有80個樣本,驗證集V有20個樣本。若使用“分層采樣”,則訓練集T中應該有40個正例和40個負例,而驗證集V中應該有10個正例和10個負例。

由于數據的劃分具有隨機性,通過一次劃分數據集訓練后得到的模型,在“驗證集”上的表現不一定能體現出模型真正的效果,所以一般會多次劃分數據集并訓練模型,并取多次實驗結果的平均值作為最終模型評估的結果。

留出法還存在一個問題,即“訓練集”和“驗證集”的比例該如何確定。這個問題在數據樣本足夠多的時候可以不用考慮,但在數據樣本不是特別多的時候就會造成一定困擾,一般的做法是將數據的作為“驗證集”。

(2)交叉驗證法

交叉驗證法(Cross Validation)將數據集D劃分為k個大小相同但互斥的子集,即)。為了確保數據分布的一致性,這里我們同樣使用“分層采樣”劃分數據集。

對于劃分得到的k個數據集,我們每次使用其中的一個作為“驗證集”,剩下的k-1個作為“訓練集”,將得到的k個結果取平均值,作為最終模型評估的結果,我們稱這種方法為“k折交叉驗證”。和留出法一樣,為了排除數據集劃分的影響,我們對數據集D進行p次劃分,每次劃分得到k個子集,然后進行p次“k折交叉驗證”,并取這p次“k折交叉驗證”結果的平均值作為最終的結果。我們稱這種方法為“pk折交叉驗證”,常見的有“5次10折交叉驗證”或“10次10折交叉驗證”。

交叉驗證法有一種特殊的情況,假設數據集大小為m,若使得k的值等于m,則把這種情況稱為留一法,因為這時“驗證集”中只有一個樣本。留一法的優點是不存在數據集劃分所產生的影響,但是當數據集較大時,對于樣本數量為m的數據集,使用留一法就得訓練m個模型,這會需要很大的計算開銷。

(3)自助法

自助法是一種基于自助采樣的方法,通過采樣從原始數據集中產生一個訓練集。假設數據集D包含m個樣本,每次隨機且有放回地從數據集D中挑選出一個樣本添加到數據集D'中,重復進行m次后得到一個和原始數據集D大小相同的數據集D'。在數據集D中,樣本在m次采樣中均不被抽到的概率為,取極限可以得到:

求解式1-1可以得到其值為,約等于36.8%。因此,在m次采樣后,數據集D中仍然有約36.8%的樣本沒有被抽到,我們可以用這些數據作為驗證集,即T=D',V=D-D'。

自助法比較適用于樣本數量較少的情況,因為即使劃分了驗證集也并沒有減少訓練集的數量;此外,使用自助法可以從原始數據集中產生出多個互不相同的訓練集,這對集成學習很有幫助。自助法也有缺點,因為訓練集的產生是隨機采樣得到的,所以數據樣本分布的一致性就被破壞了。

表1-1是對上述模型評估方法的總結。

表1-1 常用的模型評估方法

2.性能度量

介紹完評估的方法,接下來了解用來衡量機器學習模型泛化能力的評價標準,即模型的性能度量(Performance Measure)。

(1)正確率(Accuracy)和錯誤率(Error Rate)

正確率與錯誤率是分類任務中常用的兩個評價指標,很好理解。正確率是指分類器預測正確的數據樣本數占驗證集中樣本總數的比例。相應地,錯誤率是指在驗證集上,分類器預測錯誤的數據樣本數占驗證集中樣本總數的比例。具體計算方式如下:

(2)查準率(Precision)、查全率(Recall)與F1

雖然正確率和錯誤率是常用的兩個評價指標,但有時可能需要更細致的度量指標。舉個例子,假設我們訓練好了一個垃圾郵件分類的模型,可將垃圾郵件和正常郵件進行分類,這是一個簡單的二分類模型。模型都不會是百分之百準確的,因此就需要有一個考量。有些用戶希望盡可能地排除掉所有的垃圾郵件,哪怕偶爾將一些正常郵件誤判為垃圾郵件;還有一些用戶可能會有很多重要的郵件,所以他們希望這些重要的郵件都能被正常收到,哪怕收到少數垃圾郵件。這個時候我們關心的有兩點:第一點,在分類得到的“正常郵件”中有多少是真正的正常郵件;第二點,在所有的正常郵件中,有多少被正確地分類了。這個時候,我們就需要有新的度量指標:查準率和查全率(也稱為“召回率”)。

以二分類為例,對于分類器的分類結果,需要統計四種數據,如表1-2所示。

表1-2 計算查準率和查全率時需要統計的數據

令TP、FP、TN和FN分別表示上述四種情況所對應的數據樣本個數,根據統計的數據,我們可以做出一張表,這張表稱為“混淆矩陣(Confusion Matrix)”,如表1-3所示。

表1-3 二分類結果的混淆矩陣

查準率與查全率的定義分別如下:

相應地,正確率(Accuracy)和錯誤率(Error Rate)可以表示為

下面看一個簡單的三分類的例子。假設實現貓、狗和兔子的分類,用訓練好的模型對驗證集(約定驗證集中每個類別有1000個數據樣本)進行判別,得到了如表1-4所示的混淆矩陣。

表1-4 三分類結果的混淆矩陣

對應上面的混淆矩陣,我們可以將其拆成三個二分類的矩陣,以貓為例,如表1-5所示。

表1-5 對于貓的二分類混淆矩陣

根據式1-4與式1-5可得:

在絕大多數情況下,查準率和查全率總是相對立的,當查準率高的時候,查全率往往會偏低,而當查全率高的時候,查準率又會偏低。對于前面提到的垃圾郵件過濾的例子,如果想盡可能地過濾掉垃圾郵件,那就免不了會把一些正常郵件也誤判為垃圾郵件;如果想要盡可能地保留所有的正常郵件,那就免不了也會保留一些垃圾郵件。所以,在通常情況下,我們需要根據自己的實際需要來設定一個合適的閾值,使得查準率和查全率的平衡點能最好地滿足需求。

在以正確率和錯誤率作為模型的評價指標時,可以簡單地通過比較兩個模型的正確率來判斷孰優孰劣。在以查準率和查全率為評價指標時,要如何比較呢?常見的有兩種方法:做P-R圖和計算F1。本書選擇介紹后者,這是一種更常用、更直接的度量方法,在阿里天池、Kaggle等比賽中,也經常使用F1作為模型的評價指標,它是查準率和查全率的一種加權平均。

F1度量的計算公式如下:

由于在不同情況下對查準率和查全率的側重不同,所以需要有一個一般形式的F1度量,記為Fβ

在上式中,當β的值大于1時,代表模型的評價更側重于查全率,當0<β<1時,模型的評價更側重于查準率,當β=1時,Fβ等價于F1。

主站蜘蛛池模板: 清徐县| 东安县| 双牌县| 枣强县| 兴海县| 汝南县| 泗阳县| 玉门市| 通化县| 武宣县| 吉林省| 崇文区| 天镇县| 长宁县| 滁州市| 饶阳县| 太原市| 藁城市| 五寨县| 余江县| 南汇区| 桃江县| 合山市| 兴海县| 自治县| 新乡县| 来安县| 高碑店市| 新绛县| 南澳县| 十堰市| 岳阳市| 盐亭县| 新平| 长宁区| 苗栗市| 泸定县| 嵊州市| 喀喇沁旗| 民县| 行唐县|