標籤:

這些機器學習基礎,你忽略了嗎?

  1. 偏差/方差權衡
  2. 一些誤差驗證-評估方法
  3. 一些常見的模型指標
  4. AUC、ROC是什麼?
  5. 重中之重之特徵工程
  6. 一些特徵類型
  7. 一些特徵來源

偏差/方差權衡

  在學習演算法中,偏差指的是預測的期望值與真實值的偏差,方差則是每一次預測值與預測值得期望之間的差均方,當然還有任務本身的噪音。實際上,偏差體現了學習器預測的準確度,而方差體現了學習器預測的穩定性。雜訊表達當前任務在任何學習演算法所能達到的泛化誤差的下界,通過對泛化誤差的進行分解。可以得到:

  • 期望泛化誤差=方差+偏差+雜訊
  • 偏差刻畫學習器的擬合能力
  • 方差體現學習器的穩定性
  • 噪音刻畫了問題本身的難度

方差和偏差具有矛盾性,這就是常說的偏差-方差窘偽境(bias-variance dilamma),隨著訓練程度的提升,期望預測值與真實值之間的差異越來越小,即偏差越來越小,但是另一方面,隨著訓練程度加大,學習演算法對數據集的波動越來越敏感,方差值越來越大。也就如下圖所示,換句話說:在欠擬合時,偏差主導泛化誤差,而訓練到一定程度後,偏差越來越小,方差主導了泛化誤差。因此訓練也不要貪杯,適度輒止。

(最上面的線是泛化誤差)

順便一提,模型複雜程度和偏差/方差權衡:

我們在偏差與方差間都會做出權衡。如果我們的模型過於簡單,只有很少的幾個參數,那麼它可能存在著較大的偏差(但是方差較小);如果過於複雜而含有非常多的參數,那麼模型可能會存在較大的方差(但是偏差較小)。同時,一般而言,高偏差意味著欠擬合,高方差意味著過擬合。

一些誤差驗證-評估方法

保留交叉驗證/留出法:

  1. 從全部的訓練數據 S中隨機選擇 中隨機選擇 s的樣例作為訓練集 train,剩餘的 作為測試集 作為測試集 test。
  2. 通過對訓練集訓練 ,得到假設函數或者模型 。
  3. 在測試集對每一個樣本根據假設函數或者模型,得到訓練集的類標,求出分類正確率。
  4. 選擇具有最大分類率的模型或者假設

k折交叉驗證( k-fold cross validation):

  1. 將全部訓練集 S分成 k個不相交的子集,假設 S中的訓練樣例個數為 m,那麼每一個子 集有 m/k 個訓練樣例,相應的子集稱作 {s_1,s_2,…,s_k}
  2. 每次從分好的子集中裡面,拿出一個作為測試集,其它k-1個作為訓練集
  3. 根據訓練訓練出模型或者假設函數。
  4. 把這個模型放到測試集上,得到分類率。
  5. 計算k次求得的分類率的平均值,作為該模型或者假設函數的真實分類率。 這個方法充分利用了所有樣本。但計算比較繁瑣,需要訓練k次,測試k次。

當然,交叉驗證中有一個比較特殊的情況—-留一法 :就是每次只留下一個樣本做測試集(也就是當上面的k==m的情況),其它樣本做訓練集,如果有k個樣本,則需要訓練k次,測試k次。留一發計算最繁瑣,但樣本利用率最高。適合於小樣本的情況。

我們希望評估的是用整個數據集S訓練出的模型。但在留出法和交叉驗證法中,由於保留了一部分樣本用於測試,因此實際評估的模型所使用的訓練集比S小,這必然會引入一些因訓 練樣本規模不同而導致的估計偏差。留一法受訓練樣本規模變化的影響較小,但計算複雜度又太高了。 這就引出下面的自助法

自助法:

  1. 自助法的基本思想是:給定包含m個樣本的數據集S,每次隨機從S 中挑選一個樣本,將其拷貝放入 S』 ,然後再將該樣本放回初始數據集S 中,使得該樣本在下次採樣時仍有可能被採到。
  2. 重複執行m 次,就可以得到了包含m個樣本的數據集 S』 。可以得知在m次採樣中,樣本始終不被採到的概率取極限為:

這樣,通過自助採樣,初始樣本集S中大約有36.8%的樣本沒有出現在 S』 中,於是可以將S』作為訓練集, S-S』 作為測試集。自助法在數據集較小,難以有效劃分訓練集/測試集時很有用,但由於自助法產生的數據集(隨機抽樣)改變了初始數據集的分布,因此引入n了估計偏差。在初始數據集足夠時,留出法和交叉驗證法更加常用,我也是最常用交叉驗證的

一些常見的模型指標

正確率 = 提取出的正確信息條數 / 提取出的信息條數

召回率 = 提取出的正確信息條數 / 樣本中的信息條數

兩者取值在0和1之間,數值越接近1,查准率或查全率就越高。

F值 = 正確率 * 召回率 * 2 / (正確率 + 召回率) (F 值即為正確率和召回率的調和平均值)

不妨舉這樣一個例子:某池塘有1400條鯉魚,300隻蝦,300隻鱉。現在以捕鯉魚為目的。撒一大網,逮著了700條鯉魚,200隻蝦,100隻鱉。那麼,這些指標分別如下:

正確率 = 700 / (700 + 200 + 100) = 70%

召回率 = 700 / 1400 = 50%

F值 = 70% * 50% * 2 / (70% + 50%) = 58.3%

不妨看看如果把池子里的所有的鯉魚、蝦和鱉都一網打盡,這些指標又有何變化:

正確率 = 1400 / (1400 + 300 + 300) = 70%

-召回率 = 1400 / 1400 = 100%

F值 = 70% * 100% * 2 / (70% + 100%) = 82.35%

  由此可見,正確率是評估捕獲的成果中目標成果所佔得比例;召回率,顧名思義,就是從關注領域中,召回目標類別的比例;而F值,則是綜合這二者指標的評估指標,用於綜合反映整體的指標。

AUC、ROC是什麼?

假設有下面兩個分類器,哪個好?(樣本中有A類樣本90個,B 類樣本10個。)

分類器C1把所有的測試樣本都分成了A類,分類器C2把A類的90個樣本分對了70個,B類的10個樣本分對了5個。

則C1的分類精度為 90%,C2的分類精度為75%,但直覺上,我們感覺C2更有用些。但是依照正確率來衡量的話,那麼肯定C1的效果好一點。那麼這和我們認為的是不一致的。也就是說,有些時候,僅僅依靠正確率是不妥當的。

我們還需要一個評價指標,能客觀反映對正樣本、負樣本綜合預測的能力,還要考慮消除樣本傾斜的影響(其實就是歸一化之類的思想),這就是auc指標能解決的問題。

ROC:為了理解auc,我們需要先來弄懂ROC。 先來看一個普遍的二分類問題的結果,預測值和實際值有4種組合情況,看下面的表格:

注意這裡是兩分類問題,所以FN就表示的是分錯的pos類,同理FP就表示的是分錯的neg類

我們定義以下公式有:

看圖也就可以知道:

  1. TPR表示的就是預測正確且實際分類為正的數量 與 所有正樣本的數量的比例。–實際的正樣本中,正確預測的比例是多少?
  2. FPR表示的是預測錯誤且實際分類為負的數量 與所有負樣本數量的比例。 –實際的負樣本當中,錯誤預測的比例是多少?

由下面的表格

分類器C1

分類器C2

可以公式代入,得到:

對於分類器C1:TPR = FPR = 1.0

對於分類器C2:TPR = 0.78, FPR = 0.5

然後,以TPR為縱坐標,FPR為橫坐標畫圖,可以得到:

上圖中藍色表示C1分類器,綠色表示C2分類器。可以知道,這個時候綠色的點比較靠近左上角,可以看做是分類效果較好也就是說評估標準改為離左上角近的是好的分類器(考慮了正負樣本的綜合分類能力,這個應該比較好理解)。

一連串這樣的點構成了一條曲線,該曲線就是ROC曲線。而ROC曲線下的面積就是AUC(Area under the curve of ROC)。這就是AUC指標的由來。

如何畫ROC曲線?對於一個特定的分類器和測試數據集,顯然只能得到一個分類結果,即一組FPR和TPR結果,而要得到一個曲線,我們實際上需要一系列FPR和TPR的值才能得到這樣的曲線,這又是如何得到的呢?

可以通過分類器的一個重要功能「概率輸出」,即表示分類器認為某個樣本具有多大的概率屬於正樣本(或負樣本),來動態調整一個樣本是否屬於正負樣本

假如我們已經得到了所有樣本的概率輸出(屬於正樣本的概率),現在的問題是如何改變這個閾值(概率輸出)?我們根據每個測試樣本屬於正樣本的概率值從大到小排序。下圖是一個示例,圖中共有20個測試樣本,「Class」一欄表示每個測試樣本真正的標籤(p表示正樣本,n表示負樣本),「Score」表示每個測試樣本屬於正樣本的概率。

接下來,我們從高到低,依次將「Score」值作為閾值,當測試樣本屬於正樣本的概率大於或等於這個閾值時,我們認為它為正樣本,否則為負樣本。舉例來說,對於圖中的第4個樣本,其「Score」值為0.6,那麼樣本1,2,3,4都被認為是正樣本,因為它們的「Score」值都大於等於0.6,而其他樣本則都認為是負樣本。每次選取一個不同的閾值,我們就可以得到一組FPR和TPR,即ROC曲線上的一點。這樣一來,我們一共得到了20組FPR和TPR的值,將它們畫在ROC曲線的結果如下圖:

當我們將閾值設置為1和0時,分別可以得到ROC曲線上的(0,0)和(1,1)兩個點。將這些(FPR,TPR)對連接起來,就得到了ROC曲線。當閾值取值越多,ROC曲線越趨於平滑。

AUC值的計算:AUC(Area Under Curve)被定義為ROC曲線下的面積,顯然這個面積的數值不會大於1。又由於ROC曲線一般都處於y=x這條直線的上方,所以AUC的取值範圍在0.5和1之間。所以,使用AUC值作為評價標準是因為很多時候ROC曲線並不能清晰的說明哪個分類器的效果更好,而作為一個數值,對應AUC更大的分類器效果更好。

為什麼使用ROC和AUC?既然已經這麼多評價標準,為什麼還要使用ROC和AUC呢?因為ROC曲線有個很好的特性:當測試集中的正負樣本的分布變化的時候,ROC曲線能夠保持不變。在實際的數據集中經常會出現類不平衡(class imbalance)現象,即負樣本比正樣本多很多(或者相反),而且測試數據中的正負樣本的分布也可能隨著時間變化。下圖是ROC曲線和Precision-Recall曲線的對比:

在上圖中,(a)和(c)為ROC曲線,(b)和(d)為Precision-Recall曲線。(a)和(b)展示的是分類其在原始測試集(正負樣本分布平衡)的結果,(c)和(d)是將測試集中負樣本的數量增加到原來的10倍後,分類器的結果。可以明顯的看出,ROC曲線基本保持原貌,而Precision-Recall曲線則變化較大。

重中之重之特徵工程

如坊間戲言「特徵沒做好,參數調到老」,機器學習大牛 Andrew Ng 也說過「『Applied machine learning』is basically feature engineering」,可見特徵工程的重要性,我們現在很多時候用end to end的深度學習模型而忽略特徵工程的知識,但在實戰項目的時候就會發現他是多麼的重要。所以這裡有必要一提,特徵工程的知識點,你忽略了嗎?

如下圖所示,特徵工程包含巨多知識點,若想要學好實在不易,先上圖,然後講下一些常見特徵概念,至於降維,特徵監控什麼的這裡先不介紹,大家若有興趣可以去了解。

圖片較模糊,可能要放大之後才看的清楚

特徵提取與特徵選擇:

  • 特徵選擇:特徵選擇也叫特徵子集選擇 ( FSS , Feature Subset Selection ) 。是指從已有的M個特徵(Feature)中選擇N個特徵使得系統的特定指標最優化,是從原始特徵中選擇出一些最有效特徵以降低數據集維度的過程,是提高學習演算法性能的一個重要手段,也是模式識別中關鍵的數據預處理步驟。對於一個學習演算法來說,好的學習樣本是訓練模型的關鍵。.
  • 特徵提取:特徵提取是計算機視覺和圖像處理中的一個概念。它指的是使用計算機提取圖像信息,決定每個圖像的點是否屬於一個圖像特徵。特徵提取的結果是把圖像上的點分為不同的子集,這些子集往往屬於孤立的點、連續的曲線或者連續的區域。

提取就是通過降維技術來抽出主要信息,是計算機視覺的概念,通過映射實現,可以理解為高維的映射到低維,不刪除具體特徵,而是捨去那些通過映射後不能代表原來主要信息的數據 ,相對應的選擇就是要捨去一些特徵,拿到整體主要特徵,要刪除一些具體特徵

一些特徵類型

