1. 程式人生 > >機器學習系統設計(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho

機器學習系統設計(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho

切分 秘密 閾值 isa 占用 第二版 思考 並且 了解

機器學習系統設計(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho

總述

本書是 2014 的,看完以後才發現有第二版的更新,2016。建議閱讀最新版,有能力的建議閱讀英文版,中文翻譯有些地方比較別扭(但英文版的書確實是有些貴)。

我讀書的目的:泛讀主要是想窺視他人思考的方式。

作者寫書的目標:面向初學者,但有時間看看也不錯。作者說“我希望它能激發你的好奇心,並足以讓你保持渴望,不斷探索這個有趣的領域”。在我看來本書已達到這一目的,相對於理論性強的書籍,這樣的書更能讓人容易堅持去閱讀,沒有那麽晦澀難懂。

正面感受:

  1. 側重於機器學習系統的工程實踐,沒有晦澀難懂的理論,但內容也足夠將建模和解題過程介紹清楚。有時間的讀者可以 step by step 的嘗試。本人沒有實踐,因為平時實驗室的任務比較忙,不過其中的一些思想是可以借鑒到工作中的。(看書其實很多時候是想知道同一個問題別人是怎麽做的,同時也發散思路)。
  2. 可以感受到作者在向我們傳授如何學習的方式。與很多直接給出最優解的書不同,本書總是先從最基礎的 baseline 入手,然後逐步發現問題並調優,這個過程與工程實踐很 match。一口吃不下一個胖子,如何將問題分解,慢慢優化是關鍵。比如(1)在最開始時,作者指出“遇到困難的時候怎麽辦,分享了學習的方法:鼓勵你構建自己的機器學習相關博客的列表,並定期閱讀。kaggle 很重要!!”---傳達他對問題的一個態度,我們必須要學會自我積累與成長。(2)第 2 章:從簡單分類器升級到更復雜的分類器:模型結構(閾值劃分特征)、搜索過程(盡可能多的嘗試所有特征組合和閾值組合)、損失函數(確定哪些可能性不會太差),反復嘗試。(3)第 5 章檢測劣質答案,通過 偏差-方差(bias-variance)分析發現可優化的點,對模型調優。(4)第 6 章情感分析,通過特征分析和特征工程,不斷發現有價值的特征以調優模型。(5)第 9 章音樂體裁分類,音頻特征提取從傅立葉變換(FFT)到梅爾倒頻譜系數(MFCC),這是作者通過音樂信息檢索相關領域的 paper 獲取到的信息。可見得調優過程需要對領域進行了解,需要廣泛的調研,並且具備信息的甄別能力。(6)最後,分享了一些作者認為好的學習資源。

補充:

本書的初衷意味著它在系統性、理論性上的欠缺。因此希望在 ML 領域深耕,還是需要將其中涉及的理論和概念進行深挖,比如作者在最後提及的書籍是不錯的選擇。對於工具,我認為只是解決問題的手段,計算機出身對工具的運用應該有一套自己快速上手的方法。雖然由於時間原因很難將每本書都動手實踐一遍,比如亞馬遜雲,如果有時間最好可以嘗試,但如果時間有限可以大概了解有這樣的工具可以解決這樣的問題即可。

另外值得強調的是,信息時代更新換代很快,很多書本上的東西,尤其是工具也是與時俱進的。因此在真正應用時還是應該再做充分的調研,了解最新的進展。

機器學習系統的主要路線:問題抽象,數據采集,數據探索,數據清洗,特征提取,模型選擇與調優。註意利用有效的評估手段對結果進行評估,對領域進行充分的調研,這樣才能更好的發現問題並對模型進行調優。最值得一提的還是特征工程

,特征的設計往往更像是一門藝術。總的來說還是要多積累,多發散思維,動手去做,反思總結,循序漸進。

各章節的 review

1.Python 機器學習入門:

介紹了本書的定位,一些學習心得。簡單介紹了需要的 python庫:NumPy、SciPy、Matplotlib 等。演示了一個小應用,回歸問題。機器學習的工程實踐:收集數據,讀取和清洗數據,探索和理解數據,特征工程,選擇正確的模型和算法,正確的評估。每一個步驟都很關鍵,在工程實踐中數據處理(清洗、探索、理解、特征工程),尤其是特征工程又扮演著非常重要的角色。實際上我們有大部分時間將花費在模型之前。overfitting 的概念,train set 和 validation set 的概念。

2.如何對真實樣本分類:

  • Iris 數據集,這是很經典的數據集,scikit-learn tutorial 中常用的基礎示例數據集。著重介紹了 cross-validation (周華誌-機器學習,中的模型評估有很好的總結)。誤差:訓練誤差、測試誤差、泛化誤差。我們終極目標是:降低泛化誤差。更復雜的分類器:模型結構(閾值劃分特征)、搜索過程(盡可能多的嘗試所有特征組合和閾值組合)、損失函數(確定哪些可能性不會太差),反復嘗試。
  • Seeds 數據集,介紹更復雜的數據和更復雜的分類器。著重介紹特征和特征工程,需要借助背景知識通過直覺來判斷哪些是好的特征。幸運的是很多領域,已經有很多文獻介紹可能用到的特征和特征類型。(這說明了知識面和廣泛的調研時有必要的)。特征工程通常是一個能夠獲得最大正確率提升的地方,這是因為更好的特征數據往往可以擊敗漂亮的方法(CNN 核心就在於 feature extraction)。有很多方案可以混合搭配。二分類 vs 多分類。

3.聚類:尋找相關的帖子

  • 簡單介紹了文本處理的背景。terminology:bag-of-word,相似性計算(Cosine, Pearson, Jaccard),頻次向量歸一化,刪除不重要的詞語——停用詞,詞幹處理,詞頻-反轉文檔頻率(TF-IDF)。
  • tool:NLTK
  • 步驟:(1)提取每個帖子的特征並向量化,將一個帖子映射到一個向量上;(2)在這些向量上進行聚類;(3)確定每個待聚類帖子所在的簇;(4)對每個簇,獲取幾個與待聚類帖子不同的帖子,提升多樣性。
  • 目標:切分文本;扔掉出現過於頻繁,而又對檢測沒有幫助的詞語(停用詞);扔掉出現頻率低,只有很小可能出現在未來帖子中的詞語;統計剩余的詞語;考慮整個語料集合,從詞頻統計中計算 TF-IDF(現在大多使用深度學習進行representation learning,遞歸神經網絡在文本中取得了很好的效果,TF 的 tutorial 不錯:https://www.tensorflow.org/tutorials/recurrent)。
  • 聚類:k 均值。噪聲處理。參數調整。

4.主題模型

  • 前一小節的擴展,更高級的文本分組方式。任務:拿到一個文本集合並對它做反向工程,從中發現都有哪些主題,以及每個文檔屬於哪些主題。這些主題是什麽呢?從技術上講,它們是詞語上的多項式概率分布。
  • LDA 對整個維基百科建模。平均下來每個文檔只涉及 6.5 個主題,其中 93% 的文檔涉及的主題數小於等於 10。
  • 選擇主題的個數。去除停用詞。
  • tool:gensim

5.!!分類:檢測劣質答案

  • 沒有完美的答案。調優路線:knn-> logist regression --> 在部分數據上表現不錯的模型。
  • 兩個問題:
    • 如何表示數據樣本:如何提取特征;
    • 應該采用什麽模型或結構:邏輯回歸、決策樹、SVM和樸素貝葉斯。本結:knn vs. logistics regression
  • 預處理:獲取數據 --> 削減到可處理的程度 --> 理解各個屬性的作用並進行選擇(業務背景)--> 定義什麽是優質答案:if score > 0 then 是正例,if score <=0 then 是負例
  • 分類器調優:knn + 超鏈接的數量,accuracy 49% --> 更多的特征:加入代碼行數, accuracy 0.583 --> 繼續加特征:AvgSentLen, AvgWordLen, NumAllCaps, NumExclams,加了 4 個特征反而更差,accuracy 0.5765 --> 如何提升效果(4 個方向):增加更多的數據、考慮模型復雜度、修改特征空間、改變模型。
  • 無序的選不是好辦法,偏差-方差(bias-variance)折中法進行分析,underfitting vs. overfitting 的平衡。我們希望 low bias 同時 low variance。但實際中我們必須在兩者中平衡,因為一個的減小很可能導致另一個增大。(Andrew 的課程 和 周華誌的機器學習 都有總結)
    • 針對 high-bias 的策略:增加更多特征,讓模型復雜,或嘗試別的模型。
    • 針對 high-variance 的策略:更多數據、降低模型的復雜度,刪減一些特征。
  • 實踐:作圖 Train/Test Error vs Data set size。(圖有一些錯誤,train error 和 test error 的圖示反了)。不同的 k 對應的 train / test error 作圖,k增大效果更好一些,即降低復雜度有一些正面的影響。
  • knn 的缺點:需要存儲所有的訓練數據空間開銷大,預測時耗時。
  • baseline knn,k=90,accuracy 0.628 --> 邏輯回歸,選擇參數 C=0.1,accuracy 0.631,--> bias-variance 分析,觀察:high bias --- test/train error 誤差很接近,結論:數據過於嘈雜、對於區分不同類別來說特征集合還不合適。---> 觀察正確率的背後:precision and recall,pr-curve,auc,分類針對劣質答案(A) vs 分類針對優質答案(B)。A 的 precision 和 recall 都很低,不需要考慮。B 的效果不錯,進一步調整閾值,可以得到 80% precision,recall 37%,是否能容忍低的召回?---> 分類器瘦身:通過邏輯回歸的系數判斷特征的重要性,刪除不重要的特征。

6.分類 II: 情感分析

  • 背景:對於公司來說,緊密監控公眾對重要事件(例如產品發布或者新聞發布)的態度十分重要。Twitter 可以對推文的情感進行分類。有時也叫觀點挖掘(opinion mining)
  • 目標:(1)介紹分類算法:樸素貝葉斯;(2)闡釋詞性(Part Of Speech, POS);(3)展示 Scikit-learn 工具箱中一些偶爾出現的小技巧
  • 獲取 Twitter 數據(文本 + 標簽(正面、負面、中性)),
  • naive Bayes:
  • 對無關特征的處理十分彪悍;
  • naive 的來源:特征相互獨立條件假設。後驗概率 = prior * likelihood / evidence
  • 未出現詞(未出現特征):拉普拉斯平滑(Laplace smoothing),加1平滑(additive smoothing)。
  • 考慮算數下溢:很小的值連乘(太小!!!),log(x*y) = log(x) + log(y)
  • 分類器:GaussianNB, MultinomialNB, BernoulliNB
  • 簡單問題:只處理正負兩個類別,P/R AUC 0.88
  • 使用所有分類:正面、負面、中性,P/R AUC: sent(pos or neg) vs. rest:0.68;pos vs.rest: 0.31, neg vs. rest: 0.51
  • 對分類器進行調優:TfidfVectorizer, MultinomialNB,使用 GridSearchCV 對組合參數進行選擇。評估:f1-score。pos vs. rest: 0.52, neg vs. rest: 0.64
  • 清洗推文:sent vs. rest: 70.7 (有提升,TfidfVectorizer 中的 preprocessor)
  • 將詞語類型考慮進去:語言信息:名詞、動詞、形容詞。確定詞語的類型是詞性標註(Part of Speech tagging, POS 標註)。tool:NLTK,SentiWordNet 賦予大部分英文單詞一個正向分值和一個負向分值。詞義消歧(word sense disambiguation)。
  • 把所有東西融合在一起:FeatureUnion: TfidVectorizer + 詞類型 + naive bayes。pos vs. neg: 0.808, Pos vs. neg: 0.794, pos vs. restL: 0.886, Neg vs. rest: 0.881

7.回歸:推薦

  • 回歸預測房價:普通最小二乘法(Ordinary Least Squares, OLS)-- 考慮很多特征時不可用。
  • 更好的方法:lasso(l1 regularization),ridge(l2 regularization),elastic net(lasso + ridge)。
  • 多維回歸。懲罰式回歸,L1 VS L2。Netflix Challenge。
  • P 大於 N 問題:特征個數 P, 樣本個數 N,即 P 大於 N 問題。OLS 不再適用。
  • 巧妙的設置 hyperparameter:評估泛化能力需要兩層交叉驗證,for example 10-fold,1 作為 test set,9 train set --- train set and validation set。最後投入使用時再用完所有的train 樣例訓練一遍。
  • 好算法是一件好事情,但你一定要親自調優你的方法,使之適應數據的特性
  • 建模:分類 vs 預測(1~5分評分粗糙,中間值是有意義的比如 1.5),兩個選擇:movie-spercific, user-specific。(協同過濾,user-movies 矩陣)

8.回歸:改進的推薦(推薦書籍:推薦系統實踐--項亮)

  • 購物籃分析(basket analysis)
  • 改進的推薦:
    • 數據:0/1 矩陣,沒評價/評價。
    • 步驟:(1)計算 user 間的相似性,對其他用戶排序。(2)當我們需要一個用戶-電影數據對估算評分時,我們順序查找用戶的近鄰。當發現第一個對該電影的評分時,將它輸出。
  • movie-based similarity,按照相似電影的得分來進行估計。
  • 組合多種方法:集成學習(ensemble learning)/ 棧式學習
  • 購物籃分析:Apriori 關聯規則挖掘。tool: pymining

9.分類 III:音樂體裁分類

  • 到目前為止,我們均假定任何訓練樣本都很容易用特征向量來描述。這樣的表示很“奢侈”。
  • 如何表達 3 分鐘長度的歌曲?
  • 目標:在舒適區之外構建優秀的分類器,必須用基於聲音的特征。多分類問題:Jazz, Classical, Country, Pop, Rock, Metal。
  • 獲取音樂數據 ---> 觀察音樂:Matplotlib 的 specgram() 畫音樂的聲譜;傅立葉變換(Fast Fourier Transform, FFT),將音樂分解成正弦波成分; ---> 用 FFT 構建一個分類器:混淆矩陣(圖可以清洗的告訴我們應該專註於哪裏的優化),ROC(Receiver Operator Characteristic)---> 用梅爾倒頻譜系數(MFCC)提升分類效果。
    讀者瀏覽了一些 AMGC(音樂信息檢索的一個子領域) 的論文之後,發現有很多自動體裁分類方面的工作。(我們需要主動的去收集更多的信息)

10.計算機視覺:模式識別

  • tool:mahotas 計算機視覺包的傳統圖像處理函數:數據預處理、噪聲消除、圖像清理、對比度拉伸等。
  • 圖像處理簡介:尺度不變特征變換(Scale-Invariant Feature Transform,SIFT)
  • 讀取和顯示圖像:圖像裏減去像素均值通常是很有用處的操作,有助於不同光照下對圖像進行歸一化,標準的 mean
  • 圖像處理基礎:
    • 閾值:卡閾值時一種非常簡單的操作,if x > threshold then 1, if x < threshold then 0。rgb2gray。
    • 高斯模糊:經常用於降噪,可以將總體布局無關的細節去掉
    • 不同效果的濾波:
  • 加入椒鹽噪聲:模擬掃描噪點;聚焦中心。
  • 模式識別:由於歷史原因,圖像分類又叫做模式識別
  • 計算圖像特征:Haralick 紋理特征,計算特征不僅僅是為了分類還可以降維
  • 設計你自己的特征:機器學習的一個優點就是,我們只需要寫出一些想法,然後就可以讓系統找出哪些是好的,哪些不太好。
  • 這個例子體現了一個原則:好算法只是比較容易的那個部分。你總可以找到一個前沿的分類方法來實現。但真正的秘密和附加值通常是在特征設計和特征工程裏面。這就是數據本身知識的價值所在。
  • 在更難的數據集上分類
  • 局部特征表示(local feature):
    • 隨機計算、在一個格子裏計算、檢測圖像中的興趣區域(關鍵點檢測、即 keypoint detection)
    • bag-of-word 模型,視覺詞:把圖像中看起來相似的區域聚成一組,把它們叫做視覺詞語。
    • 每一個圖像可以用一列數目相同的特征來表示。
  • (目前對圖像處理效果最好的是 CNN)

11.降維

  • 降維的必要性:
    • 多余的特征回影響或誤導分類器
    • 更多特征意味著更多參數的調整,過擬合的風險更大
    • 用於解決實際問題的維度可能是虛高
    • 維度越少意味著訓練越快,可以嘗試更多東西
    • 可視化
  • 降維方法:特征選擇方法、特征抽取方法。生成、分析、然後扔掉一些特征。
  • 主成分分析(Principal Component Analysis, PCA)、線性判別式分析(Linear Discriminant Analysis, LDA)和多維標度法(MultiDimensional Scaling, MDS)。
  • 兩種通用的做法:
    • 篩選器(filter):
      • 相關性(線性和非線性)、互信息(依賴的不是數據序列而是數據的分布)
      • 缺點:扔掉在獨立使用時沒有用處的特征。但實際情況往往是,一些特征看起來跟目標變量完全獨立,但當它們組合在一起時就有效了。
    • 封裝器(wrapper)
      • 特征遞歸消除(recursive feature elimination)
      • 缺點:要設置保留的特征個數,不過可以嘗試
    • 其他特征選擇方法:
      • 嵌入式學習:比如決策樹,L1
  • 特征抽取:
    • 線性:PCA:
      • 核心:保留方差最大的;最終的重構誤差最小。
      • 局限性:(1)對非線性數據的處理存在局限性,有擴展,比如 KernelPCA 解決非線性問題。(2)無監督--> 考慮 LDA,讓不同類別樣本之間的距離最大。
      • 為什麽優先考慮 PCA 而不是 LDA : 隨著類別數量的增加,每個類別的樣例數就會稀少,LDA 的效果也不再那麽好;同時,對於不同訓練集,PCA 並不像 LDA 那樣敏感。(看情況!!)
    • 非線性:多標度法
      • 降低維度的同時盡可能保留樣本的相對距離----當有一個高維數據集,並希望獲得一個視覺印象的時候,這是非常有用的。
      • MDS 對數據點本身並不關心,相反,它對數據點間的不相似性卻很感興趣
      • 要使用 MDS,需要理解每一個特;或許我們所使用的距離並不能用歐式距離進行比較
      • MDS 是一個揭示數據相似性的有用工具,這在原始特征空間中很難看到
      • MDS 不是一個算法,而是一類算法
  • 特征選擇和抽取更像是一門藝術。

12.大數據

  • “大數據”並不是指具體的數據量,既不是樣本的個數,也不是數據所占用的 G 字節、T 字節 或 P 字節的數量。它的意思是:
    • 數據規模比處理它的能力增長更快
    • 過去一些效果不錯的方法和技術需要重做,因為它們的擴展能力不行
    • 你的算法不能假設所有數據都能載入內存
    • 管理數據本身變成了一項主要任務
    • 使用計算機集群或者多核處理器是必需品,並不是奢侈品
  • tool:
    • python jug,一個小型 python 框架,管理哪些利用了多核或主機的計算。
    • 雲服務平臺,亞馬遜 web 服務平臺, AWS。

13.更多機器學習知識:

  • 在線資源:Andrew Ng machine learning
  • 參考書:
    • Pattern Recognition and Machine Learning (Christopher M. Bishop, Springer)
    • Machine Learning: A Probabilitic Perspective (K. Murphy, The MIT Press)
  • 問答網站:
    • MetaOptimize ()
    • Cross Validated,統計學習網站,通常也會設計機器學習。
    • 本書連接:http://www.twotoreal.com/,有新版本。
  • 博客
    • 機器學習理論:http://hunch.net/
      • John Langford 的博客(他是 Vowpal Wabbit ---- http://hunch.net/~vw/ --- 背後的主導者)。速度:每月一帖。
    • 文本與數據挖掘實用方法,http://textanddatamining.blogspot.de
    • Edwin Chen 的博客:http://blog.echen.me
      • 一帖/月,更實用的話題
    • 機器學習,http://www.machinedlearnings.com
      • 一帖/月,更實用的話題,通常圍繞大數據學習
    • FlowingData, http://flowingdata.com
      • 一帖/天,主要解決一些統計學問題
    • Normal deviate,https://normaldeviate.wordpress.com/
      • 帖/月,對實際問題的理論方面進行討論。
    • 簡單統計,http://simplystatistics.org
      • 帖/月,專註於統計學和大數據
    • 統計學建模,因果推理和社會科學,http://andrewgelman.com
      • 帖/天,作者用統計學原理指出流行媒體的缺點時很有趣
  • 數據資源:
    • UCI machine learning repository
  • 競爭日益增加:kaggle

機器學習系統設計(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho