機器學習概覽

什麼是機器學習?算法

廣義概念:編程

機器學習是讓計算機具備學習的能力,無需明確的編程 —— 亞瑟·薩繆爾,1959api

工程概念:網絡

計算機程序利用經驗 E 學習任務 T,性能是 P,若是針對任務 T 的性能 P 隨着經驗 E 不斷增加,則稱爲機器學習。 —— 湯姆·米切爾,1997機器學習

機器學習系統的類型性能

機器學習有多種類型,能夠根據如下規則進行分類:學習

  • 是否在人類監督下進行訓練(監督、非監督、半監督和強化學習)
  • 是否能夠動態漸進學習(在線學習和批量學習)
  • 它們是否只是簡單的經過比較新的數據點和已知的數據點,仍是在訓練數據中進行模式識別,以創建一個預測模型,就像科學家所作的那樣(基於實力學習和基於模型學習)

監督/非監督學習大數據

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

監督學習搜索引擎

在監督學習中,用來訓練算法的訓練數據包含了答案,稱爲標籤。

圖 1 用於監督學習(好比垃圾郵件分類)的加了標籤的訓練集

 一個典型的監督學習就是分類,垃圾郵件過濾器就是一個很好的例子:用不少帶有歸類(垃圾郵件和普通郵件)的郵件樣本進行訓練,過濾器還能用新郵件進行分類。

另外一個典型數值是預測目標數值,例如給出一些特徵(里程數、車程、品牌等等)稱爲預測值,來預測一輛汽車的價格。這類任務稱爲迴歸,要訓練在這個系統,你須要給出大量汽車樣本,包括它們的預測值和標籤(即它們的價格)

圖2 迴歸

 注意:一些迴歸算法也能夠用來進行分類,例如,邏輯迴歸經常使用來進行分類,它能夠生成一個歸屬某一類的可能性的值。

下面是一些重要的監督性學習算法:

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

 非監督學習

 訓練數據沒有加標籤。

圖 3 非監督學習的一個不加標籤的訓練集

下面是一些最重要的非監督學習算法:

  • 聚類 (K均值、層次聚類分析、指望最大值)
  • 可視化和降維度 (主成分分析、核主成分分析、局部線性嵌入、t-分佈鄰域嵌入算法)
  • 關聯性規則學習(Apriori算法、Eclat算法)

例如,假設你有一份關於你的博客訪客的大量數據。你想運行一個聚類算法,檢測類似訪客的分組(圖 1-8)。你不會告訴算法某個訪客屬於哪一類:它會本身找出關係,無需幫助。例如,算法可能注意到 40% 的訪客是喜歡漫畫書的男性,一般是晚上訪問,20% 是科幻愛好者,他們是在週末訪問等等。若是你使用層次聚類分析,它可能還會細分每一個分組爲更小的組。這能夠幫助你爲每一個分組定位博文。

圖4 聚類

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

 

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

 與此有關聯的任務是降維,降維的目的是簡化數據、可是不能失去大部分信息。作法之一是合併若干相關的特徵。例如,汽車的里程數和車齡高度相關,降維算法就會將他們合併爲汽車的磨損,叫作特徵提取。

注意:在用訓練集訓練機器學習算法(好比監督學習算法)時,最好對訓練集進行降維。這樣能夠運行的更快,佔用的硬盤和內存空間更少,有些狀況下性能也更好。

另外一個很是重要的非監督任務時異常檢測(anomaly detection) —— 例如,檢測異常的信用卡轉帳以防欺詐,檢測製造缺陷,或者在訓練以前自動從訓練集中去除異常值,異常監測的系統是用正常值訓練的,當它碰到一個新實例,能夠判斷這個新實例是正常值仍是異常值。

圖6 異常檢測

 最後,另外一個很重要的非監督學習是關聯規則學習,他的目標是挖掘大量數據以發現屬性間有趣的關係。

