標籤:logistic 統計 好奇心 exchange 附加 地區 管理資料 計算 去掉
機器學習系統設計(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho總述
本書是 2014 的,看完以後才發現有第二版的更新,2016。建議閱讀最新版,有能力的建議閱讀英文版,中文翻譯有些地方比較彆扭(但英文版的書確實是有些貴)。
我讀書的目的:泛讀主要是想窺視他人思考的方式。
作者寫書的目標:面向初學者,但有時間看看也不錯。作者說“我希望它能激發你的好奇心,並足以讓你保持渴望,不斷探索這個有趣的領域”。在我看來本書已達到這一目的,相對於理論性強的書籍,這樣的書更能讓人容易堅持去閱讀,沒有那麼晦澀難懂。
正面感受:
- 側重於機器學習系統的工程實踐,沒有晦澀難懂的理論,但內容也足夠將建模和解題過程介紹清楚。有時間的讀者可以 step by step 的嘗試。本人沒有實踐,因為平時實驗室的任務比較忙,不過其中的一些思想是可以借鑒到工作中的。(看書其實很多時候是想知道同一個問題別人是怎麼做的,同時也發散思路)。
- 可以感受到作者在向我們傳授如何學習的方式。與很多直接給出最優解的書不同,本書總是先從最基礎的 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)
- 缺點:要設定保留的特徵個數,不過可以嘗試
- 其他特徵選取方法:
- 特徵抽取:
- 線性: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