Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow ——Chapter 1 Machine Learning Landscape


1.Machine Learning概念:

提到機器學習,很多人會想到機器人管家、終結者等一些不着邊際,高大上的事物。實際上,機器學習在很多領域已經存在多年,例如:光學字符識別(OCR)。第一個機器學習應用是垃圾郵件過濾器,隨后出現了數百個機器學習程序。本文介紹機器學習的一些重要概念(每位數據科學家都應該清楚):有監督與無監督學習,在線與批處理學習,基於實例與基於模型的學習等等。

機器學習假設用P來評估計算機程序在某任務類T上的性能,若一個程序通過利用經驗E在T中任務上獲得了性能改善,則我們就說關於T和P,該程序對E進行了學習。  (Tom Mitchell 1997)

以垃圾郵件過濾器為例來說明這個概念。 任務T就是“為新的電子郵件標記垃圾郵件標識”E就是訓練樣本(也就是已經由人工標記完了的郵件列表,也叫做訓練集數據);P是績效指標,程序能夠正確分類的電子郵件占比。

1.1 為何使用機器學習?

機器學習的意義是什么呢?這章以垃圾郵件過濾器來例來做說明,對比垃圾郵件篩選器這個應用傳統和機器學習方式的處理方法。

如果使用傳統方式來識別一封垃圾郵件,該如何做呢?

首先,你會分析這些問題,並提煉總結一些規則:例如標題里包含某些字符串(信用卡、賣房等等)、某些人發的郵件(例如某電商網站)、郵件內容包含某些內容(成人視頻等)。現在,你編寫一個程序,一個郵件過來后,如果匹配了一個或者多個你前邊提煉的模式規則,你就判斷這封郵件是垃圾郵件。當然,你需要不斷重復上邊2個步驟,以達到你的程序能夠覆蓋更多的模式情況。這種方式不好的地方顯而易見,你的規則會十分復雜(而且是越來越復雜,難以維護)。整體流程如下圖所示:

 

機器學習的程序則很簡潔,機器學習程序自動學習識別出哪些詞語更加能夠標識出一封垃圾郵件,程序十分簡潔。同時,如果郵件發送者發現自己某些帶某字符串(例如“4U”)的郵件經常被標記為垃圾郵件,他們可能會修改為“For U”而逃過過濾器攔截,那么傳統方式就需要修改程序了(因為需要增加一個pattern)。而機器學習程序能夠根據用戶標記為垃圾郵件的數據,自動學習出哪些詞語在垃圾郵件中高頻出現,並將包含這些詞語的郵件標記為垃圾郵件,很容易維護。應用機器學習技術來挖掘大量數據可以幫助發現並非立即可見的模式。這稱為數據挖掘。

       ,     

 

2.Machine Learning的類別:

2.1  監督、無監督、半監督和強化學習:

根據是否是在人的監督下學習,將ML分為了監督,無監督,半監督和強化學習。

2.1.1 監督學習:

所有訓練集都有標簽。

監督學習的訓練集中包含最終結果(稱為標簽)。垃圾郵件過濾器是一個典型監督學習,另外回歸任務房價預測(根據房子大小,卧室數量等特征)也是監督學習。一些回歸算法也可以用於分類,反之亦然。以下是一些最重要的監督學習算法:

  • k近鄰
  • 線性回歸
  • Logistic回歸
  • 支持向量機(SVM)
  • 決策樹和隨機森林
  • 神經網絡

2.1.2 無監督學習:

所有訓練集都沒有標簽。

無監督學習中,訓練數據集中不包含最終結果標簽。常見聚類算法都是無監督學習。

聚類算法:

  • K-均值
  • DBSCAN
  • 層次聚類分析(HCA)

一個相關的任務是降維,其目的是簡化數據而不會丟失太多信息。 一種方法是將多個相關功能合並為一個。 例如,汽車的行駛里程可能與汽車的壽命密切相關,因此降維算法會將其合並為一個代表汽車磨損的特征。 這稱為特征提取。另一個重要的無人監督任務是異常檢測, 另外啤酒尿片的挖掘例子也是無監督學習的例子。

2.1.3 半監督學習:

部分訓練集有標簽。

由於標記數據通常很耗時且成本很高,因此您通常會擁有大量未標記的實例,而標記的實例卻很少。 某些算法可以處理部分標記的數據。 這稱為半監督學習。

下圖是一個半監督學習的例子,三角形和方形的示例是有標簽的訓練樣本,圓形的點是無標簽的點。該例子利用這些無標記的點,把心的點歸類為三角形,而不是方形(雖然這個點離方形的樣本點最近)。大多數半監督學習算法是無監督算法和有監督算法的組合。

2.1.4 強化學習:

學習系統自己觀察環境,並作出自己的選擇,在作出正確選擇時會獲得獎勵,在作出錯誤選擇時,會獲得懲罰。隨着時間推移,強化學習系統必須找到一個策略,來獲得最多的獎勵。DeepMind的AlphaGo就是強化學習的例子,AlphaGo通過分析數百萬場比賽,來學習獲勝策略,之后AlphaGo和自己來對弈。

 2.2  批量和在線學習:

