1. 程式人生 > >《Hands-On Machine Learning with Scikit-Learn & TensorFlow》讀書筆記 第一章 機器學習概覽

《Hands-On Machine Learning with Scikit-Learn & TensorFlow》讀書筆記 第一章 機器學習概覽

一、機器學習概覽 


為什麼使用機器學習?

機器學習善於:

  1. 需要進行大量手工調整或需要擁有長串規則才能解決的問題:機器學習演算法通常可以簡化程式碼、提高效能。
  2. 問題複雜,傳統方法難以解決:最好的機器學習方法可以找到解決方案。
  3. 環境有波動:機器學習演算法可以適應新資料。洞察複雜問題和大量資料

機器學習系統的型別

機器學習可以根據訓練時監督的量和型別進行分類。主要有四類:監督學習、非監督學習、半監督學習和強化學習。

監督學習

一個典型的監督學習任務是分類。垃圾郵件過濾器就是一個很好的例子:用許多帶有歸類(垃圾郵件或普通郵件)的郵件樣本進行訓練,過濾器必須還能對新郵件進行分類。另一個典型任務是預測目標數值,例如給出一些特徵(里程數、車齡、品牌等等)稱作預測值,來預測一輛汽車的價格。

下面是一些重要的監督學習演算法(本書都有介紹):

  • K近鄰演算法
  • 線性迴歸
  • 邏輯迴歸
  • 支援向量機(SVM)
  • 決策樹和隨機森林
  • 神經網路

非監督學習

在非監督學習中,訓練資料是沒有加標籤的,系統在沒有老師的條件下進行學習。

下面是一些最重要的非監督學習演算法(我們會在第 8 章介紹降維):
聚類
 K 均值
層次聚類分析(Hierarchical Cluster Analysis,HCA)
期望最大值


視覺化和降維
主成分分析(Principal Component Analysis,PCA)
核主成分分析
區域性線性嵌入(Locally-Linear Embedding,LLE)
t-分佈鄰域嵌入演算法(t-distributed Stochastic Neighbor Embedding,t-SNE)


關聯性規則學習
Apriori 演算法
Eclat 演算法

 

聚類:例如,假設你有一份關於你的部落格訪客的大量資料。你想執行一個聚類演算法,檢測相似訪客的分組。例如,演算法可能注意到 40% 的訪客是喜歡漫畫書的男性,通常是晚上訪問,20% 是科幻愛好者,他們是在週末訪問等等。如果你使用層次聚類分析,它可能還會細分每個分組為更小的組。這可以幫助你為每個分組定位博文。 

視覺化演算法也是極佳的非監督學習案例:給演算法大量複雜的且不加標籤的資料,演算法輸出資料的2D或3D影象(圖 1-9)。演算法會試圖保留資料的結構(即嘗試保留輸入的獨立聚類,避免在影象中重疊),這樣就可以明白資料是如何組織起來的,也許還能發現隱藏的規律。

 t-SNE 視覺化案例,突出了聚類(注:注意動物是與汽車分開的,馬和鹿很近、與鳥距離遠,以此類推)

 

降維:降維的目的是簡化資料、但是不能失去大部分資訊。做法之一是合併若干相關的特徵。例如,汽車的里程數與車齡高度相關,降維演算法就會將它們合併成一個,表示汽車的磨損。這叫做特徵提取。
提示:在用訓練集訓練機器學習演算法(比如監督學習演算法)時,最好對訓練集進行降維。這樣可以執行的更快,佔用的硬碟和記憶體空間更少,有些情況下效能也更好。


另一個重要的非監督任務是異常檢測(anomaly detection) —— 例如,檢測異常的信用卡轉賬以防欺詐,檢測製造缺陷,或者在訓練之前自動從訓練資料集去除異常值。異常檢測的系統使用正常值訓練的,當它碰到一個新例項,它可以判斷這個新例項是像正常值還是異常值

 

最後,另一個常見的非監督任務是關聯規則學習,它的目標是挖掘大量資料以發現屬性間有趣的關係。例如,假設你擁有一個超市。在銷售日誌上執行關聯規則,可能發現買了燒烤醬和薯片的人也會買牛排。因此,你可以將這些商品放在一起。

 

半監督學習

一些演算法可以處理部分帶標籤的訓練資料,通常是大量不帶標籤資料加上小部分帶標籤資料。這稱作半監督學習

一些圖片儲存服務,比如 Google Photos,是半監督學習的好例子。一旦你上傳了所有家庭相片,它就能自動識別相同的人 A 出現了相片 1、5、11 中,另一個人 B 出現在了相片 2、5、7 中。這是演算法的非監督部分(聚類)。現在系統需要的就是你告訴這兩個人是誰。只要給每個人一個標籤,演算法就可以命名每張照片中的每個人,特別適合搜尋照片。

