特征選擇與特征提取
在我剛開始接觸機器學習的時候,總會被特征選擇(feature selection)與特征提取(feature extraction)這兩個概念搞得暈頭轉向,當我在看一些論文時,只要遇到了這兩個概念就會讓我很苦惱,所以有段時間索性就不加區分地把這兩個概念當作一個意思在使用。而網上相當一部分文章也是不加區分地使用這兩個概念,這就讓我更加地迷惑了。
直到有一天我在閱讀scikit-learn源碼及其文檔的時候,偶然間發現scikit-learn將特征選擇和特征提取分在了兩個文檔里進行描述,于是深入進去學習后,終于明白了二者的區別。
首先需要說明的是,特征選擇和特征提取是兩個完全不同的概念。
特征選擇是指去掉無關特征,保留相關特征的過程,也可以認為是從所有的特征中選擇一個最好的特征子集。特征選擇本質上可以認為是降維的過程。
特征提取是指將機器學習算法不能識別的原始數據轉化為算法可以識別的特征的過程。比如說,文本是由一系列文字組成的,這些文字在經過分詞后會形成一個詞語集合,對于這些詞語集合(原始數據),機器學習算法是不能直接使用的,我們需要將它們轉化成機器學習算法可以識別的數值特征(固定長度的向量表示),然后再交給機器學習的算法進行操作。再比如說,圖片是由一系列像素點構(原始數據)成的,這些像素點本身無法被機器學習算法直接使用,但是如果將這些像素點轉化成矩陣的形式(數值特征),那么機器學習算法就可以使用了。
從上面的概念可以看出,特征提取實際上是把原始數據轉化為機器學習算法可以識別的數值特征的過程,不存在降維的概念,特征提取不需要理會這些特征是否是有用的;而特征選擇是在提取出來的特征中選擇最優的一個特征子集。
關于特征選擇的方法,可以參見博客:http://blog.csdn.net/henryczj/article/details/41043883
這里以文本分類為例來看一下特征提取。
假設一個語料庫里包含了很多文章,在對每篇文章作了分詞之后,可以把每篇文章看作詞語的集合。然后將每篇文章作為數據來訓練分類模型,但是這些原始數據是一些詞語并且每篇文章詞語個數不一樣,無法直接被機器學習算法所使用,機器學習算法需要的是定長的數值化的特征。因此,我們要做的就是把這些原始數據數值化,這就對應了特征提取。如何做呢?
1. 對訓練數據里的每一篇文章,我們進行詞語的統計,以形成一個詞典向量。詞典向量里包含了訓練數據里的所有詞語(假設停用詞已去除),且每個詞語代表詞典向量中的一個元素。
2. 在經過第一步的處理后,每篇文章都可以用詞典向量來表示。這樣一來,每篇文章都可以被看作是元素相同且長度相同的向量,不同的文章具有不同的向量值。這也就是表示文本的詞袋模型(bag of words)。
3. 針對于特定的文章,如何給表示它的向量的每一個元素賦值呢?最簡單直接的辦法就是0-1法了。簡單來說,對于每一篇文章,我們掃描它的詞語集合,如果某一個詞語出現在了詞典中,那么該詞語在詞典向量中對應的元素置為1,否則為0。這是最簡單的方式。其它的方式還包括IR中著名的tf-idf。
在經過上面三步之后,特征提取就完成了。對于每一篇文章,其中必然包含了大量無關的特征,而如何去除這些無關的特征,就是特征選擇要做的事情了。
關于詞袋模型(bag of words)的優缺點以及到底是用tf-idf為向量賦值還是0-1法為向量賦值,這里不作討論了。
需要注意的是,tf-idf可以看做是特征提取的一個步驟。但實踐中很多人將tf-idf作為特征選擇的一個方法在使用,這是錯誤的,盡管它在有些時候效果還不錯。