用於對機器學習系統進行分類的另一個標准是: 系統是否可以從傳入數據流中逐步學習。 

2.2.1 批量學習(Batch Learning)

在批處理學習(Batch Learning)中,系統無法進行增量學習,所以需要獲取所有的訓練數據,對模型進行訓練,產出后投入生產並運行。一般可以離線運行,並且該模型只適用於其所學習的樣本。這種方式比較簡單,但是需要耗費較多的CPU和其他資源。

如果希望批處理學習系統了解新的數據(例如新型垃圾郵件),則需要從頭開始在整個數據集上訓練系統的新版本(不僅是新數據,還包括舊數據),然后停止舊系統並用新系統替換它。

2.2.2 在線學習(Online learning)

在線學習以連續的小批量數據來逐步訓練模型。在線學習非常適合那些連續不斷地接收數據(例如股票價格)並且需要適應快速或自主變化的系統。

在線學習系統的一個重要參數是模型適應變化數據的速度,稱為學習率。如果設置較高的學習率,那么系統將迅速適應新數據,但也往往會很快忘記舊數據。相反,將學習率設置得較低,則系統將具有更大的慣性,也就是說,它將學習得更慢,但對新數據中的噪聲或非代表性數據點序列(異常值)的敏感性也將降低。

下圖表示:online learning模型先上生產環境,再源源不斷地學習小批量數據:

 

下圖表示:使用online learning來處理大批量訓練數據(模型訓練 機器無法存儲這么巨大的訓練數據集):

 

通過以上描述,會發現Online learning的一個比較大的挑戰和問題是,如果新來的小批數據中包含過多噪聲數據,會嚴重影響模型訓練效果。如果發現新數據中有大量雜質,應該立即停止學習過程。

2.3 基於實例與基於模型的學習

下面簡單描述下基於實例和基於模型學習的區別。首先,機器學習的最終目的,肯定是使模型具有更好的泛化能力,也就是該模型對一個新的樣本的預測准確能力更強。在對一個新的示例來分類時,我們有2種方式,第一種是比較與該新示例最相似的幾個訓練樣本,並取這些樣本的分類標簽作為該新的樣本的歸類標簽,這就是基於實例的學習。

下圖描述了基於實例的學習,找出與new instance相似度最高的三個樣本,其中2個歸類三角形,一個歸類方形,那么new instance歸類為三角形。

 

下圖描述了基於模型的學習,與上邊方法不同,這種方法訓練出一個模型,再利用new instance帶入模型,發現new instance屬於三角形類別。

 

3. 使用Scikit-Learn訓練和使用線性模型:

下邊代碼使用python3,使用scikit-learn包的線性回歸模型,做線性回歸。

 1 import pandas as pd
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 from sklearn import linear_model
 5 
 6 
 7 def prepare_country_stats(oecd_bli, gdp_per_capita):
 8     oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
 9     oecd_bli = oecd_bli.pivot(index="Country", columns="Indicator", values="Value")
10     gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)
11     gdp_per_capita.set_index("Country", inplace=True)
12     full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita,
13                                   left_index=True, right_index=True)
14     full_country_stats.sort_values(by="GDP per capita", inplace=True)
15     remove_indices = [0, 1, 6, 8, 33, 34, 35]
16     keep_indices = list(set(range(36)) - set(remove_indices))
17     return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]
18 
19 
20 if __name__ == '__main__':
21     # Load Data
22     oecd_bli = pd.read_csv("dataset/oecd_bli_2015.csv", thousands=",")
23     gdp_per_capita = pd.read_csv("dataset/gdp_per_capita.csv", thousands=",", delimiter="\t", encoding="latin1", na_values="n/a")
24 
25     # Gen Statics dat
26     country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
27     X = np.c_[country_stats["GDP per capita"]]
28     y = np.c_[country_stats["Life satisfaction"]]
29 
30     # Visualize the data
31     country_stats.plot(kind="scatter", x="GDP per capita", y="Life satisfaction")
32     plt.show()
33 
34     model = linear_model.LinearRegression()
35     model.fit(X, y)
36 
37     testX = [[22587]]
38     print(model.predict(testX))
View Code

 

4.機器學習的挑戰:

機器學習的主要任務是選擇一種學習算法並在某些數據上對其進行訓練,所以出錯的可能包括:“錯誤算法” 和 “錯誤數據”。

4.1 錯誤數據:

先考慮數據問題,總結起來,數據問題可以分為以下幾點:

  • 數據樣本量不足;
  • 訓練數據采樣偏差(也就是訓練樣本不能完全反映全量數據的分布情況);
  • 數據質量較差(值得花大量時間來去除離群值和噪聲);
  • 不相關特征,ML成功的關鍵是訓練數據盡量包含相關特征,而盡量不包含不相關特征。
    •   這里涉及到了一個重要工作就是特征工程。包括特征選擇、特征提取(也就是之前說的降維,創建新的特征)、通過收集新數據來創建新特征。

4.2 錯誤算法:

算法問題常見有以下一些:

  • 模型過擬合:模型對訓練數據擬合的很好,但是泛化能力很差;
  • 模型欠擬合;

5.測試和驗證:

為了保證算法模型的質量,需要將樣本集划分為訓練集和測試集


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM