1. 程式人生 > >蜥蜴書讀書筆記-第一章 機器學習

蜥蜴書讀書筆記-第一章 機器學習

A. Geron, Hands on Machine Learning with Scikit-learn and TensorFlow.

第一章 機器學習Landscape

機器學習

機器學習就是從資料中學習。 EPT定義:從經驗(E)中學習去完成任務(T),任務完成的表現用P衡量,如果說隨著經驗E的增加,完成任務T的表現P也會得到提升,那麼這個計算機程式就可以說是從資料中學習了(learn from data)。

為什麼要用ML?

  • 有些問題傳統方法用起來過於複雜甚至並沒有已知的演算法來解決的。 機器學習可以簡化程式碼並且表現的更好。
  • ML能增進人類對很多事情的理解:有時候一些未曾預料的模式關係會被機器學習所發現,這將增進人們對問題的認識。比如data mining. 也就是可以對複雜問題或者大量資料有更深的洞見吧。
  • 對於變化的環境(fluctuating enviroments):機器學習系統可以很方便地被訓練以適用於新資料。

機器學習的主要型別

  • 根據是否有人類的監督介入分類:監督學習、無監督學習、半監督學習和強化學習
  • Whether or not they can learn incrementally on the fly: online earning versus batch learning
  • 根據算法系統是簡單地把新資料和已有資料進行對比,還是在訓練資料中探測pattern並建立預測模型:instance based versus model-based learning

在你設計一個機器學習演算法的時候,以上分類完全可以有互相重疊。

監督學習

  • 輸入給演算法的資料帶有了已知的答案–labels.
  • 典型的監督學習比如分類問題,其解的結果是判斷輸入資料屬於哪個類別。
  • 另一類問題成為迴歸,輸入帶很多feature的資料,其輸出的答案是一個數值。

幾種比較重要的監督學習演算法:

  • k-Nearest Neighbors
  • Linear Regression
  • Logistic Regression
  • Support Vector Machines(SVMs)
  • Decision Trees and Random Forests
  • Neural networks [注]

[注]:有些神經網路結構可以是無監督的,比如autoencoders 和 restricted Boltzmann machines. 神經網也可以是半監督的,比如說 在deep belief network 和 unsupervised pretraining(無監督預訓練)中.

無監督學習

無監督學習的訓練資料是沒有label的。

有一些比較重要的無監督學習演算法:

  • 聚類: k-Means, Hierarchical Cluster Analysis(HCA), Expectation Maximization
  • 視覺化與維度約化(Visualization and dimensionality reduction): PCA, Keral PCA, Locally-Linear Embedding(LLE), t-distributed Stochastice Negbor EMbedding(t-SNE)
  • 關聯性規則學習(Association rule learning): Apriori, Eclat 聚類是將輸入資料按照自己發現的類別區分開來。HCA會將分開的每個group再進行子類的劃分。 在這裡插入圖片描述 視覺化演算法:你輸入一堆複雜無標籤的資料,輸出是2D或者3D的資料表示,可以直接畫出來了。 在這裡插入圖片描述 資料降維:目標是簡化資料的同時並且沒有損失太多的資訊。一種途徑是把幾個相互關聯的feature合併成一個,也叫feature extraction。通常在給一個機器學習算是輸入資料之前嘗試進行資料維度約化是個很好的做法。程式會執行的更快,並且佔用記憶體和硬碟更少。 反常性檢測:檢測一些異常行為 在這裡插入圖片描述 關聯性規則學習:挖掘大量資料裡面屬性之間有趣的關係,比如超市用售賣日誌的內容來發現,購買尿布的人一般會同時購買啤酒,買番茄醬和烤肉架的人一般會購買牛排。

半監督學習

半監督學習的演算法可以處理部分labeled的訓練資料,通常是大量的未加標籤的資料和少量的加標籤了的資料。

舉個例子,集體活動時候,手機裡拍了很多照片,你不需要給每個人貼上標籤:張三、李四。。。,手機會自動識別不同照片裡面的相同的人(clustering),但是它不知道這是誰,你需要給某張照片裡面人加上了名字之後所有照片裡面都會完成標註。有時候你也需要給兩個看起來很像的人新增少量的標籤以區分開來

大多數半監督學習的演算法都是無監督學習和監督學習演算法的一個組合。比如說 deep belief networks(DBNs)是一個個的restricted Boltzmann machines(RBMs)堆疊起來,RBM以無監督學習的方式一個個接受訓練,之後整個系統使用監督學習的方式來微調。

強化學習

強化學習和以上演算法有很明顯的不同。學習系統稱為agent,可以觀察環境,選擇實施哪些動作actions,並且獲得獎勵(或者懲罰)作為反饋;算法系統是自己學會什麼是最優的策略(policy), 這個策略的目的是最大化獎勵積累。 在這裡插入圖片描述

Batch and online Learning

Another criterion used to classify Machine Learning systems is whether or not the system can learn incrementally from a stream of incoming data.

Batch learning

學習系統並非增量式的學習,系統使用所有可用的資料來訓練模型。這樣耗費時間和計算資源,因此通常是在offline的情況下操作的。

系統首先訓練好之後,在使用中就不在進行學習了,只是把之前學習的東西應用下去。 This is called offline learning.

如果有新的資料更新進來,那麼要將原有的資料和新的資料在一起,重新訓練模型,再投入使用中去。實際應用中,你可以間隔一段時間再重新訓練模型以適應新資料的加入,比如垃圾郵件檢測的問題你,你沒必要每次多一個垃圾郵件就訓練一次垃圾郵件檢測模型,每週一次訓練或者更長都可以的,這是考慮到訓練的資源消耗問題。

Online learning(更合適的名字是步進式學習)

線上學習是一種步進式(incrementally)的學習。你可以一步步的輸入資料,或者單個的,或者一組組的(mini-batched)。每個學習的階段都很快且資源消耗小,因此係統可以線上實時響應很快的學習新資料。 在這裡插入圖片描述 對於資料集比較大,無法一下子在主記憶體中處理的問題,線上學習是比較適合的,(這也被叫做out-of-core學習)。也就是說計算資源有限的時候線上學習是個不錯的選擇。 在這裡插入圖片描述 步進式學習裡面一個很重要的引數是學習率,它決定系統應該以多快進度學習新資料。如果學習率過大,系統學習接受新資料很快,但是會很快的忘記舊資料中學習到的東西。反過來說,如果學習率太慢,系統又會有很大的慣性,就是前面的資料對後面訓練的影響很大,學的也慢,但是這樣對輸入資料的噪聲不敏感。 對於線上學習,資料質量很重要,後面資料不好,學習的結果就會變得很差勁,客戶不開心啊。所以要經常監測系統,甚至需要回復到之前學習的狀態,監測輸入資料的質量也很必要!

Instance-Based Versus Model-Based Learning按泛化方式分:基於事例的和基於模型的學習

大多數機器學習的任務是預測,訓練完了之後,再對新資料進行預測。在訓練資料上具有好的表現是不夠的,最終的目的是在未見過的資料上表現良好!

Instance-based learning

Trivial, simple, learning by heart. Use measure of similarity to make predictions. <img src = "./img/fig1-15.png", width=500>

Model-based learning

為輸入資料的樣例建立一個模型,訓練模型的引數,用模型來做預測。 <img src = "./img/fig1-16.png", width=500>

機器學習的main challenges

  • 訓練資料量不足
  • 訓練資料不具備代表性(if sampling bias exists)
  • 資料質量差: 資料測量的時候噪音大,有錯誤等等,這會很大地影響學習系統尋找pattern的過程。
  • 無關的features: feature selection, feature extraction, creating new featurs by gathering new data.

“garbage in, garbage out…”

_ (以上是資料不好。) (以下是演算法不夠好。)_

  • 訓練資料過擬合(whe the model is too complex relative the amout and noiseness of the training data): 訓練資料表現好,泛化差。

    解決方法:

    • 簡化模型,比如減少模型參量,減少訓練資料的屬性數量,或者對模型引數的取值加以限制。
    • 獲取更多的訓練資料;
    • 降低訓練資料的噪音(修正資料錯誤,移除異常值)
  • underfitting : 現實比模型要複雜,因此fitting總存在偏差。

    how to fix:

    • 換用更有效的模型,比如擁有更多模型引數
    • feeding better features to the learning alogorithm(feature engineering)
    • 降低對模型引數的約束(比如降低正則化超引數)

Testing and Validating

將資料集分為 training settest set (一般習慣將資料集20%-80%分作為測試集和訓練集), 用訓練集的資料訓練模型,用測試集的資料測試模型。 在測試集上計算模型,可以得到對_泛化誤差_的估計。

Cross validation

現將資料集分成k個互斥的子集,每次選其中k-1個子集作為訓練集,剩下一個作為測試集。可以進行k次訓練和測試,最終返回k此訓練和測試結果的平均值作為輸出的模型。