1. 程式人生 > >常見機器學習面試題

常見機器學習面試題

參考:http://kubicode.me/2015/08/16/Machine%20Learning/Common-Interview/?from=singlemessage#

http://blog.csdn.NET/heyongluoyao8/article/details/49429629

http://lib.csdn.Net/article/machinelearning/33798

http://www.cnblogs.com/zuochongyan/p/5407053.html


有監督學習和無監督學習的區別
有監督學習:對具有標記的訓練樣本進行學習,以儘可能對訓練樣本集外的資料進行分類預測。(LR,SVM,BP,RF,GBDT)
無監督學習:對未標記的樣本進行訓練學習,比發現這些樣本中的結構知識。(KMeans,DL)

正則化
正則化是針對過擬合而提出的,以為在求解模型最優的是一般優化最小的經驗風險,現在在該經驗風險上加入模型複雜度這一項(正則化項是模型引數向量的範數),並使用一個rate比率來權衡模型複雜度與以往經驗風險的權重,如果模型複雜度越高,結構化的經驗風險會越大,現在的目標就變為了結構經驗風險的最優化,可以防止模型訓練過度複雜,有效的降低過擬合的風險。
奧卡姆剃刀原理,能夠很好的解釋已知資料並且十分簡單才是最好的模型。

過擬合

如果一味的去提高訓練資料的預測能力,所選模型的複雜度往往會很高,這種現象稱為過擬合。所表現的就是模型訓練時候的誤差很小,但在測試的時候誤差很大。
產生的原因
過擬合原因
1. 樣本資料的問題。

樣本數量太少

抽樣方法錯誤,抽出的樣本資料不能有效足夠代表業務邏輯或業務場景。比如樣本符合正態分佈,卻按均分分佈抽樣,或者樣本資料不能代表整體資料的分佈

樣本里的噪音資料干擾過大

2. 模型問題

模型複雜度高 、引數太多

決策樹模型沒有剪枝

權值學習迭代次數足夠多(Overtraining),擬合了訓練資料中的噪聲和訓練樣例中沒有代表性的特徵.

解決方法

1. 樣本資料方面。

增加樣本數量,對樣本進行降維,新增驗證資料

抽樣方法要符合業務場景

清洗噪聲資料

2. 模型或訓練問題

控制模型複雜度,優先選擇簡單的模型,或者用模型融合技術。

利用先驗知識,新增正則項。L1正則更加容易產生稀疏解、L2正則傾向於讓引數w趨向於0. 

交叉驗證

不要過度訓練,最優化求解時,收斂之前停止迭代。 

決策樹模型沒有剪枝

權值衰減

泛化能力

泛化能力是指模型對未知資料的預測能力

生成模型和判別模型
1. 生成模型:由資料學習聯合概率分佈P(X,Y),然後求出條件概率分佈P(Y|X)作為預測的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。(樸素貝葉斯、Kmeans)
生成模型可以還原聯合概率分佈p(X,Y),並且有較快的學習收斂速度,還可以用於隱變數的學習
2. 判別模型:由資料直接學習決策函式Y=f(X)或者條件概率分佈P(Y|X)作為預測的模型,即判別模型。(k近鄰、決策樹、SVM)
直接面對預測,往往準確率較高,直接對資料在各種程度上的抽象,所以可以簡化模型

線性分類器與非線性分類器的區別以及優劣
如果模型是引數的線性函式,並且存線上性分類面,那麼就是線性分類器,否則不是。
常見的線性分類器有:LR,貝葉斯分類,單層感知機、線性迴歸
常見的非線性分類器:決策樹、RF、GBDT、多層感知機
SVM兩種都有(看線性核還是高斯核)
線性分類器速度快、程式設計方便,但是可能擬合效果不會很好
非線性分類器程式設計複雜,但是效果擬合能力強

特徵比資料量還大時,選擇什麼樣的分類器?
線性分類器,因為維度高的時候,資料一般在維度空間裡面會比較稀疏,很有可能線性可分
對於維度很高的特徵,你是選擇線性還是非線性分類器?
理由同上
對於維度極低的特徵,你是選擇線性還是非線性分類器?
非線性分類器,因為低維空間可能很多特徵都跑到一起了,導致線性不可分

