《機器學習實戰》主要講述流行的機器學習技術和其Python實現,內容基礎適合初學者,其詳細代碼實現較有價值,可以讓你深入細節理解分類器的運行過程。但某些分類器數學原理上講述的過少,例如SVM,直接上代碼顯得難以理解,建議配合其他書籍或課程同步學習。
以下總結為自己復習一遍順便寫下重點。
k-NearestNeighbor
- 計算當前點于訓練集全部點的距離,返回前k個點出現頻率最高的分類;
- 優點:精度高、對異常值不敏感、無數據輸入假定;
- 缺點:計算復雜度高、空間復雜度高;
- 適用數據范圍:數值型和標稱型;
- kNN對于每個訓練樣本都必須在全部訓練集上計算,沒有辦法保存訓練出來的分類器,但應該存在優化的方法,例如用樹存儲訓練集;
- kNN的另外一個缺點是無法給出任何數據的基礎結構信息,無法知曉平均或者典型的樣本喲什么樣的特征。
Desicion Tree(ID3)
- 構造決策樹的核心是如何劃分數據集,我們常用信息論中的信息增益的方法(或Gini指數)來確定劃分數據集的最好特征。
- 本書采用ID3算法來劃分數據集:對每個特征劃分數據集的結果計算信息熵,劃分是對訓練集中該特征的所有取值分別劃分出分支;
- 劃分一次消耗一個特征,所以可能出現全部特征都消耗完但是類標簽任然不唯一的情況,這時候需要以多數表決的形式確定分類標簽;
- 構造決策樹需采用遞歸的方式,遞歸結束的條件是劃分完全部屬性或者每個分支下所有的實例都具有相同的分類;類別完全相同則停止劃分,直接返回類標簽,所以樹的全部葉子節點都是類標簽信息;
- 在Python中可以以dict存儲一棵樹,dict鍵值對的形式中前者可以表示父節點,后者可以表示子節點;
- 優點:計算復雜度不高,輸出結果直觀易于理解,對中間值的缺失不敏感,可以處理不相關特征數據;
- 缺點:可能產生Overfitting;
- 使用數據范圍:數值型和標稱型;
- 決策樹與kNN不同的地方就在于可以將訓練好的分類器存儲下來,存儲決策樹可用Python中的pickle序列化對象;
- 決策樹還有C4.5和CART算法;通過剪枝,合并節點等可以解決Overfitting的問題。
Naive Bayes
- 貝葉斯的核心就是貝葉斯公式,在需要計算一個條件概率的情況下,我們可以利用公式將條件概率中的條件和結果互換;例如,給定一個vector,需計算在這個vector的情況下分別所屬不同類別的概率,互換概率后就變成了在(全體訓練數據中)這個類別中該vector出現的概率;
- 樸素貝葉斯的樸素就是做了假設以方便計算:假設全部特征之間相互獨立,這樣vector相關計算就可以拆成乘積的形式,同時降低了對數據量的要求;但顯然,這種假設是錯誤的,但是大多數問題中NB的表現還是可以的;
- 計算過程中會出現兩個問題:1.乘積的0概率問題,可以通過很多方式例如平滑來解決;2.下溢出,很多太小的數相乘,可通過取自然對數來解決;
- 優點:在數據較少的情況下任然有效,可以處理多類別問題;
- 缺點:對于輸入數據的裝備方式比較敏感;
- 適用數據類型:標稱型數據;
Logistic Regression
- 邏輯回歸可以用于分類,其主要思想是對分類邊界建立回歸公式;
- 邏輯回歸實際上就是標準的線性回歸后加上了一個Sigmoid函數輸出結果;Sigmoid函數很像一個階躍函數,輸出0-1之間的值,輸入為0時輸出為0.5;
- 邏輯回歸的優化方式為梯度上升,首先將每個回歸系數初始化為1,計算整個數據集的梯度,使用步長
*
梯度的方向更新回歸系數,迭代n次; - 實際上本書的代碼這樣實現:每次迭代中計算error,error為當前分類器輸出的結果減去真實標簽,更新為回歸系數+步長
*
訓練數據*
error(均為矩陣運算); - 梯度上升在數據量大的時候計算復雜度太高,故提出隨機梯度上升,每次隨機選取一個樣本來更新系數,同時使步長隨著迭代次數不斷減??;實際上,我們現在的隨機一般是隨機抽取一個batch,不僅僅是一個來進行運算;
- 優點:計算代價不高,易于理解和實現;
- 缺點:容易欠擬合,分類精度可能不高;
- 適用數據類型:數值,標稱;
- SGA還是一個在線算法,即可以在新數據到來時完成數據更新,不需要重新讀取整個數據集。
Support Vector Machine
- SVM的核心就是尋找最胖的分類邊界,即找到距離分隔超平面最近的點,確保它們離分割面的距離盡可能的遠;支持向量指的就是離分隔超平面最近的那些點;
- 將此優化問題轉換成帶約束條件的優化問題,引入拉格朗日乘子和松弛變量,可用二次規劃來解決;
- 本書描述了不同于二次規劃的SMO(序列最小優化)算法來解決上述問題,SMO核心思想是將大優化問題分解為多個小優化問題來求解的;每次循環中選擇兩個合適的alpha,增大其中一個的同時減小另外一個。這部分是本書中最難理解的部分。
- SVM中還有另外一個重要的工具:核函數;核函數使SVM可以解決非線性分類問題,它將一個特征空間轉換到另外一個高維的特征空間,在高維空間中解決線性問題;
- SVM的所有運算都是內積的形式,我們可以把內積運算替換成核函數,不必做任何簡化處理,這就是Kernel Trick;
- RBF核函數,又叫高斯,又叫徑向基;映射到無窮維的空間,十分常用;
- 優點:繁華錯誤率低,計算開銷不大,結果易解釋;
- 缺點:對參數調節和核函數的選擇敏感;
- 適用數據類型:數值,標稱;
- SVM可以說是監督學習中最好的定式算法;
Adaptive Boosting
- 集成學習方法:可以將不同的分類器組合;可以是不同算法的集成,也可以是同一算法在不同設置下的集成,還可以是數據集的不同部分分配給不同分類器之后的集成;
- bagging方法(自舉匯聚法):從原始數據集選擇S次后得到S個新數據集,新數據集的大小和原始數據集相等,將某個學習算法分別作用于每個數據集就得到了S個分類器,選擇分類器投票結果中最多的類別作為最后的分類結果;還有一些更先進的bagging方法,例如Random Forest;
- boosting方法:使用也是同樣的分類器,但是串行訓練,即每個新分類器根據已經訓練出的分類器性能來訓練,關注被已有分類器錯分的樣本來獲取新的分類器;
- bagging中每個分類器權重相等,但是boosting不相等,每個權重代表對應分類器在上一輪迭代中的成功度;
- AdaBoost中有兩個權重,第一樣本權重向量D,第二每個分類器的權重alpha;訓練過程為:首先在訓練集上訓練一個弱分類器并計算錯誤率,然后調整樣本權重:分對的樣本權重降低,錯分的樣本權重提高,再次在同一數據集上訓練弱分類器;同時每次訓練結束后基于分類器的錯誤率計算alpha;測試過程為:每個分類器的估計值分別乘上對應的alpha累加得到輸出;
- 通常情況下,AdaBoost會達到一個穩定的測試錯誤率,并不會由于分類數目的增多而提高;
- AdaBoost和SVM是監督機器學習中最強大的兩種方法。
Linear Regression
- 線性回歸用來尋找最佳擬合直線,是可以直接求解的(最小均方誤差的無偏估計),需要求一個逆矩陣;
- 如果矩陣的行列式為0,那么求逆會出現錯誤;
- 衡量線性回歸結果的好壞:利用皮爾遜相關系數計算兩個序列之間的相關度,越大匹配越完美;
- LWLR(局部加權線性回歸):解決欠擬合;給待測點附近的每個點賦予一定的權重,然后在這個子集上進行普通的線性回歸;
- LWLR同樣適用Kernel來對附近的點賦予權重,常用的為高斯核,調整參數k;離待測點越遠的權重越小;所以基本來說就是只看待測點附近的點;
- LWLR增加了計算量,類似于kNN;
- Ridge Regression(嶺回歸):RR最初用來解決樣本點比特征少的問題,因為這樣矩陣不是滿秩矩陣,在求逆時會出現問題,于是在估計中加入一個偏差λI使得矩陣非奇異從而可以求逆;RR又是一種Shrinkage,通過引入該懲罰項,對回歸系數的大小增加了限制,能夠減少不重要的參數,選取合適的λ,能使部分不重要的系數縮減為0;不難證明,當對系數的平方和添加一個小于λ的約束時,可以得到與RR一樣的公式;
- lasso:就是約束條件使用絕對值取代了平方和;但卻極大了增加了計算復雜度;
- 向前逐步回歸:與可以得到與lasso差不多的結果,但更加簡單;屬于一種貪心算法,即每一步都盡可能減少誤差;一開始,所有的權重都設為1,然后每一步所做的決策是對某個權重增加或減少一個很小的值,然后計算錯誤率,如果錯誤率更低則保存改變;它可以幫助人們理解現有模型并做出改進;構建一個模型之后,可以運行該算法找出重要的特征;
- 當使用縮減方法時,模型的偏差(Bias)增加,但是同時方差(Variance)減少;也就是說,使用縮減法,減少了模型復雜度,降低了過擬合的風險;
- 優點:結果易于理解,計算不復雜;
- 缺點:對非線性擬合不好;
- 適用數據類型:數值,標稱;
Classification and Regression Tree
- 當數據擁有眾多特征且特征之間關系十分復雜時,構建全局模型的想法就不現實了,一種可行的方法是將數據切分成多份易建模的數據,再在每份數據上用工具建模;
- CART(分類回歸樹)既可以用于分類又可以用于回歸,它使用二元切分來處理連續型變量;
- CART只做二元切分,所以與ID3相比,可以使用固定的數據結構來存儲樹節點;
- 回歸樹認為數據中的復雜關系可以用樹結構來概括;
- 連續數據混亂程度計算:首先計算所有所有數據的均值,然后計算每條數據到均值的差值,也就是方差×樣本點個數;
- CART同樣對每個特征,再對每個特征值,將數據切成兩份,計算切分的誤差,由此來找到最佳切分;其中有兩個參數來實現預剪枝:如果切分數據集后效果提升不大,那就不切分直接創建葉子結點;另外檢測兩個切分后的子集的大小,如果大小小于參數,那么也不切分;
- 如果是回歸樹,那么葉子結點就是目標變量的均值;
- 剪枝:降低決策樹的復雜度來避免過擬合;預剪枝:上述的兩個參數,就是提前終止條件,效果相對不錯;后剪枝:將數據分成訓練集和測試集,首先使構建出的樹足夠復雜,接下來從上到下找到葉節點,用測試集來判斷這些葉節點是否能合并來降低測試誤差,如果是則合并;后剪枝并沒有預剪枝有效,但預剪枝對于參數非常敏感;
- 模型樹:葉節點設定為分段線性函數;關鍵在于誤差的計算,應該先用線性模型擬合,然后計算真實目標值和模型預測值之間的插值,最后求差值的平方和得到誤差;葉節點是線性回歸的系數向量;
- 樹回歸在預測復雜數據時會比簡單線性模型更加有效;
k—Means
- k均值是最簡單的無監督學習,聚類方法,它將相似的對象歸到同一個簇中;
- 簇的個數k由用戶給定,每個簇通過其質心來描述;
- 首先隨機確定k個初始點為質心,然后將數據集中的每個點分配到一個簇中,反復迭代結算質心和分配,直到所有數據點的簇分配結果不再改變為止;
- 一種度量聚類效果的指標是SSE(誤差平方和,誤差指點到質心的距離),越小表示數據點越接近質心,聚類效果越好;一種后處理的方法是合并最近的質心,或者合并使得SSE增幅最小的質心;
- 為了克服kM的局部最小值問題,提出二分K-均值算法,該算法首先將所有的點作為一個簇,然后將該簇一分為二,之后選擇一個簇繼續劃分,選擇哪一個簇劃分取決于對其劃分是否可以最大程度降低SSE的值;
- 優點:容易實現;
- 缺點:可能收斂到局部最小值,在大規模數據上收斂較慢;
- 適用數據類型:數值;
Association Analysis:Apriori
- 從大規模數據中尋找物品之間的隱含關系被稱作關聯分析;
- 頻繁項集是經常出現在一起的物品集合,關聯規則暗示兩種物品之間可能存在很強的關系;
- 支持度:數據集中包含該項集的記錄所占的比例;
- 可信度:對于包含某物品的記錄,我們有多少條記錄都適用;
- Apriori可以用來發現頻繁項集,可以減少計算次數;Apriori原理:如果某個項集是頻繁的,那么它的所有子集都是頻繁的,也就是說如果某個項集是非頻繁的,那么它的所有超集也都是非頻繁的;該算法首先生成所有單個物品的項集列表,接著將不滿足最小支持度的集合去掉,然后對剩下的集合進行組合生成包含多一個元素的項集,反復迭代;
- 關聯規則從頻繁項集生成;如果某個規則不滿足最小可信度要求,那么該規則的所有子集也不會滿足最小可信度要求;從每條頻繁項集中生成關聯規則的方法如下:首先獲取機集合中的所有元素,對于長度為1的不考慮,對于長度為2的直接計算,對于長度大于2的,先固定右邊,對左邊合并計算;
- 優點:易編碼實現;
- 缺點:在大數據集上可能較慢;
- 適用數據類型:數值,標稱;
Association Analysis:FP-growth
- FP-growth通過將數據存儲在一個FP樹中來發現頻繁項集,但不能用于發現關聯規則;同樣利用Apriori原理;
- FP樹分為樹和頭指針表,樹中是每個項集的路徑和其出現頻率;頭指針表保存每個元素的出現頻率并指向書樹中該元素,接著在樹中再次指向別的該元素,形成鏈表;
- 工作流程:首先構建FP樹,為了構建FP樹,需要掃描兩次原始數據集,第一遍對所有元素項的出現次數計數,第二遍掃描構建樹,在將集合添加到樹之前需要對集合排序,基于絕對出現頻率;
- 從FP樹中挖掘頻繁項集:從FP樹中獲取獲得條件模式基(是以所查找元素項為結尾的路徑集合,前綴路徑,是介于所查找元素與根結點之間的所有內容,構建可通過頭指針表上溯),再利用條件模式基構建條件FP樹;迭代上述直到樹包含一個元素項為止;
- 優點:一般要比Apriori快;
- 缺點:實現比較困難,在某些數據集上性能會下降;
- 適用數據類型:標稱;
Dimensionality Reduction
- 在低維下,數據更容易進行處理;
- PCA(主成分分析):數據從原來的坐標系轉換到了新的坐標系,第一個坐標軸選擇的是原始數據中方差最大的方向,第二個坐標軸選擇的是和第一坐標軸正交且具有最大方差的方向;
- 通過數據集的協方差矩陣及其特征值分析可以求得主成分的值;而保留幾個主成分可以通過計算主成分所占方差的百分比來決定;
- 優點:降低數據的復雜性,識別出最重要的特征;
- 缺點:不一定需要,且可能損失有用信息;
- 適用數據類型:數值;
- SVD(Singular Value Decomposition 奇異值分解):SVD的方法為隱性語義索引(LSI)或隱性語義分析(LSA),在LSI中,一個矩陣由文檔和詞語組成,當我們在該矩陣上應用SVD時,就會構建出多個奇異值,這些值代表了文檔中的概念或主題;
- SVD是矩陣分解的一種類型,矩陣分解是將數據矩陣分解為多個獨立部分的過程;SVD將原始數據集矩陣分解為三個矩陣U,Σ和VT的乘積;其中Σ矩陣只有對角元素且從大到小排列的,這些對角元素就叫做奇異值;如果我們在r個奇異值之后將其他奇異值全都置為0,這就意味著數據集中僅有r個重要特征,其它都是冗余或者噪聲;選取奇異值后,再將其乘回去,可以得到與原矩陣行列相同,數值相似的矩陣,這就達到了降維,壓縮的目的;
- 那如何知道保留多少奇異值?一個典型的做法是保留矩陣中90%的能量信息,為了計算能量信息,我們將所有的奇異值求平方和,將奇異值得平方和累加到90%為止;
- 優點:簡化數據,去除噪聲;
- 缺點:數據的轉換可能難以理解;
- 適用數據類型:數值;
- SVD這里說到了基于協同過濾的推薦引擎,協同過濾式將用戶和其他用戶的數據進行對比來實現推薦;那么相似度計算就變得十分重要,我們利用用戶對物品的意見來計算相似度;相似度計算方式一般有歐氏距離,皮爾遜相關系數,余弦相似度;
- 在用戶數量很多的情況下,我們使用基于物品相似度的計算方法;因為相似度計算時間和數目相關;
- 推薦引擎尋找用戶沒有評過分的物品,尋找相似的物品計算相似度,并為每個物品預計一個可能的評級分數,為相似度和相似物品評分的乘積;
- 推薦系統的冷啟動(缺乏數據的情況下)是個挑戰,我們可以利用基于內容的推薦作為一個良好的開始;
其他
- 數據預處理:數據歸一化,除以同一個數值;
- 數據預處理:缺失值填充,均值,相似樣本等;
- 非均衡分類問題:不同類別的分類代價并不相等,需要在錯誤衡量中加權;過抽樣或者欠抽樣;
- 分類性能度量指標:Presicion,Recall和ROC曲線;
- MapReduce;