這是我個人整理和總結的基礎概念和疑難點, 用Q&A的形式展示出來, 特別適合初學者和準備面試的童鞋~
邏輯回歸, Lasco回歸, Ridge回歸和ElasticNet
- Q: 邏輯回歸比線性回歸好嗎? 為什么?
- A: 并不能說在任意場景下, 邏輯回歸一定會比線性回歸好. 由NFL定理可知, 如果存在使用LR比使用線性回歸表現更好的場景, 就一定存在使用線性回歸比使用LR表現更好的場景.
- Q: 介紹一下Lasco回歸, Ridge回歸和ElasticNet和它們之間的異同
- A: Lasco 回歸使用L1正則化, 嶺回歸使用L2正則化, ElasticNet使用L1和L2的加權. L1正則化的好處是可以壓縮系數, 能把系數壓縮到0. L2正則化因為可導, 計算更方便, 表現更加平滑和穩定. L1和L2的加權實際上是一種折中. 在一個特征和另外一個特征相關時, Lasco通常只選擇一個, ElasticNet往往會兩個都選擇. 同時也集成了Ridge回歸的穩定性.
- Q: 為什么L1能夠壓縮系數? 為什么L2做不到?
- A: 我們可以從損失函數, 優化, 以及對數似然等角度去理解.
- 我們可以從損失函數L與某個參數w之間的關系與理解. 在沒有正則化前, 參數對于損失函數的極值點可能是w0. 因為正則化項都是在w=0處為0的非負偶函數. 加入正則化項以后, 無論w0大于0還是小于0, 新的極值點都會往0更靠近. 然而如果是加入L1正則項, 在系數大的時候, 損失函數可能就變成了尖峰狀. 若損失函數在w=0處本來就為0, 并且有|L(w0)|<|w0|. 那么加了L1正則項后極小值點就是0點了. 這也是系數能被壓縮至0的條件. 對于L2正則化來講, 0點附近的值是很小的, 一般|L(w0)|>|w0|^2, 所以很難把極小值點拖到0點處.
- 從優化的角度上看, 在加了正則項后, 我們需要滿足損失函數最小, 同時參數要在正則項構成的區域內. 有正則項的表達式我們能看到L1是有角的, L2 是個球. 對于L1交點常在坐標軸上, 自然就把一些系數壓縮成0了.
- 如果從分布的角度講. L1和L2實際上是代表了的先驗知識. 如果我們認為數據是服從某種分布, 應該在損失函數中加入對數似然, L1和L2就分別對應了Laplace分布和高斯分布
- Q: 為什么L2會更平滑
- A: 跟上面解釋一樣, 加了L2正則后, 極值點傾向靠近0的小數值, 所以會更平滑.
- Q: L1正則化不可導, 問題如何求解?
- A: 近端梯度下降(Proximal Gradient Descent, PGD)
貝葉斯
- Q: 介紹下樸素貝葉斯的原理?
- A: 首先, 我們可以定義分類錯誤的損失, 然后根據樣本分類的后驗概率得到對樣本分類的期望損失, 也就是條件風險. 這樣, 我們的分類任何就是要找到一個映射, 來最小化風險. 這樣我們就有一個貝葉斯判定準則: 為最小化總體風險, 只要在每個樣本選擇那個能使條件風險最小的類別標記即可. 對應的分類器就稱為貝葉斯最優分類器. 我們可以根據分類的
- Q: 樸素貝葉斯的"樸素"有什么意義?
- A: 因為它假定樣本的各個屬性是相互獨立的. 這樣就可以避免直接估計所有屬性的聯合分布了.
- Q: 舉個例子描述樸素貝葉斯?
- A: 以單詞糾正來講, 我們知道錯誤的單詞w, 想要知道最可能的正確的單詞c, 也就是要求P(c|w)最大. 按照貝葉斯定理, 我們可以通過正確單詞的分布P(c)和給定正確單詞c后錯誤單詞w的分布P(w|c)來計算.
- Q: 在樸素貝葉斯中, 如果重復了一個特征, 最發生什么事?
- A: 預測的精度會降低. 因為聯合概率變小了.
kNN
- Q: 簡單介紹下kNN?
- A: kNN就是根據給定測試樣本, 基于某種距離度量找出訓練集中k個與它最近的鄰居, 然后基于這k個鄰居的類別對該樣本的類別進行判斷.
- Q: kNN有哪些要素?
- A: 主要有K值的選擇, 距離度量和分類決策規則三個要素
- K值選擇: 若K值大, 偏差小, 但方差大; 若K值大, 方差小, 但偏差大. 一般我們通過交叉驗證來選取.
- 距離度量: 距離度量一般有歐式距離, 曼哈頓距離, 和特征中最大值. kNN的結果對距離十分敏感, 特征一定要歸一化.
- 分類決策規則: 一般有投票法和加權投票法.
- 另外, 樣本的輸入順序, 類初始中心的選取, 也會影響分類結果.
- Q: 使用kNN有什么需要注意的?
- A: K值和距離度量很重要, 特征一定要歸一化
Q: kNN的搜索過程很慢, 如何優化?
A: 可以使用KD樹. KD樹通過特征中位數和對維度取模實現劃分. 每次劃分取方差大的. KD樹是主存數據結構, 用的時候要整個加載進內存
Q: 如何尋找kNN的全局最優解?
A: 可以嘗試不同的質心初始化, 可以調整迭代次數, 可以去找K最佳大小.
- Q: 介紹下kNN中的距離度量?
- A: 一般有閔氏距離, 馬氏距離(Mahalanobis Distance), 巴氏距離(Bhattacharyya Distance), 相關系數, 等等.
- 閔氏距離包括歐氏距離, 曼哈頓距離, 切比雪夫距離
- 馬氏距離有不受量綱影響, 尺度變換不變性, 基于卡方分布, 可以用于檢測離群點
決策樹
- Q: 簡單介紹下決策樹?
- A: 決策樹是基于樹結構來進行決策的, 葉節點對應決策側結果, 非葉節點則對應一個屬性測試. 從根節點到每個葉節點就構成了一個判定序列. 決策樹學習的目的是找到一棵泛化能力強的決策樹.
- 決策樹的學習過程的核心思想是選取最優的劃分屬性對節點進行劃分. 是這樣的: 對于一個節點, 上面有訓練集D和屬性集A. 1. 如果當前節點都屬于都屬于一類樣本, 那就不需要劃分. 2. 如果當前屬性集A為空, 或者
- 最優屬性的選擇方法是決策樹學習的關鍵, 目標是令分支節點盡可能屬于同一個類別, 度量方法的不同形成了不同的學習算法. ID3學習算法是基于信息增益, C4.5學習算法則是基于增益率, CART學習算法基于基尼系數.
- 信息增益是計算劃分前和劃分后的信息熵的差. 新節點會用樣本數量進行一個加權. 若子節點的熵越小, 增益就越大, 所以這個算法會傾向選擇特征值較多的特征進行劃分.
- 增益率它沒有直接使用信息增益, 而是先用信息增益除以一個劃分的本征值, 這個本征值可以理解為樣本屬于哪個子節點的熵. 不過很顯然它會傾向于子節點樣本大的劃分, 因為對應的本質值小. 也就是說這個算法傾向選擇特征值較少的特質進行劃分.
- 基尼系數. 基尼系數計算兩個樣本不屬于一個類別的概率. 計算更加簡單.
- Q: 決策樹如何處理連續值的屬性?
- A: 我們可以通過樣本中這個屬性的取值, 得到一個劃分集合. 在劃分樹的節點時, 考察這個屬性時, 可以考察這些劃分點. 在子節點還可以使用該屬性進行劃分.
- Q: 決策樹的損失函數是什么?
- A: 結構風險一般用節點個數. 經驗風險主要有熵和基尼系數兩種
- ID3, C4.5 決策樹的經驗風險項是節點的熵, 權重是樣本個數.
- CART數用基尼系數經驗風險項. 回歸樹使用均方差.
Q: 介紹一下決策樹的前剪枝和后剪枝?
-
A:
- 前剪枝在決策樹構造時進行. 后剪枝在決策樹構造后進行.
- 剪枝方法有很多種. 剪枝時可以使用帶正則項的損失函數進行判斷. CART算法不需要預先指定正則項系數.
Q: 簡單介紹CART樹?
-
A: CART叫分類與回歸樹, 可以用于分類和回歸. 它的一個特點是在劃分節點時, 它將數據劃分為兩個集合, 而不是想ID3, C4.5那樣, 按照所選擇的屬性的取值進行劃分.
- CART用于分類樹時, 劃分依據是基尼系數
- CART用于回歸樹時, 劃分依據是和方差
集成學習和隨機森林
- Q: 介紹一下目前主要有哪些集成學習方法?
- A: 集成學習方法大致可分為序列式和并行式, 主要有Boosting和Bagging兩種.
- Boosting注重提高基學習器的準確性, 從而降低整體的偏差. 基本方法是根據上一次學習到的基學習器的表現來對訓練樣本分布進行調整, 使得先前基學習器預測錯誤的樣本收到更多關注. 重復這個過程直到學習到的基學習器數量達到預定值, 最后把它們加權組合起來.
- Boosting的代表性算法是Adaboost.
- Boosting實現對特定分布學習的方法主要有兩個: 重賦權和重采樣. 重采樣可以在錯誤率大于0.5后進行重啟動.
- Boosting的基學習器之間存在強依賴關系, 必須串行生成.
- Bagging注重提高基學習器的多樣性, 從而降低整體的方差. 基本方法是通過Bootstrap為每個基學習器進行采樣.
- Bagging適用于決策樹, 神經網絡等易受樣本擾動的學習器. 代表性算法是隨機森林
- Bagging的基學習器之間不存在強依賴關系, 可以并行生成.
- Boosting注重提高基學習器的準確性, 從而降低整體的偏差. 基本方法是根據上一次學習到的基學習器的表現來對訓練樣本分布進行調整, 使得先前基學習器預測錯誤的樣本收到更多關注. 重復這個過程直到學習到的基學習器數量達到預定值, 最后把它們加權組合起來.
- Q: 集成學習得到比基學習器更好的性能的條件是什么?
- A: 基學習器應該要具備一定的準確性, 并且要有多樣性. 理論上如果基學習器的誤差相互獨立的話, 隨著基學習器的增加, 集成的錯誤率會趨向于0. 不過在現實中是不可能的.
- Q: 簡單介紹一下AdaBoost算法?
- A: AdaBoost是一種Boosting方法. 核心思想是用上一個基學習器的錯誤率的對數幾率(二分之一)給樣本重賦權. 預測正確的樣本除以幾率, 錯誤的樣本乘以該幾率. 然后歸一化, 再學習新的基學習器. 基學習器用其錯誤率的對數幾率進行加權.
- Q: 簡單介紹一下隨機森林?
- A: 隨機森林的基學習器都是決策樹. 它是Bagging的一個拓展, 除了在樣本進行bootstrap采樣, 在節點劃分的屬性選擇上也引入了隨機選擇: 先選擇一個子集, 然后在子集里再選擇最優劃分, 子集的大小一般取屬性的對數.
工程trick
- Q: 什么是過擬合? 發生過擬合有什么解決方法?
- A: 過擬合是指學習器把樣本本身的特性, 譬如噪聲, 也當成了潛在樣本的普遍規律學習了, 導致泛化性能下降的一種現象. 一般表現為在訓練樣本中準確率提高, 但是在測試樣本中準確率降低. 過擬合是無法完全避免的. 一般可以從模型層面和數據層面去緩解. 模型層面我們可以加入正則化項, dropout, batch normalizatin等懲罰因子去緩解. 從數據層面出發我們可以去改進訓練樣本, 讓其更有代表性, 可以清洗數據來減少噪聲, 進行特征篩選, 特征降維等, 在訓練層面可以進行早停止等.
- Q: 樣本不平衡有什么解決方案
- A: 這個得看我們怎么去看待問題. 如果我們把任務作為異常檢測, 那我們可以應用一些One-Class SVM等算法去處理. 如果說我們還是把任務看做為分類問題. 一般來說上采樣, 下采樣和閾值移動的方法. 上采樣是指通過增加正例數目使得正反例數目接近. 這個我們可以通過SMOTE算法來進行插值. 下采樣是指減少反例數目來使得正反例數目接近. 這個我們可以利用EasyEnsemble算法, 將反例劃分為多個與正例數目接近的集合訓練多個學習器, 避免直接丟棄反例導致有用信息丟失. 閾值移動則是給正例反例不同的權值. 不過已有的實踐中, 覺得如果類別極端不平衡, 還是作為異常檢測問題來處理效果比較好.
- Q: 處理的缺失值的方法
- A: 這個得視具體情境而定:
- 首先我們可以看下缺失值的情況. 如果缺失地很厲害, 我們可以考慮直接把這個特征給刪掉.
- 如果只是缺失了一小部分, 直接刪掉的話就會丟失很多有用的信息. 這種情況我們可以將缺失值補全. 一個是均值插補或者同類均值插補. 使用均值或眾數去填補缺失值. 一個方法是建模預測, 用其它特征值去預測缺失值(可以加快訓練速度. 一般缺失特征處于與其它特征完全與直接相關之間的效果比較好). 一個是高維映射, 就是One-hot編碼. 這種做法是最精確的(百度CTR). 然而計算量會大大增加, 而且如果樣本少會過于稀疏, 效果很差.
- 除此之外我印象中還有: 多重插值, 壓縮感知和矩陣補全. 多重插值和蒙特卡洛有些關系. 壓縮感知和奈奎斯特采樣定理有關. 矩陣補全跟半正定規劃有關. 不過沒有實踐過, 只是了解一點.
- 另外, 有些算法是可以直接用有缺失值的樣本的, 例如決策樹, 這種情況我們可以不加處理.
- Q: 為什么我們要做數據歸一化處理
- A:
- 一個是如果特征在數量級上有較大差異, 會使得目標函數僅依賴量級大的特征, 其它特征的信息就丟失了.
- 一個是會導致迭代收斂速度減慢. 因為每一步梯度負方向會偏離最小點方向.
- 還有一些依賴樣本距離的算法對特征的量級很敏感, 不歸一化的話會影響效果.
- Q: 什么情況下不需要進行歸一化處理
- A: 在一些不關心數據的值, 只是關心變量的分布和變量間的條件概率的模型, 可以不做歸一化處理. 例如決策樹, 樸素貝葉斯
- Q: LR和SVM需要進行數據歸一化處理嗎?
- A: LR理論上是可以不做歸一化處理的, 但是如果損失函數太扁, 在迭代時可能不收斂. SVM必須歸一化, 其實本質是由于loss函數不同造成的,SVM用了歐拉距離,如果一個特征的值很大, 會主導了損失函數的變化, 支配了其他的特征。相比之下, LR可以通過權重調整使得損失函數不變。
- Q: 數據歸一化有哪些辦法
- A: 一個是min-max標準化: 直接根據樣本的最大最小值把特征縮放到[0,1]之間. 一個是z-score. 通過特征的期望和標準差來把特征縮放到[0,1]之間; 反余切, 對數法
- Q: 說說常用的包提供了哪些歸一化方法
- A:
- scikit-learn的preprocessing提供了MinMaxScaler, MaxAbsScaler和StandardScaler.
- keras的K包
- Q: 為什么我們要對數據做離散化處理
- A: 特征的性質我們可以分為 定性, 定序, 定量, 定比. 很多時候, 特征的性質是達不到定量和定比的, 甚至達不到定序. 舉個例子一個人喜歡喝50度的熱水不意味著他兩倍喜歡喝100度的熱水. 所以我們要對數據做離散化處理.
- 另外, 離散化還有不少好處. 例如, 增刪方便, 可以進行特征交叉, 計算更快(稀疏矩陣計算快), 能適應異常數據, 引入非線性特性, 可以簡化模型等好處
- Q: 通常什么情況下我們會對數據做正則化. 有哪些包有這個功能?
- A: 一個比較典型的場景是使用點積或核方法計算樣本相似性時, 需要對特征進行這個處理. 做法是對特征的某個范數縮放到1.
- scikit-learn的preprocess 包有Normalizer可以實現這個功能, 支持L1, L2和Max
- Q: 數據預處理有哪些步驟?
- A:
- 處理缺失值
- 處理連續值, 例如離散化
- 二值化和獨熱編碼
- 去掉高相關的列, 可以利用皮爾遜系數
- Q: 機器學習遇到瓶頸, 有什么方法去改善?
- A: 可以從幾個方向去入手.
- 一是基于數據改善性能
- 二是基于算法改善性能
- 三是通過調參改善性能
- 四是借助集成改善性能
- Q: 解釋一下 BatchNormalization?
- A: 用于緩解梯度彌散. 對一個batch的輸入的結果的每一維進行正則化, 然后再進行縮放平移, 表示與原來是一個表達. (1)加速收斂 (2)控制過擬合,可以少用或不用Dropout和正則 (3)降低網絡對初始化權重不敏感 (4)允許使用較大的學習率
- keras的BatchNormalization, 主要有三組參數, 動態均值和動態方差的, 進行縮放平移的beta和gamma(是否使用, 初始化方法和約束). 雜項, 利用ecliption, 動態均值的動量(滑動平均)等.
- Q: 高維數據有哪些處理方法?
- A: 主要有降維技術與特征選擇兩種方法
- Q: 為什么我們要對特征進行降維? 特征降維有哪些方法?
- A: 主要是因為維度災難. 樣本在高維空間稀疏, 計算距離會很困難(除了聚類還有哪些例子?). 主要算法有MDS, 基本思想是讓樣本在低維空間的距離保持不變. 一個是PCA, 讓樣本投影到超平面上. 非線性嵌入可以用Kernal PCA. 流型學習, 例如Isomap(等度量運算), 利用曲面距離(測地線)代替直接計算高維空間的距離. 局部線性嵌入的主要思想則是保持樣本的線性關系.
- PCA: scikit-learn的decomposition包提供 PCA, IncrementalPCA, KernalPCA
- MDS, Isomap: scikit-learn的manifold包
- Q: PCA的目標維度如何設置.
- A: 一般來說這個值是直接指定的, 或者是進行交叉驗證. 或者設置一個重構閾值, 選取選取維度的特征值之和與所有特征值之和的比超過這個閾值.
- Q: 為什么要進行特征選擇.
- A: 一是維度災難. 挑選出重要特征, 后續學習在這小部分特征構建模型能夠減輕維數災難. 二是去掉不相關特征能降低學習任務難度.
- Q: 如何進行特征篩選
- A: 特征選擇主要有過濾式選擇, 包裹式選擇, 嵌入式選擇這幾種.
- 過濾式選擇是先對數據集進行特征選擇, 再訓練學習器. 代表性算法: Relief. 基本思想是與類別有關的特征, 其樣本在這個特征上的分量應該離同類樣本差別盡量小, 與異類樣本差別盡量大. 我們也可以根據特征的方差來識別. 方差越小,
- 包裹式選擇是把學習器的性能作為特征子集的評價標準. 代表性算法: LVW(Las Vegas Wrapper), 基于隨機策略進行子集搜索.
- 隨機森林: 回歸問題采用方差或最小二乘, 分類問題采用信息增益或基尼不純度.
- 關聯特征問題: 是重要的特征有可能得分很低
- 偏向問題: 是這種方法對特征變量類別多的特征越有利
- 穩定性選擇: (是一種基于二次抽樣和選擇算法相結合較新的方法,選擇算法可以是回歸、SVM或其他類似的方法。它的主要思想是在不同的數據子集和特征子集上運行特征選擇算法,不斷的重復,最終匯總特征選擇結果,比如可以統計某個特征被認為是重要特征的頻率(被選為重要特征的次數除以它所在的子集被測試的次數)。理想情況下,重要特征的得分會接近100%。稍微弱一點的特征得分會是非0的數,而最無用的特征得分將會接近于0。)
- 隨機森林: 回歸問題采用方差或最小二乘, 分類問題采用信息增益或基尼不純度.
- 嵌入式選擇是在學習器訓練過程中自動進行特征選擇. 代表性方法: L1正則化.
- scikit-learn的feature_selectin包提供特征選擇類
- 計算特征向量與響應向量的相關性, 皮爾遜系數和互信息系數
- 用每個特征預測響應, 通過準確性來選擇
- 訓練能夠給特征打分的模型, 如隨機森林, 然后選擇打分高的再訓練模型
- 通過特征組合后再來選擇特征:如對用戶id和用戶特征最組合來獲得較大的特征集再來選擇特征,這種做法在推薦系統和廣告系統中比較常見,這也是所謂億級甚至十億級特征的主要來源,原因是用戶數據比較稀疏,組合特征能夠同時兼顧全局模型和個性化模型,這個問題有機會可以展開講。
- 通過深度學習來進行特征選擇:目前這種手段正在隨著深度學習的流行而成為一種手段,尤其是在計算機視覺領域,原因是深度學習具有自動學習特征的能力,這也是深度學習又叫unsupervised feature learning的原因。從深度學習模型中選擇某一神經層的特征后就可以用來進行最終目標模型的訓練了。
- Q: 根據特征數量和樣本數量的關系, 如何選擇分類器?
- A: 若特征數量很大, 可以考慮線性分類器, 如LR, SVM和線性核. 因為樣本在樣本空間稀疏, 很可能是線性可分的. 如果特征數量較少, 可以使用SVM和高斯核, 因為可能不是線性可分的.
- Q: 什么是多重共線性, 怎么發現多重共線性
- A: 多個特征間存在線性相關. 可以通過計算皮爾遜系數, 方差膨脹因子來判斷
- Q: 在回歸模型中, 存在多重共線性, 你如何解決?
- A: 可以去掉一個, 或者在LR, SVM中加上懲罰系數(需確認)
- Q: 什么是鞍點. 如何避免進入鞍點
- A: 鞍點就是一階導數為0, 但二階導數有一個方向不為0的點(需要確認).
- Q: 什么是ill-condition病態問題?
- A: 訓練完的模型,測試樣本稍作修改就會得到差別很大的結果,就是病態問題,模型對未知數據的預測能力很差,即泛化誤差大。