機器學習數據挖掘面試

欠擬合:模型太簡單了,特徵是否過少
過擬合:增加樣本量,減少特徵數,降低模型複雜度等

L1正則化其實就是講權值的絕對值和加入損失函數,使得權值中0值比重增大,因此得到的權值較爲稀疏。L2正則化則是將權重的平方和加入損失函數,使得權值分佈更加平均,所以權值較爲平滑。

ROC曲線的AUC值是比較重要的內容,要能知道具體ROC曲線是怎麼畫出來的。迴歸的話比如MSE,RMSE或和業務相關的加權計算公式等。

數據如何清洗,怎麼處理缺失值?

數據清洗主要還是通過分析數據的統計信息、分佈情況、缺失情況等來定,在數據質量較好的前提下儘可能保留更多數據。缺失值的處理方法較多,也是根據具體特徵和業務來定,可以隨機填充、均值填充、或採用簡單算法如KNN,聚類進行填充。當然,如果某些特徵或某些樣本的缺失率太大,可以考慮直接捨棄,是具體情況而定。

bagging,boosting的含義?

bagging主要和隨機森林關聯,採用有放回的抽樣,所以某個樣本可能出現在多棵樹的訓練集中也可能一次也沒出現,可以並行。另外每棵樹用的特徵集也是從原始特徵集中隨機選擇部分特徵集作爲分裂集合。
boosting主要和adaboosting關聯,每棵樹都是根據前一棵樹訓練的殘差作爲輸入的,所以一般是串行跑的,每棵樹的訓練集都是整個樣本集,另外對特徵也沒做選擇。

GDBT和XGBOOST

1 )幾種模型( svm , lr , gbdt , em )的原理以及公式推導

svm:支持向量機,在特徵空間上的間隔最大的線性分類器。等價於正則化的合頁損失函數最小化。
函數間隔(用γ=y(wx+b)來表示分類的正確性和確信度)、幾何間隔(對分離超平面的法向量w加某些約束γ^=wx/||w||+b/||w||)、最大間隔法、學習的對偶算法,構建拉格朗日函數,極大極小問題。

訓練數據線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支持向量機(硬間隔支持向量機);
訓練數據近似線性可分時,通過軟間隔最大化(軟間隔SVM的目標函數形式同硬間隔的形式相同,唯一不同的就在於ai的範圍。),學習一個線性分類器,即線性支持向量機;
訓練數據不可分時,使用核技巧及軟間隔最大化,學習非線性支持向量機。

核函數:輸入和輸入空間到特徵空間的映射的內積。

常用核函數:多項式核函數;高斯核函數;字符串核函數。

lr:邏輯斯特迴歸,服從邏輯斯特分佈,對數似然函數,求極大值(極大似然估計),最優化問題的改進算法有:迭代尺度法、梯度下降法、擬牛頓法;

gdbt:Boost肯定是一個加法模型,它是由若干個基函數及其權值乘積之和的累加,基函數是決策樹,首先計算殘差,有了殘差之後,我們再用(xi,rim)去擬合第m個基函數,假設這棵樹把輸入空間劃分成j個空間R1m,R2m……,Rjm,假設它在每個空間上的輸出爲bjm,這樣的話,第m棵樹可以表示如下:下一步,對樹的每個區域分別用線性搜索的方式尋找最佳步長,這個步長可以和上面的區域預測值bjm進行合併,最後就得到了第m步的目標函數。當然了,對於GDBT比較容易出現過擬合的情況,所以有必要增加一點正則項,比如葉節點的數目或葉節點預測值的平方和,進而限制模型複雜度的過度提升。

AdaBoost:AdaBoost是用於分類的。然後套路想必你已經非常瞭解了,前面幾步完全和上面的GDBT一樣,區別在於AdaBoost給出了損失函數爲指數損失函數。

1 第一步假設平均分佈,權值都爲1/N,訓練數據得到分類器。
2 求第一步的分類器預測數據的錯誤率,計算G(x)的係數alpha。
3 更新權值分佈,不過加了歸一化因子,使權值滿足概率分佈。
4 基於新的權值分佈建立新的分類器,累加在之前的模型中。
5 重複上述步驟,得到最終的分類器。

xgboost:梯度下降的方法我們都只考慮了一階信息,根據泰勒展開,我們可以把二階信息也用上,假如目標函數如下。。新一步函數的損失函數變成了只與上一步相關的一個新的損失函數,這樣我們就可以遍歷數據中所有的分割點,尋找新的損失函數下降最多的分割點,然後重複上述操作。

em:求期望、求極大;含有隱變量的概率模型參數的極大似然估計。

2 ) rf , gbdt 的區別; gbdt , xgboost 的區別(爛大街的問題最好從底層原理去分析回答)
https://blog.csdn.net/qq_28031525/article/details/70207918

RF和Bagging對比:RF的起始性能較差,特別當只有一個基學習器時,隨着學習器數目增多,隨機森林通常會收斂到更低的泛化誤差。隨機森林的訓練效率也會高於Bagging,因爲在單個決策樹的構建中,Bagging使用的是‘確定性’決策樹,在選擇特徵劃分結點時,要對所有的特徵進行考慮,而隨機森林使用的是‘隨機性’特徵數,只需考慮特徵的子集。

GBDT和XGBoost區別:

  1. 傳統的GBDT以CART樹作爲基學習器,XGBoost還支持線性分類器,這個時候XGBoost相當於L1和L2正則化的邏輯斯蒂迴歸(分類)或者線性迴歸(迴歸);
  2. 傳統的GBDT在優化的時候只用到一階導數信息,XGBoost則對代價函數進行了二階泰勒展開,得到一階和二階導數;
  3. XGBoost在代價函數中加入了正則項,用於控制模型的複雜度。從權衡方差偏差來看,它降低了模型的方差,使學習出來的模型更加簡單,放置過擬合,這也是XGBoost優於傳統GBDT的一個特性;
  4. shrinkage(縮減),相當於學習速率(XGBoost中的eta)。XGBoost在進行完一次迭代時,會將葉子節點的權值乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。(GBDT也有學習速率);
  5. 列抽樣。XGBoost借鑑了隨機森林的做法,支持列抽樣,不僅防止過擬合,還能減少計算;
  6. 對缺失值的處理。對於特徵的值有缺失的樣本,XGBoost還可以自動學習出它的分裂方向;
  7. XGBoost工具支持並行。Boosting不是一種串行的結構嗎?怎麼並行 的?注意XGBoost的並行不是tree粒度的並行,XGBoost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數裏包含了前面t-1次迭代的預測值)。XGBoost的並行是在特徵粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因爲要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然後保存爲block結構,後面的迭代 中重複地使用這個結構,大大減小計算量。這個block結構也使得並行成爲了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多線程進行。

3 )決策樹處理連續值的方法
決策樹對於連續值的特徵進行處理的方法主要是將連續性數值特徵劃分爲不同的區間,從而變成離散的數值。C4.5中採用了二分法對連續值進行處理。

二分法的思想爲:對於某個屬性出現的連續值從小到大排列,取每兩個點的中點進行劃分(任取兩點之間的任意一點不影響劃分結果),選取其中信息增益最大的點作爲最終劃分節點的依據。

因爲連續屬性的可取值數目不再有限,因此不能像前面處理離散屬性枚舉離散屬性取值來對結點進行劃分。因此需要連續屬性離散化,常用的離散化策略是二分法,這個技術也是C4.5中採用的策略。

4 )特徵選擇的方法

1、Filter方法

其主要思想是:對每一維的特徵“打分”,即給每一維的特徵賦予權重,這樣的權重就代表着該維特徵的重要性,然後依據權重排序。

主要的方法有:

  • Chi-squared test(卡方檢驗)
  • information gain(信息增益)
  • correlation coefficient scores(相關係數)

2、Wrapper方法

其主要思想是:將子集的選擇看作是一個搜索尋優問題,生成不同的組合,對組合進行評價,再與其他的組合進行比較。這樣就將子集的選擇看作是一個是一個優化問題,這裏有很多的優化算法可以解決,尤其是一些啓發式的優化算法,如GA,PSO,DE,ABC等,詳見“優化算法——人工蜂羣算法(ABC)”,“優化算法——粒子羣算法(PSO)”。

主要方法有:

  • recursive feature elimination algorithm(遞歸特徵消除算法)

3、Embedded方法

其主要思想是:在模型既定的情況下學習出對提高模型準確性最好的屬性。這句話並不是很好理解,其實是講在確定模型的過程中,挑選出那些對模型的訓練有重要意義的屬性。

主要方法:

  • 正則化

5 )過擬合的解決方法

  • dropout(隨機剔除一些神經元)
  • 減輕迭代次數(學習這東西學了很多遍)
  • 輸入噪音
  • L2正則化(減小權重分量,讓w更新中逐漸變0)
  • BN層 讓數據分佈變化別太大

kmeans 的原理,優缺點以及改進

https://wizardforcel.gitbooks.io/dm-algo-top10/content/k-means.html

是將各個聚類子集內的所有數據樣本的均值作爲該聚類的代表點
算法描述
1、爲中心向量c1, c2, …, ck初始化k個種子
2、分組:
(1)將樣本分配給距離其最近的中心向量
(2)由這些樣本構造不相交( non-overlapping )的聚類
3、確定中心:
用各個聚類的中心向量作爲新的中心
4、重複分組和確定中心的步驟,直至算法收斂。
3、算法 k-means算法
輸入:簇的數目k和包含n個對象的數據庫。
輸出:k個簇,使平方誤差準則最小。
算法步驟:
1.爲每個聚類確定一個初始聚類中心,這樣就有K 個初始聚類中心。
2.將樣本集中的樣本按照最小距離原則分配到最鄰近聚類
3.使用每個聚類中的樣本均值作爲新的聚類中心。
4.重複步驟2.3直到聚類中心不再變化。
5.結束,得到K個聚類

主要優點:

是解決聚類問題的一種經典算法,簡單、快速。
對處理大數據集,該算法是相對可伸縮和高效率的。因爲它的複雜度是0 (n k t ) , 其中, n 是所有對象的數目, k 是簇的數目, t 是迭代的次數。通常k < <n 且t < <n 。
當結果簇是密集的,而簇與簇之間區別明顯時, 它的效果較好。

主要缺點:

在簇的平均值被定義的情況下才能使用,這對於處理符號屬性的數據不適用。
必須事先給出k(要生成的簇的數目),而且對初值敏感,對於不同的初始值,可能會導致不同結果。
它對於“躁聲”和孤立點數據是敏感的,少量的該類數據能夠對平均值產生極大的影響。
K-Means算法對於不同的初始值,可能會導致不同結果。解決方法:
1.多設置一些不同的初值,對比最後的運算結果)一直到結果趨於穩定結束,比較耗時和浪費資源
2.很多時候,事先並不知道給定的數據集應該分成多少個類別才最合適。這也是 K-means 算法的一個不足。有的算法是通過類的自動合併和分裂,得到較爲合理的類型數目 K.
2、k-means算法的改進方法——k-prototype算法
k-Prototype算法:可以對離散與數值屬性兩種混合的數據進行聚類,在k-prototype中定義了一個對數值與離散屬性都計算的相異性度量標準。
K-Prototype算法是結合K-Means與K-modes算法,針對混合屬性的,解決2個核心問題如下:
1.度量具有混合屬性的方法是,數值屬性採用K-means方法得到P1,分類屬性採用K-modes方法P2,那麼D=P1+a*P2,a是權重,如果覺得分類屬性重要,則增加a,否則減少a,a=0時即只有數值屬性
2.更新一個簇的中心的方法,方法是結合K-Means與K-modes的更新方法。
3、k-means算法的改進方法——k-中心點算法
k-中心點算法:k -means算法對於孤立點是敏感的。爲了解決這個問題,不採用簇中的平均值作爲參照點,可以選用簇中位置最中心的對象,即中心點作爲參照點。這樣劃分方法仍然是基於最小化所有對象與其參照點之間的相異度之和的原則來執行的。

常見分類模型( svm ,決策樹,貝葉斯等)的優缺點,適用場景以及如何選型

svm 爲啥要引入拉格朗日的優化方法;

10 )海量的 item 算文本相似度的優化方法;

11 )梯度下降的優缺點;

12 ) em 與 kmeans 的關係;

13 ) L1 與 L2 的區別以及如何解決 L1 求導困難;

14 )如何用儘可能少的樣本訓練模型同時又保證模型的性能;

解釋 word2vec 的原理以及哈夫曼樹的改進;

https://zhuanlan.zhihu.com/p/31319965

word2vec的最基礎功能就是通過訓練將每個詞映射成K維實數向量。

word2vec產生詞向量的過程:
其採用一個三層的神經網絡,輸入層-隱層-輸出層。核心的技術是根據詞語出現的頻率用Huffman編碼,使得所有詞頻相似的詞隱藏層激活的內容基本一致,出現頻率越高的詞語,他們激活的隱藏層數目越少,這樣有效的降低了計算的複雜度。這個三層神經網絡本身是對語言模型進行建模 ,但也同時獲得一種單詞在向量空間上的表示,獲得單詞在向量空間上的表示纔是Word2vec的真正目標。

(1) 分詞/詞幹提取和詞形還原。 中文和英文的nlp各有各的難點,中文的難點在於需要進行分詞,將一個個句子分解成一個單詞數組。而英文雖然不需要分詞,但是要處理各種各樣的時態,所以要進行詞幹提取和詞形還原。

(2) 構造詞典,統計詞頻。這一步需要遍歷一遍所有文本,找出所有出現過的詞,並統計各詞的出現頻率。

(3) 構造樹形結構。依照出現概率構造Huffman樹。

(4) 生成節點所在的二進制碼。

(5) 初始化各非葉節點的中間向量和葉節點中的詞向量。樹中的各個節點,都存儲着一個長爲m的向量,但葉節點和非葉結點中的向量的含義不同。葉節點中存儲的是各詞的詞向量,是作爲神經網絡的輸入的。而非葉結點中存儲的是中間向量,對應於神經網絡中隱含層的參數,與輸入一起決定分類結果。

(6) 訓練中間向量和詞向量。

輸入層讀入窗口內的詞,將它們的向量(K維,初始隨機)加和在一起,形成隱藏層K個節點。輸出層是一個巨大的二叉樹,葉節點代表語料裏所有的詞(語料含有V個獨立的詞,則二叉樹有|V|個葉節點)。而這整顆二叉樹構建的算法就是Huffman樹。

對推薦算法的未來看法;

在模型的訓練迭代中,怎麼評估效果

https://blog.csdn.net/sinat_33761963/article/details/54910447

評估模型的方法:

  • 留出法(hold-out)留出法直接將數據集D拆分成互斥的兩個集合,其中一個作爲訓練集S,另一個作爲測試集T。在S上訓練模型,在T上測試,並得到測試誤差來近似泛化誤差。

  • 交叉驗證法(cross validation)交叉驗證法是將數據集D劃分成k個大小相似的互斥子集(D1,D2,…,DK),每個子集Di都使用分層採樣儘可能保持數據分佈的一致性。
    每次使用k-1個子集作爲訓練集,餘下的那個子集作爲測試集。如此便得到了k組訓練/測試集,進行k次模型的訓練與測試,得到k個結果,將這k個結果的平均作爲這次交叉驗證的最終結果。
    k一般取10

  • 驗證集調參
    大多數機器學習的模型都有超參數需要人爲設定,參數配置的不同,學得的模型性能也會有顯著差別。如何儘可能正確地確定超參數呢?
    常見的方法,將訓練集S進行k折交叉驗證,取k-1部分作爲訓練集進行模型的訓練,將餘下的部分成爲驗證集(validation set), 作爲對模型的驗證。從而選擇出當超參數設置爲多少的時候模型的性能最佳。

評估模型的性能度量:

  • 錯誤率與精度
    錯誤率是分類錯誤的樣本數量佔總樣本數量的比例;
    精度是分類正確的樣本數量佔總樣本數量的比例。
    錯誤率與精度相加爲1.

  • 查準率,查全率與F1
    查全率與查準率的計算
    查準率: P = TP/(TP + FP) 預測正確的正例佔所有預測正例的比例
    查全率: R = TP/(TP + FN) 預測正確的正例佔所有真實正例的比例

查全率也叫作“召回率”recall 或“敏感度”sensitivity

  • ROC 與 AUC
    在邏輯迴歸或者神經網絡分類問題中,往往會輸出一個概率值,將這個概率值與預先設定的閥值進行比較,大於閥值則爲正例,小於閥值則爲反例。等價於,按照概率將所有樣本從大到小排列,設置某個“截斷點”將樣本分成前後兩部分,前面的爲正例,後面的爲負例。如果更關注查準率則將截斷點設置地大一點,若更關注查全率則將截斷點設置地小一下。因此排序本省的質量好壞,體現了綜合考慮學習器在不同任務下的“期望泛化性能”的還壞。ROC曲線就是從這個角度來研究學習器的泛化能力的。

ROC全稱“受試者工作特徵”(Receiver Operation Characteristic)曲線。

根據ROC曲線評估模型 :

a.若一個學習器的ROC曲線被另一個學習器的曲線完全包住,則後者優於前者。

b.若兩個學習器的ROC曲線發生交叉,則可根據曲線下方的面積大小來比較,ROC曲線下方的面積爲AUC(Area Under ROC Curve).

有幾個 G 的文本,每行記錄了訪問 ip 的 log ,如何快速統計 ip 出現次數最高的 10 個 ip ;如果只用 linux 指令又該怎麼解決;

訪問百度的日誌中的IP取出來,逐個寫入到一個大文件中。注意到IP是32位的,最多有個2^32個IP。同樣可以採用映射的方法,比如模1000,把整個大文件映射爲1000個小文件,再找出每個小文中出現頻率最大的IP(可以採用hash_map進行頻率統計,然後再找出頻率最大的幾個)及相應的頻率。然後再在這1000個最大的IP中,找出那個頻率最大的IP,即爲所求。

算法思想:分而治之+Hash1.IP地址最多有2^32=4G種取值情況,所以不能完全加載到內存中處理; 2.可以考慮採用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日誌分別存儲到1024個小文件中。這樣,每個小文件最多包含4MB個IP地址; 3.對於每一個小文件,可以構建一個IP爲key,出現次數爲value的Hash map,同時記錄當前出現次數最多的那個IP地址;4.可以得到1024個小文件中的出現次數最多的IP,再依據常規的排序算法得到總體上出現次數最多的IP;

100w個數中找最大的前100個數。

用一個100個元素大小的最小堆即可。

堆:適用範圍:海量數據前n大,並且n比較小,堆可以放入內存  基本原理及要點:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當前元素與最大堆裏的最大元素,如果它小於最大元素,則應該替換那個最大元素。這樣最後得到的n個元素就是最小的n個。適合大數據量,求前n小,n的大小比較小的情況,這樣可以掃描一遍即可得到所有的前n元素,效率很高。  擴展:雙堆,一個最大堆與一個最小堆結合,可以用來維護中位數。

一個繩子燒完需要 1 個小時,假設所有繩子的材質都不一樣,也不均勻,怎麼取出 1 小時加 15 分鐘;

假設有個 M*N 的方格,從最左下方開始往最右上方走,每次只能往右或者往上,問有多少種走法,假設中間有若干個格子不能走,又有多少種走法

實現 hmm 的狀態轉移代碼;

最短路徑代碼;

23 )拼車軟件是如何定價的以及如何優化;

24 ) 100 張牌,每次只能抽一張,抽過的牌會丟掉,怎麼選出最大的牌;

25 )怎麼預測降雨量;

26 ) kmeans 代碼;

27 ) mr 方案解決矩陣相乘的代碼;

28 ) sql 語句的一些優化技巧;

29 )關於集羣調度的一些經驗 trick 掌握多少;

30 )設計一個系統可以實時統計任意 ip 在過去一個小時的訪問量;

31 )設計 LRU 系統;

bayes公式

事件A、B,

P(A|B) = P(A,B)/P(B)
P(B|A) = P(A,B)/P(A)
P(A|B) = P(A)*P(B|A)/P(B)

爲什麼lr處理的是線性問題?什麼時候用lr?

Lr 處理的是廣義線性問題。

lr還是特徵的線性組合後通過非線性函數映射

https://www.zhihu.com/question/30726036

Z就是分界的地方,Z大於等於0.5,就是1,而z等於wx,Z是x的多維空間的一條直線,或者你看它的定義,機率這個概念,P/(1-P) 取log的形式的結果,好像是wx,他們把這個當作廣義的線性,或者你這麼想像,假設特徵只有2維度,X1,x2,如果z是x1+ x2的形式,那麼x1+x2==0.5這個直線把特徵空間分成2半,而且分界面是條直線。

https://www.zhihu.com/question/21704547?utm_source=wechat_session&utm_medium=social&utm_oi=1042761941252562944

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章