多數半監督學習演算法是非監督和監督演算法的結合。例如,深度信念網路(deep beliefnetworks)是基於被稱為互相疊加的受限玻爾茲曼機(restricted Boltzmann machines,RBM)的非監督元件。RBM 是先用非監督方法進行訓練,再用監督學習方法進行整個系統微調。

 

強化學習

強化學習非常不同。學習系統在這裡被稱為智慧體(agent),可以對環境進行觀察,選擇和執行動作,獲得獎勵(負獎勵是懲罰)。然後它必須自己學習哪個是最佳方法(稱為策略,policy),以得到長久的最大獎勵。策略決定了智慧體在給定情況下應該採取的行動。

 

批量和線上學習

 它是否能從匯入的資料流進行持續學習。

批量學習

在批量學習中,系統不能進行持續學習:必須用所有可用資料進行訓練。這通常會佔用大量時間和計算資源,所以一般是線下做的。首先是進行訓練,然後部署在生產環境且停止學習,它只是使用已經學到的策略。這稱為離線學習。 
  如果你想讓一個批量學習系統明白新資料(例如垃圾郵件的新型別),就需要從頭訓練一個系統的新版本,使用全部資料集(不僅有新資料也有老資料),然後使用新系統替換老徐他。幸運的是,訓練、評估、部署一套機器學習的系統的整個過程可以自動進行,所以即便是批量學習也可以適應改變。只要有需要,就可以方便地更新資料、訓練一個新版本。但是用全部資料集進行訓練會花費大量時間,所以一般是每 24 小時或每週訓練一個新系統。如果系統需要快速適應變化的資料(比如,預測股價變化),就需要一個響應更及時的方案。 
  另外,用全部資料訓練需要大量計算資源(CPU、記憶體空間、磁碟空間、磁碟 I/O、網路 I/O 等等)。如果你有大量資料,並讓系統每天自動從頭開始訓練,就會開銷很大。如果資料量巨大,甚至無法使用批量學習演算法。 
  最後,如果你的系統需要自動學習,但是資源有限(比如,一臺智慧手機或火星車),攜帶大量訓練資料、每天花費數小時的大量資源進行訓練是不實際的。 
  幸運的是,對於上面這些情況,還有一個更佳的方案可以進行持續學習。

線上學習

注意線上學習整個過程通常是離線完成的,即不在部署的系統上,也稱為持續學習,在線上學習中,是用資料例項持續地進行訓練,可以一次一個或一次幾個例項(稱為小批量)。每個學習步驟都很快且廉價,所以系統可以動態地學習到達的新資料。 
  線上學習很適合系統接收連續流的資料(比如,股票價格),且需要自動對改變作出調整。如果計算資源有限,線上學習是一個不錯的方案:一旦線上學習系統學習了新的資料例項,它就不再需要這些資料了,所以扔掉這些資料(除非你想滾回到之前的一個狀態,再次使用資料)。這樣可以節省大量的空間。 

 

基於例項 vs 基於模型學習

例項:最簡單的學習形式就是用記憶學習。如果用這種方法做一個垃圾郵件檢測器,只需標記所有和使用者標記的垃圾郵件相同的郵件,測量兩封郵件的相似性。一個(簡單的)相似度測量方法是統計兩封郵件包含的相同單詞的數量。如果一封郵件含有許多垃圾郵件中的詞,就會被標記為垃圾郵件。這被稱作基於例項學習:系統先用記憶學習案例,然後使用相似度測量推廣到新的例子 

模型學習:另一種從樣本集進行歸納的方法是建立這些樣本的模型,然後使用這個模型進行預測。這稱
作基於模型學習

 

 

機器學習的主要挑戰

訓練資料量不足

  機器學習需要大量資料,才能讓多數機器學習演算法正常工作。即便對於非常簡單的問題,一般也需要數千的樣本,對於複雜的問題,比如影象或語音識別,你可能需要數百萬的樣本(除非你能重複使用部分存在的模型)。

樣本偏差

  指的是在研究過程中因樣本選擇的非隨機性而導致得到的結論存在偏差,也稱選擇性偏差為選擇性效應(Selection Effect)。這會嚴重降低學得模型的泛化能力。

低質量資料

  很明顯,如果訓練集中的錯誤、異常值和噪聲(錯誤測量引入的)太多,系統檢測出潛在規律的難度就會變大,效能就會降低。花費時間對訓練資料進行清理是十分重要的。事實上,大多資料科學家的一大部分時間是做清洗工作的。