下面是吳恩達的見解:
1. 如果Feature的數量很大,跟樣本數量差不多,這時候選用LR或者是Linear Kernel的SVM
2. 如果Feature的數量比較小,樣本數量一般,不算大也不算小,選用SVM+Gaussian Kernel
3. 如果Feature的數量比較小,而樣本數量很多,需要手工新增一些feature變成第一種情況

ill-condition病態問題
訓練完的模型測試樣本稍作修改就會得到差別很大的結果,就是病態問題(這簡直是不能用啊)

L1和L2正則的區別,如何選擇L1和L2正則
http://blog.csdn.net/xbmatrix/article/details/61624196

他們都是可以防止過擬合,降低模型複雜度
L1是在loss function後面加上 模型引數的1範數(也就是|xi|)
L2是在loss function後面加上 模型引數的2範數(也就是sigma(xi^2)),注意L2範數的定義是sqrt(sigma(xi^2)),在正則項上沒有新增sqrt根號是為了更加容易優化
L1 會產生稀疏的特徵
L2 會產生更多地特徵但是都會接近於0
L1會趨向於產生少量的特徵,而其他的特徵都是0,而L2會選擇更多的特徵,這些特徵都會接近於0。L1在特徵選擇時候非常有用,而L2就只是一種規則化而已。

L1求解

最小角迴歸演算法:LARS演算法

越小的引數說明模型越簡單
過擬合的,擬合會經過曲面的每個點,也就是說在較小的區間裡面可能會有較大的曲率,這裡的導數就是很大,線性模型裡面的權值就是導數,所以越小的引數說明模型越簡單。

為什麼一些機器學習模型需要對資料進行歸一化?

http://blog.csdn.net/xbmatrix/article/details/56695825

歸一化化就是要把你需要處理的資料經過處理後(通過某種演算法)限制在你需要的一定範圍內。
1)歸一化後加快了梯度下降求最優解的速度。等高線變得顯得圓滑,在梯度下降進行求解時能較快的收斂。如果不做歸一化,梯度下降過程容易走之字,很難收斂甚至不能收斂
2)把有量綱表示式變為無量綱表示式, 有可能提高精度。一些分類器需要計算樣本之間的距離(如歐氏距離),例如KNN。如果一個特徵值域範圍非常大,那麼距離計算就主要取決於這個特徵,從而與實際情況相悖(比如這時實際情況是值域範圍小的特徵更重要)

3) 邏輯迴歸等模型先驗假設資料服從正態分佈。

哪些機器學習演算法不需要做歸一化處理?

概率模型不需要歸一化,因為它們不關心變數的值,而是關心變數的分佈和變數之間的條件概率,如決策樹、rf。而像adaboost、gbdt、xgboost、svm、lr、KNN、KMeans之類的最優化問題就需要歸一化。

特徵向量的歸一化方法

線性函式轉換,表示式如下:y=(x-MinValue)/(MaxValue-MinValue)

對數函式轉換,表示式如下:y=log10 (x)

反餘切函式轉換 ,表示式如下:y=arctan(x)*2/PI

減去均值,乘以方差:y=(x-means)/ variance

標準化與歸一化的區別
簡單來說,標準化是依照特徵矩陣的列處理資料,其通過求z-score的方法,將樣本的特徵值轉換到同一量綱下。歸一化是依照特徵矩陣的行處理資料,其目的在於樣本向量在點乘運算或其他核函式計算相似性時,擁有統一的標準,也就是說都轉化為“單位向量”。規則為l2的歸一化公式如下:


特徵向量的缺失值處理
1. 缺失值較多.直接將該特徵捨棄掉,否則可能反倒會帶入較大的noise,對結果造成不良影響。
2. 缺失值較少,其餘的特徵缺失值都在10%以內,我們可以採取很多的方式來處理:

1) 把NaN直接作為一個特徵,假設用0表示;

2) 用均值填充;

3) 用隨機森林等演算法預測填充