例如,假設你擁有一個超市。在銷售日誌上運行關聯規則,可能發現買了燒烤醬和薯片的人也會買牛排。所以,你能夠將這些商品放在一塊兒。

 半監督學習

 一些算法能夠處理部分帶標籤的訓練數據,一般是大量不帶標籤數據加上少許帶標籤數據,這種稱爲半監督學習。

一些圖片存儲服務,好比 Google Photos,是半監督學習的好例子。一旦你上傳了全部家庭相片,它就能自動識別到人物 A 出如今了相片 一、五、11 中,另外一我的 B 出如今了相片 二、五、7 中。這是算法的非監督部分(聚類)。如今系統須要的就是你告訴它這兩我的是誰。只要給每一個人一個標籤,算法就能夠命名每張照片中的每一個人,特別適合搜索照片。

 

圖7 半監督學習

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

強化學習

 強化學習很是不一樣。學習系統在這裏稱爲智能體,能夠對環境進行觀察、選擇和執行動做(負獎勵是懲罰),而後它必須本身學習哪一個是最佳方法(稱爲策略),已得到長久的最大獎勵。策略決定了智能體在給定狀況下應採起的行動。

圖8 強化學習

例如,許多機器人運行強化學習算法以學習如何行走。DeepMind 的 AlphaGo 也是強化學習的例子:它在 2016 年三月擊敗了世界圍棋冠軍李世石(譯者注:2017 年五月,AlphaGo 又擊敗了世界排名第一的柯潔)。它是經過分析數百萬盤棋局學習制勝策略,而後本身和本身下棋。要注意,在比賽中機器學習是關閉的;AlphaGo 只是使用它學會的策略。

批量和在線學習

 另外一個用來分類機器學習的準則是,它是否能從導入的數據流進行持續學習。

 批量學習

在批量學習中,系統不能進行持續學習:必須用全部可用數據進行訓練。這一般會佔用大量時間和計算資源,因此通常是線下作的。首先是進行訓練,而後部署在生產環境且中止學習,它只是使用已經學到的策略。這稱爲離線學習。

若是你想讓一個批量學習系統明白新數據(例如垃圾郵件的新類型),就須要從頭訓練一個系統的新版本,使用所有數據集(不只有新數據也有老數據),而後停掉老系統,換上新系統。

幸運的是,訓練、評估、部署一套機器學習的系統的整個過程能夠自動進行,因此即使是批量學習也能夠適應改變。只要有須要,就能夠方便地更新數據、訓練一個新版本。

這個方法很簡單,一般能夠知足需求,可是用所有數據集進行訓練會花費大量時間,因此通常是每 24 小時或每週訓練一個新系統。若是系統須要快速適應變化的數據(好比,預測股價變化),就須要一個響應更及時的方案。

另外,用所有數據訓練須要大量計算資源(CPU、內存空間、磁盤空間、磁盤 I/O、網絡 I/O 等等)。若是你有大量數據,並讓系統天天自動從頭開始訓練,就會開銷很大。若是數據量巨大,甚至沒法使用批量學習算法。

最後,若是你的系統須要自動學習,可是資源有限(好比,一臺智能手機或火星車),攜帶大量訓練數據、天天花費數小時的大量資源進行訓練是不實際的。

幸運的是,對於上面這些狀況,還有一個更佳的方案能夠進行持續學習。

在線學習

在在線學習中,用數據實例能夠持續進行訓練 ,能夠一次一個或一次幾個實例(稱爲小批量)。每一個學習步驟都很快且廉價,系統能夠動態學習收到的新數據。

圖9 在線學習

在線學習很適合系統接收連續流的數據(好比股票價格),且須要自動對改變作出調整,若是計算資源有限,在線學習是一個不錯的方案:一旦在線學習系統學習了新的數據實例,它就再也不須要這些數據了,因此扔掉這些數據(除非你想滾回到以前的一個狀態,再次使用數據)。這樣能夠節省大量的空間。

在線學習算法也適合於超大數據集(一臺計算機不足以存儲它)上訓練系統(這稱做核外學習,out-of-core learning)。算法每次只加載部分數據,用這些數據進行訓練,而後重複這個過程,直到使用完全部的數據。