不相關的特徵

  俗語說:進來的是垃圾,出去的也是垃圾。你的系統只有在訓練資料包含足夠相關特徵、非相關特徵不多的情況下,才能進行學習。機器學習專案成功的關鍵之一是用好的特徵進行訓練。這個過程稱作特徵工程,包括:

  • 特徵選擇:在所有存在的特徵中選取最有用的特徵進行訓練。
  • 特徵提取:組合存在的特徵,生成一個更有用的特徵(如前面看到的,可以使用降維演算法)。
  • 收集新資料建立新特徵。

過擬合

  通俗一點地來說過擬合就是模型把資料學習的太徹底,以至於把噪聲資料的特徵也學習到了,這樣就會導致在後期測試的時候不能夠很好地識別資料,即不能正確的分類,模型泛化能力太差。 
解決方法:

  • 重新清洗資料
  • 增大資料的訓練量
  • 正則化方法
  • Early stopping、dropout方法(在神經網路裡面很常用)

欠擬合

  欠擬合就是模型沒有很好地捕捉到資料特徵,不能夠很好地擬合數據。 
解決方法:

  • 新增其他特徵項
  • 新增多項式特徵
  • 減少正則化引數

 

測試和確認

  要知道一個模型推廣到新樣本的效果,唯一的辦法就是真正的進行試驗。一種方法是將模型部署到生產環境,觀察它的效能。這麼做可以,但是如果模型的效能很差,就會引起使用者抱怨 —— 這不是最好的方法。

  更好的選項是將你的資料分成兩個集合:訓練集和測試集。正如它們的名字,用訓練集進行訓練,用測試集進行測試。對新樣本的錯誤率稱作推廣錯誤(或樣本外錯誤),通過模型對測試集的評估,你可以預估這個錯誤。這個值可以告訴你,你的模型對新樣本的效能。

  如果訓練錯誤率低(即,你的模型在訓練集上錯誤不多),但是推廣錯誤率高,意味著模型對訓練資料過擬合。

提示:一般使用 80% 的資料進行訓練,保留20%用於測試。

  因此,評估一個模型很簡單:只要使用測試集。現在假設你在兩個模型之間猶豫不決(比如一個線性模型和一個多項式模型):如何做決定呢?一種方法是兩個都訓練,,然後比較在測試集上的效果。

  現在假設線性模型的效果更好,但是你想做一些正則化以避免過擬合。問題是:如何選擇正則化超引數的值?一種選項是用 100 個不同的超引數訓練100個不同的模型。假設你發現最佳的超引數的推廣錯誤率最低,比如只有 5%。然後就選用這個模型作為生產環境,但是實際中效能不佳,誤差率達到了 15%。發生了什麼呢?答案在於,你在測試集上多次測量了推廣誤差率,調整了模型和超引數,以使模型最適合這個集合。這意味著模型對新資料的效能不會高。

  這個問題通常的解決方案是,再保留一個集合,稱作驗證集合。用訓練集和多個超引數訓練多個模型,選擇在驗證集上有最佳效能的模型和超引數。當你對模型滿意時,用測試集再做最後一次測試,以得到推廣誤差率的預估。

  為了避免“浪費”過多訓練資料在驗證集上,通常的辦法是使用交叉驗證:訓練集分成互補的子集,每個模型用不同的子集訓練,再用剩下的子集驗證。一旦確定模型型別和超引數,最終的模型使用這些超引數和全部的訓練集進行訓練,用測試集得到推廣誤差率。

QA

9.線上學習系統可以逐步學習,而不是批量學習 - 系統。這使它能夠快速適應不斷變化的資料和自治系統,以及對大量資料的培訓。

10.核外演算法可以處理大量不適合的資料電腦的主存。核外學習演算法將資料切入小批量和使用線上學習技術來學習這些迷你批次。

12.機器學習中引數和超引數之間的區別 
  答:一個模型具有一個或多個模型引數,這些引數決定了在給定新例項(例如,線性模型的斜率)的情況下它將會預測的內容。學習演算法試圖找到這些引數的最佳值,以使該模型很好地適用於新例項。而超引數是學習演算法本身的引數,而不是模型的引數(例如,神經網路的層數和每層結點數量)。

 

19.什麼是交叉驗證,使用驗證集的好處有什麼? 
交叉驗證是一種技術,可以比較模型(用於模型選擇和超引數調整),而不需要單獨的驗證集,這節省了寶貴的訓練資料。同時,如果使用測試集作為驗證集時,當模型過擬合,將可能上線一個泛化能力很差的模型,影響到使用者。