數值型特徵:也就是常見的數值特徵,比如一個人的身高,體重。數值型特徵在應用時往往需要歸一化,比如將幅度調整到 [0,1] 區間。當然也有離散化,排序後變成新的特徵的做法。

類別型特徵:類別型一般是文本信息,比如顏色是紅色、黃色還是藍色,我們存儲數據的時候就需要先處理數據。處理方法有one-hot編碼,Hash編碼成詞向量和 Histogram映射等等。具體如下:

  • one-hot編碼:對於每一個特徵,如果它有m個可能值,那麼經過獨熱編碼後,就變成了m個二元特徵。並且,這些可能值互斥,每次只有一個激活。因此,數據會變成稀疏的。它的稀疏格式是記憶友好的(便於存儲),但注意去掉第一列避免共線性 。
  • Hash編碼成詞向量: 如下圖,若某個詞存在於句子中就置為1,若不存在則為0

  • Histogram映射:把每一列的特徵拿出來,根據target內容做統計,把target中的每個內容對應的百分比填到對應的向量的位置。優點是把兩個特徵聯繫起來。

  上表中,我們來統計「性別與愛好的關係」,性別有「男」、「女」,愛好有三種,表示成向量 [散步、足球、看電視劇],分別計算男性和女性中每個愛好的比例得到:男[1/3, 2/3, 0],女[0, 1/3, 2/3]。即反映了兩個特徵的關係。

時間型特徵:時間型特徵的用處特別大,既可以看做連續值(持續時間、間隔時間),也可以看做離散值(星期幾、幾月份)。數據挖掘中經常會用時間作為重要特徵,比如電商可以分析節假日和購物的關係,一天中用戶喜好的購物時間等。

當然,還有像文本型特徵,統計型特徵,這裡先不細講,有興趣的可以了解

一些特徵來源

離散特徵:對於數值型特徵,其連續性或者範圍非常廣導致需要進行特徵處理,而離散化就是一個較為常見的方式,特徵離散化有兩種劃分方式:一種是等值劃分(按照值域均分),另一種是等量劃分 (按照樣本數均分)。我們常常對 數值(numeric) 類型的特徵採用了等量劃分的離散化方式,比如先將每 一維特徵按照數值大小排序,然後均勻地劃分為 10 個區間,即離散化為 1~10。

排序特徵:顧明思議,將數值型特徵排序後的順序作為一種特徵,排序特徵對異常數據都有較強的魯棒性,使得模型更加穩定,降低過擬合的風險。

計數特徵:舉個例子,比如我們已經對數值特徵進行了離散化,離散化後它的特徵是 5,3,1,3,3,3,2,4,3,2,5,3,2,3,2…2,2,2,2,2,2,2,我們可以進一步統計離散特徵中 1~10 出現的次數 n_ i (i=1,2,…,10) ,即可得到一個 10 維計數特徵。計數特徵可以使得數據更具判別性。

交叉特徵:交叉特徵算是特徵工程中非常重要的方法之一了,交叉特徵是一種很獨特的方式,它將兩個或更多的類別屬性組合成一個。當組合的特徵要比單個特徵更好時,這是一項非常有用的技術。數學上來說,是對類別特徵的所有可能值進行交叉相乘。

假如擁有一個特徵A,A有兩個可能值{A1,A2}。擁有一個特徵B,存在{B1,B2}等可能值。然後,A&B之間的交叉特徵如下:{(A1,B1),(A1,B2),(A2,B1),(A2,B2)},並且你可以給這些組合特徵取任何名字。但是需要明白每個組合特徵其實代表著A和B各自信息協同作用。

一個更好地詮釋好的交叉特徵的實例是類似於(經度,緯度)。一個相同的經度對應了地圖上很多的地方,緯度也是一樣。但是一旦你將經度和緯度組合到一起,它們就代表了地理上特定的一塊區域,區域中每一部分是擁有著類似的特性

寫在後面:因為要趕論文啥的,有段時間沒有更新了,先更新一波,本來想寫RL的,但看好好多專欄都寫的不錯,我也就不想過多重複,下來我會抽時間寫比如open domain 對話系統的論文筆記或基礎學習筆記,謝謝支持,大家共勉加油!

推薦閱讀:

關於機器學習,你必須知道的10件事情
LR和SVM的聯繫區別
CS231n課程筆記翻譯:神經網路筆記 2
推薦兩個博客:《Python 與機器學習》,《MachineLearning》

TAG:机器学习 |