警告:這個整個過程一般是離線完成的(即,不在部署的系統上),因此在線學習這個名字會讓人疑惑。能夠把它想成持續學習。

 在線學習系統的一個重要參數是,它們能夠多快地適應數據的改變:這被稱爲學習速率。若是你設定一個高學習速率,系統就能夠快速適應新數據,可是也會快速忘記老數據(你可不想讓垃圾郵件過濾器只標記最新的垃圾郵件種類)。相反的,若是你設定的學習速率低,系統的惰性就會強:即,它學的更慢,但對新數據中的噪聲或沒有表明性的數據點結果不那麼敏感。

在線學習的挑戰之一是,若是壞數據被用來進行訓練,系統的性能就會逐漸下滑。若是這是一個部署的系統,用戶就會注意到。例如,壞數據可能來自失靈的傳感器或機器人,或某人向搜索引擎傳入垃圾信息以提升搜索排名。要減少這種風險,你須要密集監測,若是檢測到性能降低,要快速關閉(或是滾回到一個以前的狀態)。你可能還要監測輸入數據,對反常數據作出反應(好比,使用異常檢測算法)。

基於實例VS基於模型學習

另外一種分類機器學習是判斷它們如何進行推廣的,大多數機器學習是關於預測的。這意味着給定必定數量的訓練樣本,系統可以推廣到沒有見過的樣本。對訓練數據集有很好的預測還不夠,真正的目標是對新實例預測的性能。有兩種概括方法:基於實例和基於模型學習。

基於實例學習

也許最簡單的學習形式就是用記憶學習。若是用這種方法作一個垃圾郵件過濾器。只須要標記全部和用戶標記的垃圾郵件相同的郵件----這個方法不差,但確定不是最好的。

不只能標記和已知的垃圾郵件相同的郵件,你的垃圾郵件過濾器也要能標記相似垃圾郵件的郵件。這就須要測量兩封郵件的類似性。一個(簡單的)類似度測量方法是統計兩封郵件包含的相同單詞的數量。若是一封郵件含有許多垃圾郵件中的詞,就會被標記爲垃圾郵件。

這被稱做基於實例學習:系統先用記憶學習案例,而後使用類似度測量推廣到新的例子

圖10 基於實例學習

基於模型學習

另外一種從樣本集進行概括的方法,是創建這些樣本的模型,而後使用這個模型進行預測。這稱做基於模型學習。

圖11 基於模型學習

例如,你想知道錢是否能讓人快樂,你從 OECD 網站下載了 Better Life Index 指數數據,還從 IMF 下載了人均 GDP 數據。表 1-1 展現了摘要。

 

圖12 最佳擬合訓練數據的線性模型

最後,能夠準備運行模型進行預測了。例如,假如你想知道塞浦路斯人有多幸福,但 OECD 沒有它的數據。幸運的是,你能夠用模型進行預測:查詢塞浦路斯的人均 GDP,爲 22587 美圓,而後應用模型獲得生活滿意度,後者的值在4.85 + 22,587 × 4.91 × 10-5 = 5.96左右。

案例 1-1 展現了加載數據、準備、建立散點圖的 Python 代碼,而後訓練線性模型並進行預測。

案例 1-1,使用 Scikit-Learn 訓練並運行線性模型。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
# 加載數據
oecd_bli = pd.read_csv("oecd_bli_2015.csv", thousands=',')
gdp_per_capita = pd.read_csv("gdp_per_capita.csv",thousands=',',delimiter='\t',
 encoding='latin1', na_values="n/a")
# 準備數據
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]
# 可視化數據
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()
# 選擇線性模型
lin_reg_model = sklearn.linear_model.LinearRegression()
# 訓練模型
lin_reg_model.fit(X, y)
# 對塞浦路斯進行預測
X_new = [[22587]] # 塞浦路斯的人均GDP
print(lin_reg_model.predict(X_new)) # outputs [[ 5.96242338]]
相關文章
相關標籤/搜索