機器學習被廣泛定義為「利用經驗來改善計算機系統的自身性能」。事實上,「經驗」在計算機中主要是以數據的形式存在的,因此數據是機器學習的前提和基礎。數據來源多種多樣,它可以是結構數據,如數值型、分類型,也可以是非結構數據,如文本、語音、圖片、視頻。對於所有機器學習模型,這些原始數據必須以特徵的形式加入到機器學習模型當中,並進行一定的提取和篩選工作。所謂特徵提取,就是逐條將原始數據轉化為特徵向量的形式,此過程涉及數據特徵的量化表示;而特徵篩選是在已提取特徵的基礎上,進一步對高維度和已量化的特徵向量進行選擇,獲取對指定任務更有效果的特徵組合以提升模型性能。
在機器學習和模式識別中,特徵是在觀測現象中的一種獨立、可測量的屬性。選擇信息量大的、有差別性的、獨立的特徵是模式識別、分類和回歸問題的關鍵一步,其終極目的在於最大限度地從原始數據中提取特徵以供算法和模型使用。特徵工程的好壞將會影響整個模型的預測性能,另一方面,相比一些複雜的算法,靈活地處理好數據經常會取到意想不到的效益。
數據挖掘和機器學習界有這麼一句廣泛流傳的話:數據和特徵決定了機器學習的上限,而模型和算法是在逼近這個上限而已。換句話說,好的數據和特徵是所有模型和算法發揮到極致的前提。
2. 數據的預處理現實世界中數據大體上都是不完整,不一致的髒數據,無法直接進行提供給機器學習模型。為了提高數據利用的質量產生了數據預處理技術。
2.1 無量綱化無量綱化使不同規格的數據轉換到同一規格。常見的無量綱化方法有標準化、區間縮放法和正則化。標準化的前提是特徵值服從正態分布,標準化後,其轉換成標準正態分布。區間縮放法利用了邊界值信息,將特徵的取值區間縮放到某個特點的範圍。數據正則化針對單個樣本,將樣本某個範數縮放到單位1。
2.1.1 標準化數據標準化是將樣本的屬性縮放到某個指定的範圍,標準化的原因在於:
標準化公式為:
其中,
使用preproccessing庫的StandardScaler類對數據進行標準化的代碼如下:
from sklearn.preprocessing import StandardScaler #標準化,返回值為標準化後的數據StandardScaler().fit_transform(iris.data)
2.1.2 區間縮放法區間縮放法的思路有多種,常見的一種為利用兩個最值min、max進行縮放,公式為:
使用preproccessing庫的MinMaxScaler類對數據進行區間縮放的代碼如下:
from sklearn.preprocessing import MinMaxScaler#區間縮放,返回值為縮放到[0, 1]區間的數據MinMaxScaler().fit_transform(iris.data)
2.1.3 數據正則化數據正則化將樣本某個範數縮放到單位1,是針對單個樣本的,對於每個樣本將樣本縮放到單位範數。其目的在於樣本向量在點乘運算或其他核函數計算相似性時,擁有統一的標準。規則為L2的正則化公式為:
使用preproccessing庫的Normalizer類對數據進行正則化的代碼如下:
from sklearn.preprocessing import Normalizer #歸一化,返回值為歸一化後的數據Normalizer().fit_transform(iris.data)
2.2 特徵二元化特徵二元化的過程是將數值型數據轉換為布爾型屬性。設定一個閾值,大於閾值的賦值為1,小於等於閾值的賦值為0,公式表達如下:
使用preproccessing庫的Binarizer類對數據進行二值化的代碼如下:
from sklearn.preprocessing import Binarizer #二值化,閾值設置為3,返回值為二值化後的數據Binarizer(threshold=3).fit_transform(iris.data)
2.3 特徵啞編碼啞編碼(One Hot Encoding)採用N位狀態寄存器對N個可能的取值進行編碼,每個狀態都由獨立的寄存器位來表示,並且在任意時刻只有其中一位有效。假設某個屬性的取值為非數值的離散集合[離散值1,離散值2,…,離散值m],則針對該屬性的編碼為一個m元的元組,且該元組的分量有且只有一個為1,其餘都為0。
One Hot Encoding能夠處理非數值屬性;在一定程度上也擴充了特徵,如性別本身是一個屬性,經過One Hot Encoding後變成了男或女兩個屬性;編碼後的屬性是稀疏的,存在大量的零元分量。
使用preproccessing庫的OneHotEncoder類對數據進行啞編碼的代碼如下:
from sklearn.preprocessing import OneHotEncoder #啞編碼,對IRIS數據集的目標值,返回值為啞編碼後的數據OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))
2.4 缺失值處理2.4.1 刪除缺失值2.4.2 數據補全用規則或模型將缺失數據補全,這種做法的缺點是可能會引入噪聲:
均值插補
採用同類值插補
建模預測
高維映射
多重插補
極大似然估計
壓縮感知及矩陣補全
2.4.3 忽略缺失值一些機器學習模型(如決策樹算法)能夠直接處理數據缺失的情況,在這種情況下不需要對缺失數據做任何的處理,這種做法的缺點是在模型的選擇上有局限。
3. 特徵選擇不同的特徵對模型的準確度的影響不同,有些特徵與要解決的問題不相關,有些特徵是冗餘信息,這些特徵都應該被移除掉。
特徵選擇是自動地選擇出對於問題最重要的那些特徵子集的過程。進行特徵選擇有兩個重要原因:
特徵選擇必須確保不丟失重要信息,若重要信息缺失則學習效果會大打折扣。常見的特徵選擇方法大致分為三類:過濾式(filter)、包裹式(wrapper)、嵌入式(embedding)。
3.1 過濾式選擇過濾式特徵選擇按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵。
3.1.1 方差選擇法方差很小的屬性,意味著該屬性的識別能力很差。極端情況下,方差為0,意味著該屬性在所有樣本上都是一個值,可以通過scikit-learn提供的VarianceThreshold來剔除。
from sklearn.feature_selection import VarianceThreshold #方差選擇法,返回值為特徵選擇後的數據#參數threshold為方差的閾值VarianceThreshold(threshold=3).fit_transform(data)
threshold:一個浮點數,指定方差的閾值,低於此閾值的將被剔除。
data:樣本數據。
fit_transform:從樣本數據中學習方差,然後執行特徵選擇。
3.1.2 單變量特徵提取使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的P值。用feature_selection庫的SelectKBest類結合相關係數來選擇特徵的代碼如下:
from sklearn.feature_selection import SelectKBest,f_classifX=[[1,2,3,4,5], [5,4,3,2,1], [3,3,3,3,3], [1,1,1,1,1]] ]y=[0,1,0,1]selector = SelectKBest(score_func=f_classif,k=3)selector.fit(X,y)
SelectKBest:保留在該統計指標上得分最高的K個特徵。
score_func:給出統計指標的函數,其參數為數組X和數組y,返回值為(score,pvalues)。
f_classif:根據方差分析,ANOVA的原理,依靠F-分布為概率分布的依據,利用平方和與自由度所計算的組間與組內均方估計出F值,適用於分離問題。
3.2 包裹式選擇包裹式特徵選擇根據目標函數(通常是預測效果評分),每次選擇若干特徵,或者排除若干特徵。這類方法的核心思想在於,給定了某種模型,及預測效果評價的方法,然後針對特徵空間中的不同子集,計算每個子集的預測效果,效果最好的,即作為最終被挑選出來的特徵子集。注意集合的子集是一個指數的量級,故此類方法計算量較大。故而針對如何高效搜索特徵空間子集,就產生了不同的算法。其中有一種簡單有效的方法叫貪婪搜索策略,包括前向選擇與後向刪除。在前向選擇方法中,初始化一個空的特徵集合,逐步向其中添加新的特徵,如果該特徵能提高預測效果,即得以保留,否則就扔掉。後向刪除即是說從所有特徵構成的集合開始,逐步刪除特徵,只要刪除後模型預測效果提升,即說明刪除動作有效,否則就還是保留原特徵。要注意到,包裹式方法要求針對每一個特徵子集重新訓練模型,因此計算量還是較大的。
通常,將過濾式方法的高效與包裹式方法的高準確率進行結合,可得到更優的特徵子集。混合特徵選擇過程一般由兩個階段組成:
1)使用Filter方法初步剔除大部分無關或噪聲特徵,只保留少量特徵,從而有效地減小後續搜索過程的規模。
2)將剩餘的特徵連同樣本數據作為輸入參數傳遞給Wrapper選擇方法,以進一步優化選擇重要的特徵。
遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。使用feature_selection庫的RFE類來選擇特徵的代碼如下:
from sklearn.feature_selection import RFEfrom sklearn.linear_model import LogisticRegression#遞歸特徵消除法,返回特徵選擇後的數據#參數estimator為基模型#參數n_features_to_select為選擇的特徵個數RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(data, target)
estimator: 一個學習器,它必須提供一個fit方法和一個coef_屬性。
n_features_to_select:一個整數或None,指定要選出幾個特徵。如果為None,默認選取一半的特徵。
3.3 嵌入式選擇嵌入式特徵選擇先使用某些機器學習的算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於過濾式方法,但是是通過訓練來確定特徵的優劣。
scikit-learn提供了SelectFromModel來實現嵌入式特徵選取。SelectFromModel使用外部提供的estimator來工作。當某個特徵對應的coef或者feature_importance低於某個閾值時,該特徵將被移除。也可以不指定閾值,而使用啟發式的方法,如指定均值mean,指定中位數median或者指定這些統計量的倍數。
3.3.1 基於懲罰項的特徵選擇法使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。使用feature_selection庫的SelectFromModel類結合帶L1懲罰項的邏輯回歸模型,來選擇特徵的代碼如下:
from sklearn.feature_selection import SelectFromModelfrom sklearn.linear_model import LogisticRegression#帶L1懲罰項的邏輯回歸作為基模型的特徵選擇SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
3.3.2 基於樹模型的特徵選擇法樹模型中GBDT也可用來作為基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型,來選擇特徵的代碼如下:
from sklearn.feature_selection import SelectFromModelfrom sklearn.ensemble import GradientBoostingClassifier#GBDT作為基模型的特徵選擇SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
4. 降維當特徵選擇完成後,可以直接訓練模型了,但是可能由於特徵矩陣過大,導致計算量大,訓練時間長的問題,因此降低特徵矩陣維度也是必不可少的。常見的降維方法除了以上提到的基於L1懲罰項的模型以外,另外還有主成分分析法(PCA)和線性判別分析(LDA),線性判別分析本身也是一個分類模型。PCA和LDA有很多的相似點,其本質是要將原始的樣本映射到維度更低的樣本空間中,但是PCA和LDA的映射目標不一樣:PCA是為了讓映射後的樣本具有最大的發散性;而LDA是為了讓映射後的樣本有最好的分類性能。所以說PCA是一種無監督的降維方法,而LDA是一種有監督的降維方法。
4.1 主成分分析法(PCA)4.1.1 PCA原理Principal Component Analysis(PCA)是最常用的線性降維方法,它的目標是通過某種線性投影,將高維的數據映射到低維的空間中表示,並期望在所投影的維度上數據的方差最大,以此使用較少的數據維度,同時保留住較多的原數據點的特性。
通俗的理解,如果把所有的點都映射到一起,那麼幾乎所有的信息(如點和點之間的距離關係)都丟失了,而如果映射後方差儘可能的大,那麼數據點則會分散開來,以此來保留更多的信息。可以證明,PCA是丟失原始數據信息最少的一種線性降維方式。(實際上就是最接近原始數據,但是PCA並不試圖去探索數據內在結構)
設n維向量w為目標子空間的一個坐標軸方向(稱為映射向量),最大化數據映射後的方差,有:
其中m是數據實例的個數,
其中tr表示矩陣的跡,
A是數據協方差矩陣。
容易得到最優的W是由數據協方差矩陣前k個最大的特徵值對應的特徵向量作為列向量構成的。這些特徵向量形成一組正交基並且最好地保留了數據中的信息。
PCA的輸出就是Y = W『X,由X的原始維度降低到了k維。
PCA追求的是在降維之後能夠最大化保持數據的內在信息,並通過衡量在投影方向上的數據方差的大小來衡量該方向的重要性。但是這樣投影以後對數據的區分作用並不大,反而可能使得數據點揉雜在一起無法區分。這也是PCA存在的最大一個問題,這導致使用PCA在很多情況下的分類效果並不好。具體可以看下圖所示,若使用PCA將數據點投影至一維空間上時,PCA會選擇2軸,這使得原本很容易區分的兩簇點被揉雜在一起變得無法區分;而這時若選擇1軸將會得到很好的區分結果。
4.1.2 PCA代碼實現使用decomposition庫的PCA類選擇特徵的代碼如下:
from sklearn.decomposition import PCA#主成分分析法,返回降維後的數據#參數n_components為主成分數目PCA(n_components=2).fit_transform(iris.data)
4.2 線性判別分析法(LDA)4.2.1 LDA原理Linear Discriminant Analysis (也有叫做Fisher Linear Discriminant)是一種有監督的(supervised)線性降維算法。與PCA保持數據信息不同,LDA是為了使得降維後的數據點儘可能地容易被區分。
假設原始數據表示為X,(m*n矩陣,m是維度,n是sample的數量)
既然是線性的,那麼就是希望找到映射向量a,使得 a』X後的數據點能夠保持以下兩種性質:
舉一個直觀的例子,如下圖:紅色和藍色點代表數據分別屬於兩個不同類,與PAC最大化保持數據信息的思想不同,LDA會這樣降維這兩堆點
可以看到,雖然降維之後數據更加聚集了,但是更好區分了。
一般地,設有數據集D,投影向量為w,則點xi經過投影后為
投影前的樣本中心點為u,投影后的中心點為
我們希望投影后不同類別的樣本儘量離得較遠,使用度量值:
我們同時希望投影后相同類別的樣本之間儘量離得較近,使用度量值:
所以總的優化目標函數為:
J(W)自然是越大越好。
定義類內散度矩陣為:
定義類間散度矩陣:
所以
因為向量w的長度成比例改變不影響J的取值,所以我們令=1,那麼原優化目標就變為
使用拉格朗日乘子法,解得:
進一步解得:
4.2.2 LDA代碼實現使用lda庫的LDA類選擇特徵的代碼如下:
from sklearn.lda import LDA #線性判別分析法,返回降維後的數據#參數n_components為降維後的維數LDA(n_components=2).fit_transform(iris.data, iris.target)
4.3 PCA與LDA的對比PCA與LDA降維的對比:
PCA選擇樣本點投影具有最大方差的方向,LDA選擇分類性能最好的方向。
PCA技術的一個很大優點在於,它是完全無參數限制的。在PCA的計算過程中完全不需要人為的設定參數或是根據任何經驗模型對計算進行幹預,最後的結果只與數據相關,與用戶是獨立的。但是,這一點同時也可以看作是缺點。如果用戶對觀測對象有一定的先驗知識,掌握了數據的一些特徵,卻無法通過參數化等方法對處理過程進行幹預,可能會得不到預期的效果,效率也不高。
LDA以標籤類別衡量差異性的有監督降維方式,相對於PCA的模糊性,其目的更明確,更能反映樣本間的差異。缺點在於局限性大,受樣本種類限制,且至多可生成C-1維子空間(C為類別數量),也就是說LDA降維後的維度空間在[1,C-1],與原始特徵無關。因此,對於二分類問題,最多投影到1維。另外,LDA不適合對非高斯分布樣本進行降維。
參考資料博客/文檔:
http://www.cnblogs.com/jasonfreak/p/5448385.html
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html
https://www.zybuluo.com/gump88/note/402479
https://wenku.baidu.com/view/37055bd4a300a6c30d229f30.html
書籍:
教程:
數據前處理:http://scikit-learn.org/stable/modules/preprocessing.html
特徵選擇:http://scikit-learn.org/stable/modules/feature_selection.html
PCA:http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
LDA:http://scikit-learn.org/0.15/modules/generated/sklearn.lda.LDA.html
姚易辰,數據派研究部志願者,清華大學工程力學系博士生。天池大數據平臺top10選手,曾獲天池大數據IJCAI16口碑實體商戶推薦賽冠軍和菜鳥網絡最後一公裡極速配送冠軍,擅長數據分析及圖像處理。
數據派研究部成立於2017年初,志於打造一流的結構化知識分享平臺、活躍的數據科學愛好者社群,致力於傳播數據思維、提升數據能力、探索數據價值、實現產學研結合!
研究部的邏輯在於知識結構化、實踐出真知:梳理打造結構化基礎知識網絡;原創手把手教以及實踐經驗等文章;形成專業興趣社群,交流學習、組隊實踐、追蹤前沿。
興趣組是研究部的核心,各組既遵循研究部整體的知識分享和實踐項目規劃,又會各具特色:
算法模型組:積極組隊參加kaggle等比賽,原創手把手教系列文章;
調研分析組:通過專訪等方式調研大數據的應用,探索數據產品之美;
系統平臺組:追蹤大數據&人工智慧系統平臺技術前沿,對話專家;
自然語言處理組:重於實踐,積極參加比賽及策劃各類文本分析項目;
製造業大數據組:秉工業強國之夢,產學研政結合,挖掘數據價值;
數據可視化組:將信息與藝術融合,探索數據之美,學用可視化講故事;
網絡爬蟲組:爬取網絡信息,配合其他各組開發創意項目。
點擊文末「閱讀原文」,報名數據派研究部志願者,總有一組適合你~
轉載須知
如需轉載文章,請做到 1、正文前標示:轉自數據派THU(ID:DatapiTHU);2、文章結尾處附上數據派二維碼。
申請轉載,請發送郵件至datapi@tsingdata.com
公眾號底部菜單有驚喜哦!
企業,個人加入組織請查看「聯合會」
往期精彩內容請查看「號內搜」
加入志願者或聯繫我們請查看「關於我們」