隨機森林如何處理缺失值(http://charleshm.github.io/2016/03/Random-Forest-Tricks/)

方法一(na.roughfix)簡單粗暴,對於訓練集,同一個class下的資料,如果是分類變數缺失,用眾數補上,如果是連續型變數缺失,用中位數補。
方法二(rfImpute)這個方法計算量大,至於比方法一好壞?不好判斷。先用na.roughfix補上缺失值,然後構建森林並計算proximity matrix,再回頭看缺失值,如果是分類變數,則用沒有缺失的觀測例項的proximity中的權重進行投票。如果是連續型變數,則用proximity矩陣進行加權平均的方法補缺失值。然後迭代4-6次,這個補缺失值的思想和KNN有些類似12。

隨機森林如何評估特徵重要性(http://charleshm.github.io/2016/03/Random-Forest-Tricks/)

衡量變數重要性的方法有兩種,Decrease GINI 和 Decrease Accuracy:
1) Decrease GINI: 對於迴歸問題,直接使用argmax(Var−VarLeft−VarRight)作為評判標準,即當前節點訓練集的方差Var減去左節點的方差VarLeft和右節點的方差VarRight。
2) Decrease Accuracy:對於一棵樹Tb(x),我們用OOB樣本可以得到測試誤差1;然後隨機改變OOB樣本的第j列:保持其他列不變,對第j列進行隨機的上下置換,得到誤差2。至此,我們可以用誤差1-誤差2來刻畫變數j的重要性。基本思想就是,如果一個變數j足夠重要,那麼改變它會極大的增加測試誤差;反之,如果改變它測試誤差沒有增大,則說明該變數不是那麼的重要。

優化Kmeans
使用kd樹或者ball tree(這個樹不懂)
將所有的觀測例項構建成一顆kd樹,之前每個聚類中心都是需要和每個觀測點做依次距離計算,現在這些聚類中心根據kd樹只需要計算附近的一個區域性區域即可

KMeans初始類簇中心點的選取
k-means++演算法選擇初始seeds的基本思想就是:初始的聚類中心之間的相互距離要儘可能的遠。
1. 從輸入的資料點集合中隨機選擇一個點作為第一個聚類中心
2. 對於資料集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x)
3. 選擇一個新的資料點作為新的聚類中心,選擇的原則是:D(x)較大的點,被選取作為聚類中心的概率較大
4. 重複2和3直到k個聚類中心被選出來
5. 利用這k個初始的聚類中心來執行標準的k-means演算法

解釋對偶的概念
一個優化問題可以從兩個角度進行考察,一個是primal 問題,一個是dual 問題,就是對偶問題,一般情況下對偶問題給出主問題最優值的下界,在強對偶性成立的情況下由對偶問題可以得到主問題的最優下界,對偶問題是凸優化問題,可以進行較好的求解,SVM中就是將primal問題轉換為dual問題進行求解,從而進一步引入核函式的思想。
如何進行特徵選擇?
特徵選擇是一個重要的資料預處理過程,主要有兩個原因:一是減少特徵數量、降維,使模型泛化能力更強,減少過擬合;二是增強對特徵和特徵值之間的理解
常見的特徵選擇方式:
  1. 去除方差較小的特徵
  2. 正則化。1正則化能夠生成稀疏的模型。L2正則化的表現更加穩定,由於有用的特徵往往對應係數非零。
  3. 隨機森林,對於分類問題,通常採用基尼不純度或者資訊增益,對於迴歸問題,通常採用的是方差或者最小二乘擬合。一般不需要feature engineering、調參等繁瑣的步驟。它的兩個主要問題,1是重要的特徵有可能得分很低(關聯特徵問題),2是這種方法對特徵變數類別多的特徵越有利(偏向問題)。
  4. 穩定性選擇。是一種基於二次抽樣和選擇演算法相結合較新的方法,選擇演算法可以是迴歸、SVM或其他類似的方法。它的主要思想是在不同的資料子集和特徵子集上執行特徵選擇演算法,不斷的重複,最終彙總特徵選擇結果,比如可以統計某個特徵被認為是重要特徵的頻率(被選為重要特徵的次數除以它所在的子集被測試的次數)。理想情況下,重要特徵的得分會接近100%。稍微弱一點的特徵得分會是非0的數,而最無用的特徵得分將會接近於0。

資料預處理

  1. 缺失值,填充缺失值fillna:
    1. 離散:None,
    2. 連續:均值。
    3. 缺失值太多,則直接去除該列
  2. 連續值:離散化。有的模型(如決策樹)需要離散值
  3. 對定量特徵二值化。核心在於設定一個閾值,大於閾值的賦值為1,小於等於閾值的賦值為0。如影象操作
  4. 皮爾遜相關係數,去除高度相關的列
#correlation matrix
corrmat = df_train.corr()
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True);
  1. 去除噪聲點。通過matplotlib.scatter函式圖示某一特徵與預測特徵的點分佈圖,明顯看出噪聲點,去除即可
#bivariate analysis saleprice/grlivarea
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));

df_train.sort_values(by = 'GrLivArea', ascending = False)[:2]
df_train = df_train.drop(df_train[df_train['Id'] == 1299].index)
df_train = df_train.drop(df_train[df_train['Id'] == 524].index)
  1. 標籤編碼,把字元類別特徵編碼成數值型別,如紅綠藍編碼為0、1、2
  2. 歸一化。將資料按比例縮放,使這些資料落入到一個較小的特定的區間之內。
    1. 最小最大縮放
    2. b.Z-score標準化。讓資料服從基於 μ=0 和 σ=1的標準正態分佈
  3. OneHot編碼get_dummies。有的離散特徵如顏色需OneHot編碼,編碼後需特徵對齊,因為進行one-hot編碼後,會出現一種情況就是:某個特徵的某一個取值只出現在訓練集中,沒有出現在測試集中,或者相反
  4. 產生K折交叉資料集:sklearn.cross_validation.KFold
  5. 填充均值前,通過對數運算修正資料基本符合正態分佈
    1. 檢視目標資料統計,count,mean, min, max, std

      #descriptive statistics summary
      df_train['SalePrice'].describe()
    2. 檢視目標資料直方圖分佈,。如果類似正態分佈,計算偏離正態分佈程度:偏度和峰度

      #histogram
      sns.distplot(df_train['SalePrice']);
      #log transform skewed numeric features:
      numeric_feats = all_data.dtypes[all_data.dtypes != "object"].index
      
      skewed_feats = train[numeric_feats].apply(lambda x: skew(x.dropna())) #compute skewness
      skewed_feats = skewed_feats[skewed_feats > 0.75]
      skewed_feats = skewed_feats.index
      
      all_data[skewed_feats] = np.log1p(all_data[skewed_feats])

最小最大縮放:
當使用基於距離的演算法時,我們必須嘗試將資料縮放,這樣較不重要的特徵不會因為自身較大的範圍而主導目標函式。如KNN。
在邏輯迴歸中,每個特徵都被分配了權重或係數(Wi)。如果某個特徵有相對來說比較大的範圍,而且其在目標函式中無關緊要,那麼邏輯迴歸模型自己就會分配一個非常小的值給它的係數,從而中和該特定特徵的影響優勢,而基於距離的方法,如KNN,沒有這樣的內建策略,因此需要縮放。
Z-score標準化:
很多的機器學習技巧/模型(例如L1,L2正則項,向量空間模型-Vector Space Model,歐幾里得距離測量的KNN、k-均值、SVM、感知器、神經網路、線性判別分析、主成分分析)都基於這樣的假設:所有的屬性取值都差不多是以0為均值且取值範圍相近的,標準化資料幫助我們提高預測模型的精度。
備註:在縮放和標準化中二選一是個令人困惑的選擇,你必須對資料和要使用的學習模型有更深入的理解,才能做出決定。對於初學者,你可以兩種方法都嘗試下並通過交叉驗證精度來做出選擇。

什麼是偏差與方差?

泛化誤差可以分解成偏差的平方加上方差加上噪聲。偏差度量了學習演算法的期望預測和真實結果的偏離程度,刻畫了學習演算法本身的擬合能力,方差度量了同樣大小的訓練集的變動所導致的學習效能的變化,刻畫了資料擾動所造成的影響,噪聲表達了當前任務上任何學習演算法所能達到的期望泛化誤差下界,刻畫了問題本身的難度。偏差和方差一般稱為biasvariance,一般訓練程度越強,偏差越小,方差越大,泛化誤差一般在中間有一個最小值,如果偏差較大,方差較小,此時一般稱為欠擬合,而偏差較小,方差較大稱為過擬合。

偏差:

方差:

解決bias和Variance問題的方法: 交叉驗證
High bias解決方案:Boosting、複雜模型(非線性模型、增加神經網路中的層)、更多特徵
High Variance解決方案:agging、簡化模型、降維

採用 EM 演算法求解的模型有哪些,為什麼不用牛頓法或梯度下降法?
用EM演算法求解的模型一般有GMM或者協同過濾,k-means其實也屬於EM。EM演算法一定會收斂,但是可能收斂到區域性最優。由於求和的項數將隨著隱變數的數目指數上升,會給梯度計算帶來麻煩。

SVM、LR、決策樹的對比?
模型複雜度:SVM支援核函式,可處理線性非線性問題;LR模型簡單,訓練速度快,適合處理線性問題;決策樹容易過擬合,需要進行剪枝
損失函式:SVM hinge loss; LR L2正則化; adaboost 指數損失
資料敏感度:SVM新增容忍度對outlier不敏感,只關心支援向量,且需要先做歸一化; LR對遠點敏感
資料量:資料量大就用LR,資料量小且特徵少就用SVM非線性核

GBDT 和隨機森林的區別?
隨機森林採用的是bagging的思想,bagging又稱為bootstrap aggreagation,通過在訓練樣本集中進行有放回的取樣得到多個取樣集,基於每個取樣集訓練出一個基學習器,再將基學習器結合。隨機森林在對決策樹進行bagging的基礎上,在決策樹的訓練過程中引入了隨機屬性選擇。傳統決策樹在選擇劃分屬性的時候是在當前節點屬性集合中選擇最優屬性,而隨機森林則是對結點先隨機選擇包含k個屬性的子集,再選擇最有屬性,k作為一個引數控制了隨機性的引入程度。
另外,GBDT訓練是基於Boosting思想,每一迭代中根據錯誤更新樣本權重,因此是序列生成的序列化方法,而隨機森林是bagging的思想,因此是並行化方法。
xgboost怎麼給特徵評分? 在訓練的過程中,通過Gini指數選擇分離點的特徵,一個特徵被選中的次數越多,那麼該特徵評分越高。
# feature importance
print(model.feature_importances_)
# plot
pyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)
pyplot.show()
==========
# plot feature importance
plot_importance(model)
pyplot.show()
什麼是OOB?隨機森林中OOB是如何計算的,它有什麼優缺點? bagging方法中Bootstrap每次約有1/3的樣本不會出現在Bootstrap所採集的樣本集合中,當然也就沒有參加決策樹的建立,把這1/3的資料稱為袋外資料oob(out of bag),它可以用於取代測試集誤差估計方法。
袋外資料(oob)誤差的計算方法如下:
對於已經生成的隨機森林,用袋外資料測試其效能,假設袋外資料總數為O,用這O個袋外資料作為輸入,帶進之前已經生成的隨機森林分類器,分類器會給出O個數據相應的分類,因為這O條資料的型別是已知的,則用正確的分類與隨機森林分類器的結果進行比較,統計隨機森林分類器分類錯誤的數目,設為X,則袋外資料誤差大小=X/O;這已經經過證明是無偏估計的,所以在隨機森林演算法中不需要再進行交叉驗證或者單獨的測試集來獲取測試集誤差的無偏估計。

解釋置信區間 置信區間不能用貝葉斯學派的概率來描述,它屬於頻率學派的範疇。真值要麼在,要麼不在。由於在頻率學派當中,真值是一個常數,而非隨機變數(後者是貝葉斯學派),所以我們不對真值做概率描述。比如,95%置信區間,並不是真值在這個區間內的概率是95%,而應該為100次隨機抽樣中構造的100個區間如果95次包含了引數真值,那麼置信度為95%。
監督學習一般使用兩種型別的目標變數:標稱型和數值型
標稱型:標稱型目標變數的結果只在有限目標集中取值,如真與假(標稱型目標變數主要用於分類)
數值型:數值型目標變數則可以從無限的數值集合中取值,如0.100,42.001等 (數值型目標變數主要用於迴歸分析)
為什麼說樸素貝葉斯是高偏差低方差
它簡單的假設了各個特徵之間是無關的,是一個被嚴重簡化了的模型。所以,對於這樣一個簡單模型,大部分場合都會bias部分大於variance部分,也就是高偏差,低方差