數據挖掘筆試面試(6)
【校招面經】機器學習與數據挖掘常見面試題整理 part1
2018年07月23日 00:12:13 稻蛙 閱讀數:938註:以下是本人春招時看面經時收集的常見面試題,答案部分是由網上多個信息源整理而成,部分是個人解答。當時整理時只是自己看的,很多沒有註明來源地址,後續有時間補上來源,如有侵權請告知。
一、PCA為什麽要中心化
因為要算協方差。
單純的線性變換只是產生了倍數縮放,無法消除量綱對協方差的影響,而協方差是為了讓投影後方差最大。
二、PCA的主成分是什麽
在統計學中,主成分分析(PCA)是一種簡化數據集的技術。它是一個線性變換。這個變換把數據變換到一個新的坐標系統中,使得任何數據投影的第一大方差在第一個坐標(稱為第一主成分)上,第二大方差在第二個坐標(第二主成分)上,依次類推。主成分分析經常用減少數據集的維數,同時保持數據集的對方差貢獻最大的特征。這是通過保留低階主成分,忽略高階主成分做到的。這樣低階成分往往能夠保留住數據的最重要方面。但是,這也不是一定的,要視具體應用而定。
主成分分析的原理是設法將原來變量重新組合成一組新的相互無關的幾個綜合變量,同時根據實際需要從中可以取出幾個較少的綜合變量盡可能多地反映原來變量的信息的統計方法叫做主成分分析或稱主分量分析,也是數學上處理降維的一種方法。主成分分析是設法將原來眾多具有一定相關性(比如P個指標),重新組合成一組新的互相無關的綜合指標來代替原來的指標。通常數學上的處理就是將原來P個指標作線性組合,作為新的綜合指標。最經典的做法就是用F1(選取的第一個線性組合,即第一個綜合指標)的方差來表達,即Va(rF1)越大,表示F1包含的信息越多。因此在所有的線性組合中選取的F1應該是方差最大的,故稱F1為第一主成分。如果第一主成分不足以代表原來P個指標的信息,再考慮選取F2即選第二個線性組合,為了有效地反映原來信息,F1已有的信息就不需要再出現再F2中,用數學語言表達就是要求Cov(F1,F2)=0,則稱F2為第二主成分,依此類推可以構造出第三、第四,……,第P個主成分。
三、為什麽KNN可以避免樣本不平衡
KNN只是取了最近的幾個樣本點做平均而已,離預測數據較遠的訓練數據對預測結果不會造成影響,但是svm、Bayes和NN每一個訓練樣本果都會對預測結果產生影響,於是如果樣本不平衡的話KNN的效果最好,舉個極端一點例子:答案只有A與B,但是訓練樣本中A的個數占99%,而B只有1%,svm、Bayes和NN訓練出來的結果,恐怕預測任何數據給出的答案都是A,但是KNN不會。
四、Padding,Kernel-size,stride關系公式
像素寬度W,
Padding size:P,
Kernel size:K,
Stride : S,
n表示輪次,
公式為:Wn+1=(Wn+P∗2−K)/S+1
五、gini
信息增益偏向於多值屬性。盡管增益率調整了這種偏倚,但是它傾向於產生不平衡的劃分,其中一個分區比其他分區小得多。基尼指數偏向於多值屬性,並且當類的數量很大時會有困難。它還傾向於導致相等大小的分區和純度。盡管是有偏的,但是這些度量在實踐中產生相當好的結果。
六、kmeans初始點的選擇
1. 選擇批次距離盡可能遠的K個點
首先隨機選擇一個點作為第一個初始類簇中心點,然後選擇距離該點最遠的那個點作為第二個初始類簇中心點,然後再選擇距離前兩個點的最近距離最大的點作為第三個初始類簇的中心點,以此類推,直至選出K個初始類簇中心點。
2. 選用層次聚類或者Canopy算法進行初始聚類,然後利用這些類簇的中心點作為KMeans算法初始類簇中心點。
常用的層次聚類算法有BIRCH和ROCK,在此不作介紹,下面簡單介紹一下Canopy算法,主要摘自Mahout的Wiki:
首先定義兩個距離T1和T2,T1>T2.從初始的點的集合S中隨機移除一個點P,然後對於還在S中的每個點I,計算該點I與點P的距離,如果距離小於T1,則將點I加入到點P所代表的Canopy中,如果距離小於T2,則將點I從集合S中移除,並將點I加入到點P所代表的Canopy中。叠代完一次之後,重新從集合S中隨機選擇一個點作為新的點P,然後重復執行以上步驟。
Canopy算法執行完畢後會得到很多Canopy,可以認為每個Canopy都是一個Cluster,與KMeans等硬劃分算法不同,Canopy的聚類結果中每個點有可能屬於多個Canopy。我們可以選擇距離每個Canopy的中心點最近的那個數據點,或者直接選擇每個Canopy的中心點作為KMeans的初始K個類簇中心點。
七、kmeans++
k-means++算法選擇初始seeds的基本思想就是:初始的聚類中心之間的相互距離要盡可能的遠。 1. 從輸入的數據點集合中隨機選擇一個點作為第一個聚類中心 2. 對於數據集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x) 3. 選擇一個新的數據點作為新的聚類中心,選擇的原則是:D(x)較大的點,被選取作為聚類中心的概率較大 4. 重復2和3直到k個聚類中心被選出來 5. 利用這k個初始的聚類中心來運行標準的k-means算法
八、xgb中的貢獻度(importance)是什麽
根據結構分數的增益情況計算出來選擇哪個特征的哪個分割點,某個特征的重要性,就是它在所有樹中出現的次數之和。
(樹模型特征重要性評估可參考:https://blog.csdn.net/u013382288/article/details/80838732)
九、xgboost怎麽處理缺失值
xgboost處理缺失值的方法和其他樹模型不同,xgboost把缺失值當做稀疏矩陣來對待,本身的在節點分裂時不考慮的缺失值的數值。缺失值數據會被分到左子樹和右子樹分別計算損失,選擇較優的那一個。如果訓練中沒有數據缺失,預測時出現了數據缺失,那麽默認被分類到右子樹。
十、xgb和lgb的區別
- xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,區別是xgboost對每一層所有節點做無差別分裂,可能有些節點的增益非常小,對結果影響不大,但是xgboost也進行了分裂,帶來了務必要的開銷。 leaft-wise的做法是在當前所有葉子節點中選擇分裂收益最大的節點進行分裂,如此遞歸進行,很明顯leaf-wise這種做法容易過擬合,因為容易陷入比較高的深度中,因此需要對最大深度做限制,從而避免過擬合。
- lightgbm使用了基於histogram的決策樹算法,這一點不同與xgboost中的 exact 算法,histogram算法在內存和計算代價上都有不小優勢。
- 內存上優勢:很明顯,直方圖算法的內存消耗為(#data* #features * 1Bytes)(因為對特征分桶後只需保存特征離散化之後的值),而xgboost的exact算法內存消耗為:(2 * #data * #features* 4Bytes),因為xgboost既要保存原始feature的值,也要保存這個值的順序索引,這些值需要32位的浮點數來保存。
- 計算上的優勢,預排序算法在選擇好分裂特征計算分裂收益時需要遍歷所有樣本的特征值,時間為(#data),而直方圖算法只需要遍歷桶就行了,時間為(#bin)
- 直方圖做差加速
- 一個子節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算。
- lightgbm支持直接輸入categorical的feature
- 在對離散特征分裂時,每個取值都當作一個桶,分裂時的增益算的是”是否屬於某個category“的gain。類似於one-hot編碼。
- 但實際上xgboost的近似直方圖算法也類似於lightgbm這裏的直方圖算法,為什麽xgboost的近似算法比lightgbm還是慢很多呢?
- xgboost在每一層都動態構建直方圖, 因為xgboost的直方圖算法不是針對某個特定的feature,而是所有feature共享一個直方圖(每個樣本的權重是二階導),所以每一層都要重新構建直方圖,而lightgbm中對每個特征都有一個直方圖,所以構建一次直方圖就夠了。
- lightgbm做了cache優化
- feature parallel:一般的feature parallel就是對數據做垂直分割(partiion data vertically,就是對屬性分割),然後將分割後的數據分散到各個workder上,各個workers計算其擁有的數據的best splits point, 之後再匯總得到全局最優分割點。但是lightgbm說這種方法通訊開銷比較大,lightgbm的做法是每個worker都擁有所有數據,再分割?(沒懂,既然每個worker都有所有數據了,再匯總有什麽意義?這個並行體現在哪裏??)
- data parallel:傳統的data parallel是將對數據集進行劃分,也叫 平行分割(partion data horizontally), 分散到各個workers上之後,workers對得到的數據做直方圖,匯總各個workers的直方圖得到全局的直方圖。 lightgbm也claim這個操作的通訊開銷較大,lightgbm的做法是使用”Reduce Scatter“機制,不匯總所有直方圖,只匯總不同worker的不同feature的直方圖(原理?),在這個匯總的直方圖上做split,最後同步。
十一、xgb的gamma,alpha,lambda等參數
1. alpha[默認1]權重的L1正則化項。(和Lasso regression類似)。 可以應用在很高維度的情況下,使得算法的速度更快。
2. lambda權重的L2正則化項(和Ridge regression類似)。 這個參數是用來控制XGBoost的正則化部分的 3. gamma[默認0]在節點分裂時,只有分裂後損失函數的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函數下降值。 這個參數的值越大,算法越保守。
xgboost尋找分割點的標準是最大化gain. 考慮傳統的枚舉每個特征的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然後從候選者中計算Gain按最大值找出最佳的分割點。它的計算公式分為四項, 可以由正則化項參數調整(lamda為葉子權重平方和的系數, gama為葉子數量): 第一項是假設分割的左孩子的權重分數, 第二項為右孩子, 第三項為不分割總體分數, 最後一項為引入一個節點的復雜度損失 由公式可知, gamma越大gain越小, lamda越大, gain可能小也可能大
十二、rf與gbdt之間的區別
1)相同點:都是由多棵樹組成,最終的結果都是由多棵樹一起決定。 2)不同點: a 組成隨機森林的樹可以分類樹也可以是回歸樹,而GBDT只由回歸樹組成 b 組成隨機森林的樹可以並行生成,而GBDT是串行生成 c 隨機森林的結果是多數表決表決的,而GBDT則是多棵樹累加之和 d 隨機森林對異常值不敏感,而GBDT對異常值比較敏感 e 隨機森林是減少模型的方差,而GBDT是減少模型的偏差 f 隨機森林不需要進行特征歸一化。而GBDT則需要進行特征歸一化
十三、nlp中常用的距離
1. 萊文斯坦距離:萊文斯坦距離(LD)用於衡量兩個字符串之間的相似度。 以下我們稱這兩個字符串分別為 a (原字符串) 和 b (目標字符串)。萊文斯坦距離被定義為‘‘將字符串 a 變換為字符串 b 所需的刪除、插入、替換操作的次數‘‘。
十四、lr與dt的區別
1. lr是線性的,dt可以處理非線性
2. lr不能有缺失值,dt可以缺失值
3. dt是貪心的,可能陷入局部最優
4. lr特征一定要標準化,dt可以不用
5. lr特征間要盡量獨立,dt無所謂
十五、lr損失函數
十六、lr和svm的區別
1. svm只由支持向量絕對劃分平面,lr是所有樣本都參與決策面的更新
2. svm對異常值不敏感,更穩健
十七、為什麽gbdt需要歸一化
1. 自身是梯度的過程,歸一化加快收斂
2. 避免給樣本加權的時候過度偏向一些範圍大的特征的樣本
十八、gbdt和xgb的差異
1.損失函數是用泰勒展式二項逼近,而不是像gbdt裏的就是一階導數 2.對樹的結構進行了正則化約束,防止模型過度復雜,降低了過擬合的可能性 3.節點分裂的方式不同,gbdt是用的gini系數,xgboost是經過優化推導後的gain 引用自:@Xijun LI
十九、熵與gini
既然這兩個都可以表示數據的不確定性,不純度。那麽這兩個有什麽區別那?
1. Gini 指數的計算不需要對數運算,更加高效;
2. Gini 指數更偏向於連續屬性,熵更偏向於離散屬性。
二十、正負樣本失衡問題
1. 上下采樣方法,會影響樣本的分布。上采樣可以用SMOTE。
2. 正樣本比較少,可以把負樣本分成多個,每個和正樣本訓練一個模型,然後把多個模型ensemble
3. 公交卡發現小偷的案例(https://blog.csdn.net/u013382288/article/details/79301372),正負樣本嚴重不平衡,那麽先聚類,把正常的類拿掉,用剩下可能異常的樣本訓練模型
二十一、余弦距離與歐式距離求相似度的差別
1. 歐氏距離能夠體現個體數值特征的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用用戶行為指標分析用戶價值的相似度或差異。
余弦距離更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用用戶對內容評分來區分興趣的相似度和差異,同時修正了用戶間可能存在的度量標準不統一的問題(因為余弦距離對絕對數值不敏感)。
2. 從幾何意義上來說,n維向量空間的一條線段作為底邊和原點組成的三角形,其頂角大小是不確定的。也就是說對於兩條空間向量,即使兩點距離一定,他們的夾角余弦值也可以隨意變化。
感性的認識,當兩用戶評分趨勢一致時,但是評分值差距很大,余弦相似度傾向給出更優解。舉個極端的例子,兩用戶只對兩件商品評分,向量分別為(3,3)和(5,5),這兩位用戶的認知其實是一樣的,但是歐式距離給出的解顯然沒有余弦值合理。
3. 余弦夾角可以有效規避個體相同認知中不同程度的差異表現,更註重維度之間的差異,而不註重數值上的差異;反過來思考,當向量夾角的余弦值較小(差異很大)時,歐氏距離可以很小(差異很小),如(0,1)和(1,0)兩個點,所以如果要對電子商務用戶做聚類,區分高價值用戶和低價值用戶,用消費次數和平均消費額,這個時候用余弦夾角是不恰當的,因為它會將(2,10)和(10,50)的用戶算成相似用戶,但顯然後者的價值高得多,因為這個時候需要註重數值上的差異,而不是維度之間的差異。
二十二、優化kmeans計算速度
使用kd樹或者ball tree 將所有的觀測實例構建成一顆kd樹,之前每個聚類中心都是需要和每個觀測點做依次距離計算,現在這些聚類中心根據kd樹只需要計算附近的一個局部區域即可
二十三、協同過濾與聚類推薦的區別
1. 原理上:協同過濾實際上是圖的搜索算法,找到某個節點的鄰域;聚類是圖的分解算法,將節點分入幾個類中
2. 使用上:協同過濾可以得到推薦排序,千人千面;聚類得到的是千人k面
3. 如果只使用人的屬性或物品的屬性,聚類可以冷啟動,協同過濾不行
4. 計算上:協同過濾計算量大,大數據集下聚類會快一些。可以結合兩者做,如先對用戶進行聚類,然後用聚類代表做協同過濾
二十四、為什麽lr用sigmoid
1. 因為是二分類問題,認為分類滿足伯努利分布
2. 求導快
3. 值域[0-1],單調遞增
二十五、為什麽xgboost要用泰勒展開,優勢在哪裏?
xgboost使用了一階和二階偏導, 二階導數有利於梯度下降的更快更準. 使用泰勒展開取得函數做自變量的二階導數形式, 可以在不選定損失函數具體形式的情況下, 僅僅依靠輸入數據的值就可以進行葉子分裂優化計算, 本質上也就把損失函數的選取和模型算法優化/參數選擇分開了. 這種去耦合增加了xgboost的適用性, 使得它按需選取損失函數, 可以用於分類, 也可以用於回歸。
二十六、為什麽l1容易得到0解,l2容易得到更多接近0的解
1. 圖像法解釋
可以看到,L1-ball 與L2-ball 的不同就在於L1在和每個坐標軸相交的地方都有“角”出現,而目標函數的測地線除非位置擺得非常好,大部分時候都會在角的地方相交。註意到在角的位置就會產生稀疏性,例如圖中的相交點就有w1=0,而更高維的時候(想象一下三維的L1-ball 是什麽樣的?)除了角點以外,還有很多邊的輪廓也是既有很大的概率成為第一次相交的地方,又會產生稀疏性。
相比之下,L2-ball 就沒有這樣的性質,因為沒有角,所以第一次相交的地方出現在具有稀疏性的位置的概率就變得非常小了。這就從直觀上來解釋了為什麽L1-regularization 能產生稀疏性,而L2-regularization 不行的原因了。
總結:L1會趨向於產生少量的特征,而其他的特征都是0,而L2會選擇更多的特征,這些特征都會接近於0。Lasso在特征選擇時候非常有用,而Ridge就只是一種規則化而已。
2. 導數法解釋:L1和L2的差別,為什麽一個讓絕對值最小,一個讓平方最小,會有那麽大的差別呢?看導數一個是1一個是w便知, 在靠進零附近, L1以勻速下降到零, 而L2則完全停下來了. 這說明L1是將不重要的特征(或者說, 重要性不在一個數量級上)盡快剔除, L2則是把特征貢獻盡量壓縮最小但不至於為零. 兩者一起作用, 就是把重要性在一個數量級(重要性最高的)的那些特征一起平等共事(簡言之, 不養閑人也不要超人)。
二十七、為什麽ReLu要好過於tanh和sigmoid function
第一,采用sigmoid等函數,算激活函數時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法,計算量相對大,而采用Relu激活函數,整個過程的計算量節省很多。
第二,對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成信息丟失,參見@Haofeng Li 答案的第三點),從而無法完成深層網絡的訓練。
第三,Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關系,緩解了過擬合問題的發生
作者:Begin Again
鏈接:https://www.zhihu.com/question/29021768/answer/43488153
二十八、梯度提升方法Gradient Boosting
梯度提升算法初看起來不是很好理解,但我們和線性回歸加以類比就容易了。回憶一下線性回歸是希望找到一組參數使得殘差最小化。如果只用一次項來解釋二次曲線一定會有大量殘差留下來,此時就可以用二次項來繼續解釋殘差,所以可在模型中加入這個二次項。
同樣的,梯度提升是先根據初始模型計算偽殘差,之後建立一個基學習器來解釋偽殘差,該基學習器是在梯度方向上減少殘差。再將基學習器乘上權重系數(學習速率)和原來的模型進行線性組合形成新的模型。這樣反復叠代就可以找到一個使損失函數的期望達到最小的模型。在訓練基學習器時可以使用再抽樣方法,此時就稱之為隨機梯度提升算法stochastic gradient boosting。
二十九、隨機梯度下降
1. target function一般是用估計出的模型計算所有訓練數據估計label和真實label的差距之和,隨機梯度就是隨機取樣一些訓練數據,替代整個訓練集,在其上作target function的梯度下降。
2. 因為只用少量樣本,所以每一次比較快
3. 比梯度下降更能應付鞍點問題
三十、隨機森林如何評估特征重要性
衡量變量重要性的方法有兩種,Decrease GINI 和 Decrease Accuracy: 1) Decrease GINI: 對於回歸問題,直接使用argmax(VarVarLeftVarRight)作為評判標準,即當前節點訓練集的方差Var減去左節點的方差VarLeft和右節點的方差VarRight。 2) Decrease Accuracy:對於一棵樹Tb(x),我們用OOB樣本可以得到測試誤差1;然後隨機改變OOB樣本的第j列:保持其他列不變,對第j列進行隨機的上下置換,得到誤差2。至此,我們可以用誤差1-誤差2來刻畫變量j的重要性。基本思想就是,如果一個變量j足夠重要,那麽改變它會極大的增加測試誤差;反之,如果改變它測試誤差沒有增大,則說明該變量不是那麽的重要
數據挖掘筆試面試(6)