機器學習中的特徵建模(特徵工程)和算法選型建模 - 以暴力破解識別爲例

cataloguehtml

1. 特徵工程是什麼?有什麼做用?
2. 特徵獲取方案 - 如何獲取這些特徵?
3. 特徵觀察 - 運用各類統計工具、圖標等工具幫助咱們從直觀和精確層面認識特徵中的機率分佈
4. 特徵處理 - 特徵清洗
5. 特徵護理 - 特徵預處理
6. 特徵處理 - 特徵選擇
7. 特徵監控

 

1. 特徵工程是什麼?有什麼做用?算法

從某種程度上來講,數據和特徵決定了機器學習的上限,而模型和算法能作的只是逼近這個上限。特徵工程本質上是一項工程活動,目的是最大限度地從原始數據中提取特徵以供算法和模型使用編程

咱們本章圍繞該xmin思惟導圖展開討論windows

Relevant Link:數組

http://www.cnblogs.com/jasonfreak/p/5448385.html
http://weibo.com/ttarticle/p/show?id=2309403973170330790744

 

2. 特徵獲取方案 - 如何獲取這些特徵?安全

0x1: 結合具體業務場景從原始日誌中提取特徵 - 結合業務!業務!業務!服務器

在大部分時候咱們從產品中獲得的原始日誌都不能直接進行數據挖掘,咱們須要進行特徵提取,但特徵提取也不能簡單的直接就粗暴地分爲數字型/文本型/序列型等等,這一步的思考很是重要,咱們須要明確咱們的業務場景細節,以及業務目標網絡

以暴力破解識別爲具體場景咱們展開討論:session

1. 咱們的日誌從哪裏來?是什麼形式的?app

對於網絡層面的數據,咱們的原始日誌經常是Gateway網絡採集的原始五元組數據,包含

session_time: '會話發生時間'
src_ip: '源IP'
src_port: '源端口'
dst_ip: '目的IP'
dst_port: '目的端口'

樣本的形式是字符串型的,可是要注意到的五元組單條日誌自己是不包含"異常特徵"規律的,也即規律不在原始日誌自己,而在於多條原始日誌內的統計分佈規律,只有將原始日誌進行良好的聚合才能將包含爆破特徵的規律暴露出來

2. 從攻防業務角度初步觀測暴力破解的規律特徵是怎樣的?

咱們將發起暴力破解的機器設定爲攻擊者(無論是主動行爲仍是被入侵後淪爲肉雞的狀況),從攻擊者角度看暴力破解有2種方式:

1. 針對單點目標的深度破解;
2. 針對大範圍(經常是B/C段)目標的廣度破解;

思考清楚了這2點,能夠指導咱們在觀測樣本數據的時候抓住哪些重點,即觀察發生爆破安全事件的時候,有哪些樣本日誌含有廣度特徵,有哪些樣本日誌含有深度特徵。特徵提取分析的第一步是要在瞭解業務場景的前提下觀察樣本數據的特徵分佈,這一步前期調研很重要,它能夠幫助咱們判斷後續用什麼模型進行抽象建模,用什麼算法進行計算

咱們以暴力破解廣度掃描爲例觀測一組存在異常事件的服務器和一臺不存在安全事件的服務器,在一天中按照30min爲原子時間窗口進行切分, 在初始階段,咱們還不能很是好的定義咱們的特徵提取範圍,根據業務的理解直覺,咱們先嚐試用最簡單的【src_ip;dst_port;protocal(協議)】三元組進行時間窗口區間內的發包頻率攻擊目標dst_ip的廣度統計,來獲取樣本數據總體上的特徵分佈判斷

src_ip,proto,dst_port,dst_ip_cn,send_cn,timeindex
106.14.xxx.xx,tcp,22,7012,7012,3

106.14.xxx.xx,udp,65500,8,8,3
106.14.xxx.xx,udp,65500,4,4,4

106.14.xxx.xx,tcp,80,1,1,0
106.14.xxx.xx,tcp,80,6,6,3
106.14.xxx.xx,tcp,80,82,82,4
106.14.xxx.xx,tcp,80,1,1,10
106.14.xxx.xx,tcp,80,1,1,14
106.14.xxx.xx,tcp,80,2,2,16
106.14.xxx.xx,tcp,80,1,1,18
106.14.xxx.xx,tcp,80,1,1,19
106.14.xxx.xx,tcp,80,1,1,31
106.14.xxx.xx,tcp,80,1,1,33
106.14.xxx.xx,tcp,80,1,1,34

106.14.xxx.xx,tcp,9183,1,1,42

這該ip的全天五元組日誌中,咱們已知該機器當前發生了:22端口暴力掃描行爲,能夠看到存在異常的樣本聚合後,特徵比較明顯,即在較短的時間窗口內產生大量對外發包頻率,以及對較多的dst_ip發起發包行爲。而該服務器其餘的正常通訊行爲則呈現出少且均勻的對外發包曲線

咱們挑選一個不存在異常行爲的服務器進行頻次聚合統計

src_ip,proto,dst_port,dst_ip_cn,send_cn,timeindex
114.215.175.203,tcp,22,1,1,29

114.215.175.203,tcp,443,2,2,0

由此證明了咱們的猜測,暴力破解的特徵提取要從發包頻次和攻擊目標dst_ip廣度重點入手

0x2: 定義特徵模型,咱們該從原始日誌樣本中抽取哪些特徵?

對於這個問題,有一個專門的研究分支叫"feature selection(特徵選擇)",彷佛能夠先將全部能想到的特徵都抽出來,而後用例如相關性分析、信息增益、互信息這些評價指標來選擇對算法模型分類效果最好的一系列特徵。但我我的認爲,特徵選擇和提取的最好人選仍是熟悉業務的人來完成,這個過程能夠說是很是依賴經驗的參與,咱們要在理解業務背景的基礎上,將人的判別經驗沉澱爲須要提取的特徵

以暴力破解爲例,咱們來嘗試定義出一組樣本特徵(對每30min時間區間內的全部原始日誌按照不一樣的維度進行聚合)

廣度暴力破解特徵

1. proto:協議類型(tcp、udp):不一樣的網絡協議可能致使咱們以後要爲每一個協議單獨建模,可是也有可能在一個模型中同窗擬合2個協議樣本集的特徵
2. dst_port:目標端口,表明了目標主機的網絡服務類型,從業務經驗上看,對22這種sshd服務端口發起的密集發包行爲比對一個很是用端口發起的密集發包更傾向於在暴力破解,咱們抽取這個特徵的目的是須要模型儘可能學習到不一樣的dst_port目的端口(表明了不一樣的服務)對判斷結果的權重是不同的
3. count(相同 dst_port):在一個時間統計窗口內和當前鏈接具備相同服務(無論dst_ip是否相同)的發包頻數,這個特徵體現了暴力破解攻擊的強度
4. count(distinct dst_ip 去重):在一個時間統計窗口內攻擊的目標主機的個數,這個特徵體現了廣度暴力破解攻擊的範圍廣度
5. max(session_time) - min(session_time):在一個時間統計窗口內和當前鏈接具備相同服務的攻擊包,第一個發包時間和最後一個發包時間的間隔,該特徵越接近於時間窗口大小,代表攻擊的持續性越強

深度暴力破解特徵

1. proto:協議類型(tcp、udp):不一樣的網絡協議可能致使咱們以後要爲每一個協議單獨建模,可是也有可能在一個模型中同窗擬合2個協議樣本集的特徵
2. count(相同 dst_ip):在一個時間統計窗口內和當前鏈接具備相同目標主機(不論dst_port是否相同)的發包頻數,這個特徵體現了暴力破解攻擊的強度
3. count(distinct dst_port 去重):在一個時間統計窗口內攻擊同一個目標主機的服務端口的個數,這個特徵體現了深度暴力破解攻擊的範圍
4. max(session_time) - min(session_time):在一個時間統計窗口內和當前鏈接具備相同目標主機的攻擊包,第一個發包時間和最後一個發包時間的間隔,該特徵越接近於時間窗口大小,代表攻擊的持續性越強

關於聚合的time windows的長度,讀者也須要根據具體的業務場景仔細思考,對於暴力破解來講,爆破事件的特徵規律是包含在一個時間窗口內的頻率統計特徵,可是對每一個安全事件而言,攻擊的持續時間是不一樣的,這就致使每一個樣本的length是變長的,咱們須要對日級別的時間區間統計特徵進行定長的切分,例如:按照30min爲一個原子時間窗口,將樣本集中在這個time windows內的全部原始日誌聚合成單條特徵向量(具體狀況視原始數據採樣能力和算法模型而定)

Relevant Link:

https://mp.weixin.qq.com/s?__biz=MzA5NzkxMzg1Nw==&mid=2653159305&idx=1&sn=077410cb7d95af0c343a13dbbd4e53fc&mpshare=1&scene=1&srcid=0510gYeDGwNdlniGYhamMGjn#wechat_redirect

 

3. 特徵觀察 - 運用各類統計工具、圖標等工具幫助咱們從直觀和精確層面認識特徵中的機率分佈

拿到樣本特徵以後,咱們可能須要作的是觀察樣本的特徵機率分佈、是否包含異常/離羣點、空間分佈上大體分爲幾個族羣等

0x1: 直方圖統計法

直方圖是在圖像處理上很常見也頗有效的方法,它能夠認爲是圖像灰度密度函數的近似。直方圖雖然不能直接反映出圖像內容,但對它進行分析能夠得出圖像的一些有用特徵,這些特徵能反映出圖像的特色。例如:當圖像對比度較小時,它的灰度直方圖只在灰度軸上較小的一段區間上非零

1. 較暗的圖像因爲較多的像素灰度值低,所以它的直方圖的主體出如今低值灰度區間上,其在高值灰度區間上的幅度較小或爲零
2. 而較亮的圖像狀況正好相反

爲使圖像變清晰,能夠經過變換使圖像的灰度動態範圍變大,而且讓灰度頻率較小的灰度級經變換後,其頻率變得大一些,使變換後的圖像灰度直方圖在較大的動態範圍內趨於均化。一樣,區分度(對比度)這個概念也一樣適用於非圖像分類領域,在直方圖上低頻區間和高頻區間的間隔越大,對於分類器的訓練越容易

下面是kdd99的特徵直方圖

從直方圖上咱們能夠得出一個大體的判斷,特徵選取(feature selection)要儘可能選擇在直方圖區間上分佈較離散的特徵(在分類問題場景中)

0x2: 經驗機率密度圖

經典統計推斷主要的思想就是用樣原本推斷整體的狀態,由於整體是未知的(即真實的規律是未知的),咱們只能經過屢次試驗的樣本(即實際值)來推斷整體。經驗分佈函數是在這一思想下的一種方法,經過樣本分佈函數來估計整體的分佈函數。

若已知機率分佈函數F(x)或機率密度函數p(x),便能解決大部分統計推斷的問題,但問題是機率分佈函數F(x)未知,這自己就是咱們但願經過算法推斷出來的結果
爲了解決這個問題,依泛函空間的大數定律得出:可經過該未知分佈函數下的樣本集{xi}構造的經驗分佈函數 F_{l}(x) 依機率收斂去逼近F(x)。而後,經過積分方程: \int_{-\infty }^{x}p(t)dt=F_{l}(x)  的求解,得出機率密度函數p(x);
須要特別注意的,該積分方程的求解是一個不適定計算問題,需使用正則化技術才能較好處理。也就是最大似然估計中的 經驗風險結構化風險
下面以KDD99樣本集爲例

能夠看到,在這個特徵的經驗分佈中,不一樣類型的樣本集仍是大體可分的,同時,在左邊的mascan和netpture存在一個混淆區,在個該維度上基本不可分了,這會帶來必定誤報;同時在右邊guess_passwd出現了一個小的波峯(peak mode),它可能表明了一些異常點樣本點,可能暗示咱們在進行後續的特徵處理環節須要進行離羣點過濾

0x3: 統計樣本特徵各個離散值的離散度、gini指數、信息增益

gini指數、信息增益都來自於香濃信息論中的混亂度的概念,值越大,體現當前樣本的混亂度越大(區分度也越大)

從圖上能夠看到,該特徵離散值從0到100區間,gini指數逐漸降低,即指示若是用決策樹或者其餘分類器,分界線設定在這個區間內才能得到有效的信息增益

同時在100到109區間中,樣本在這個區間內只有一個單一的類別,分界線不該該選取在這個區間中,由於不能進行任何有效分類

在109到101區間,樣本在這個區間有有了不一樣的類別,即有必定的混亂度,特徵分界面能夠考慮在這個區間選取

0x4: Measures of Shape: Skewness and Kurtosis

Skewness 是描述數據分佈是否對稱的指標。越對稱的分佈,skewness越小。該指標能夠暗示咱們是否要進行特徵標準化處理

Kurtosis 是用來描述數據是否heavy tail,若是一個分佈異常點不少或者很長尾,那麼其kurtosis也越大。該指標能夠用於評估在該特徵維度上離羣樣本的密度 結合直方圖,能夠很好解釋這兩個指標的意義

Relevant Link:

https://brownmath.com/stat/shape.htm

 

4. 特徵處理 - 特徵清洗

經過理解業務場景,深刻觀察樣本數據後,咱們創建了初步的特徵模型,並據此抽取出了一些訓練樣本,但此時還不能盲目直接進入算法建模,咱們還須要繼續深刻觀察樣本,思考其中是否包含了異常離羣數據、是否須要進行無量綱化處理?

0x1: 清洗異常樣本

日誌數據中可能存在對挖掘無用的噪音數據或者因爲系統異常出現的異常樣本數據,這須要咱們結合業務狀況和專家領域知識進行清洗過濾

除告終合業務經驗以外,還能夠採用異常點檢測算法對樣本進行分析,經常使用的異常點檢測算法包括

1. 誤差檢測:例如
    1) 聚類
    2) 最近鄰等 
2. 基於統計的異常點檢測算法:這種方法適合於挖掘單變量的數值型數據,經常使用的方法有
    1) 極差(又稱全距(Range)):是用來表示統計資料中的變異量數(measures of variation) ,其最大值與最小值之間的差距
    2) 四分位數間距:四分位距一般是用來構建箱形圖,以及對機率分佈的簡要圖表概述
    3) 均差
    4) 標準差等
3. 基於距離的異常點檢測算法,主要經過距離方法來檢測異常點,將數據集中與大多數點之間距離大於某個閾值的點視爲異常點,主要使用的距離度量方法有
    1) 絕對距離(曼哈頓距離)
    2) 歐氏距離
    3) 馬氏距離等方法。
4. 基於密度的異常點檢測算法,考察當前點周圍密度,能夠發現局部異常點,例如LOF算法

暴力破解場景中不存在自己是正常程序卻發起對外密集發包的狀況,因此不須要進行異常樣本清洗

0x2: 特徵採樣

機器學習模型要求正負樣本數量相差很少,而安全事件場景中發生暴力破解的狀況畢竟是極少的幾個,因此還要對負樣本進行採樣。否則會致使負樣本(正常狀況樣本)主導了參數調優過程,而忽略核心的正樣本的判別效果。

當正樣本數量遠少於負樣本的時候,即便訓練和測試精確率到了99.99%,也多是由於正樣本被分錯了正好在那0.01%內,而致使整個模型面對真實線上樣本的時候表現很是差

Relevant Link:

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

 

5. 特徵護理 - 特徵預處理

經過特徵提取,咱們能獲得未經處理的特徵,這時的特徵可能有如下問題:

1. 不屬於同一量綱:即特徵的取值範圍不同,不可以放在一塊兒比較。無量綱化能夠解決這一問題
2. 信息冗餘:對於某些定量特徵,其包含的有效信息爲區間劃分,例如學習成績,倘若只關心「及格」或不「及格」,那麼須要將定量的考分,轉換成「1」和「0」表示及格和未及格。二值化能夠解決這一問題
3. 定性特徵不能直接使用:某些機器學習算法和模型只能接受定量特徵的輸入,那麼須要將定性特徵轉換爲定量特徵。最簡單的方式是爲每一種定性值指定一個定量值,可是這種方式過於靈活,增長了調參的工做。一般使用啞編碼的方式(即one-hot編碼思路)將定性特徵轉換爲定量特徵
    1) 假設有N種定性值,則將這一個特徵擴展爲N種特徵,當原始特徵值爲第i種定性值時,第i個擴展特徵賦值爲1,其餘擴展特徵賦值爲0
    2) 啞編碼的方式相比直接指定的方式,不用增長調參的工做,對於線性模型來講,使用啞編碼後的特徵可達到非線性的效果
4. 存在缺失值:缺失值須要補充
5. 信息利用率低:不一樣的機器學習算法和模型對數據中信息的利用是不一樣的,例如在線性模型中,使用對定性特徵啞編碼能夠達到非線性的效果。相似地,對定量變量多項式化,或者進行其餘的轉換,都能達到非線性的效果 

咱們使用sklearn中的preproccessing庫來進行數據預處理,能夠覆蓋以上問題的解決方案。咱們來逐一討論下,而後再討論本例中的暴力破解要如何進行特徵預處理

進行無量鋼化處理有一點要特別注意,必定要仔細區分「異常點」和「無量鋼化」問題,若是是由於觀測採樣形成的異常點,是不能簡單地進行無量鋼化處理的,不然會影響到樣本自己的機率分佈

0x1: sklearn進行特徵預處理的編程方法

1. 無量綱化

對於量綱不一致會影響模型訓練效率和效果的問題,能夠參閱這篇文章的第一章

無量綱化使不一樣規格的數據轉換到同一規格,下面咱們逐一介紹經常使用的無量綱化方法

標準化(z-score 標準化(zero-mean normalization))

標準化的前提是特徵值服從正態分佈,標準化後,其轉換成標準正態分佈。標準化須要計算特徵的均值和標準差,公式表達爲:

使用preproccessing庫的StandardScaler類對數據進行標準化的代碼以下:

from sklearn.preprocessing import StandardScaler

#標準化,返回值爲標準化後的數據
StandardScaler().fit_transform(iris.data)

z-score標準化方法適用於屬性A的最大值和最小值未知的狀況,或有超出取值範圍的離羣數據的狀況

咱們的目的是根據樣本訓練分類器,並非具體關心樣本內某一個屬性的絕對值,而是關注不一樣樣本之間的相對值區別,所以z-score標準化不會影響到最後分類器的效果

區間縮放法(歸一化)(min-max標準化(Min-max normalization)) 

區間縮放法利用了邊界值信息,將特徵的取值區間縮放到某個特色的範圍,例如[0, 1]等。區間縮放法的思路有多種,常見的一種爲利用兩個最值進行縮放,公式表達爲:

使用preproccessing庫的MinMaxScaler類對數據進行區間縮放的代碼以下:

from sklearn.preprocessing import MinMaxScaler

#區間縮放,返回值爲縮放到[0, 1]區間的數據
MinMaxScaler().fit_transform(iris.data)

正則化(Normalization)

正則化的過程是將每一個樣本縮放到單位範數(每一個樣本的範數爲1),若是後面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的類似性這個方法會頗有用。Normalization主要思想是對每一個樣本計算其p-範數,而後對該樣本中每一個元素除以該範數,這樣處理的結果是使得每一個處理後樣本的p-範數等於1。

p-範數的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p

該方法主要應用於文本分類和聚類中。例如,對於兩個TF-IDF向量的l2-norm進行點積,就能夠獲得這兩個向量的餘弦類似性

>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')
 
>>> X_normalized                                      
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])

2. 數據變換

常見的數據變換有基於多項式的、基於指數函數的、基於對數函數的

Logistic/Softmax變換(尺度變化函數

經常使用於邏輯斯蒂迴歸和深度神經網絡中,用於將輸出層結果壓縮到[0,1]的機率區間範圍內。這本質上是一種特徵數值壓縮方法

3. 連續特徵離散化

對定量特徵二值化

定量特徵二值化的核心在於設定一個閾值,大於閾值的賦值爲1,小於等於閾值的賦值爲0,公式表達以下:

使用preproccessing庫的Binarizer類對數據進行二值化的代碼以下:

from sklearn.preprocessing import Binarizer

#二值化,閾值設置爲3,返回值爲二值化後的數據
Binarizer(threshold=3).fit_transform(iris.data)

4. 缺失值處理

缺失值計算

在通常狀況下,在一個採集機制良好的系統中,樣本集中不會存在缺失值,缺失值的發生可能在於咱們對原始數據進行了一些聚合的join處理後,左/右表出現的缺失值;或者是在cnn圖像處理時在邊緣出現缺失值。這個時候咱們須要根據業務場景具體需求補充缺失值,或者採集通用作法補零

0x2: 對於暴力破解識別場景來講須要作哪些特徵處理?

對暴力破解場景來講,須要進行特徵的問題可能有以下幾個

1. 問題3,在廣播破解模型中,dst_port目標端口這個特徵是一個數字,也許須要經過one-hot的思路將其擴展成必定數量的特徵,每一個特徵表明了一個服務類型,例如若是dst_port = 22,即在ssh特徵置一,其餘置零。但這裏問題是目標端口服務可能不可枚舉,會有愈來愈多的服務加入進來,對建模來講存在困難。這步能夠放到模型調優階段去考慮
2. 在一個時間區間內的頻數從十幾到幾千不等,這裏須要進行z-score標準化處理,將頻數壓縮到標準正態分佈
3. 用於標識使用協議的"tcp""udp"須要數值化爲1(tcp)和2(udp)

Relevant Link:

http://blog.csdn.net/pipisorry/article/details/52247379
http://www.cnblogs.com/chaosimple/p/4153167.html 

 

6. 特徵處理 - 特徵選擇

數據預處理完後第一步爲分析數據,對數據總體結構有一個大體的把握,每種類型數據有本身特定的分析方式,這裏咱們將數據分爲:

1. 類別型:輸出餅圖,觀察樣本數據分佈,作頻繁項分析
2. 連續型(暴力破解頻數也屬於連續型,離散頻數也屬於連續的一種特例):輸出直方圖、KDE圖、CDF圖,作迴歸分析
3. 日期型
4. 單詞型:輸出詞頻
5. 文本型

這裏以暴力破解爲例,打印頻數特徵的散點分佈圖來觀察樣本特徵的空間距離分佈,重點考察標準化後樣本數據是否含有必定的正態分佈特性

z-score標準化前:

z-score標準化後:

當對數據有一個大體理解後,咱們須要選擇有意義的特徵輸入機器學習的算法和模型進行訓練。一般來講,從兩個方面考慮來選擇特徵:

1. 特徵是否發散:若是一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差別,這個特徵對於樣本的區分並無什麼貢獻
2. 特徵與目標的相關性:這點比較顯見,與目標相關性高的特徵,應當優選選擇 

特徵選擇的目標是尋找最優特徵子集。特徵選擇能剔除不相關(irrelevant)或冗餘(redundant )的特徵,從而達到減小特徵個數,提升模型精確度,減小運行時間的目的。另外一方面,選取出真正相關的特徵簡化模型,協助理解數據產生的過程。特徵選擇的通常過程以下圖所示:

下面討論特徵選擇-產生過程和生成特徵子集方法

0x1: Filter過濾法 - 與具體模型無關,而只關注自變量和因變量之間的關聯

按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵

1. 方差/標準差 - 體現發散性的數學評價標準

咱們知道,若是一個特徵對應的樣本取值發散度越大,說明這個特徵在不一樣樣本間的差別性越明顯,根據該特徵訓練獲得的分類器效果也越好

使用方差選擇法,先要計算各個特徵的方差,而後根據閾值,選擇方差大於閾值的特徵。使用feature_selection庫的VarianceThreshold類來選擇特徵的代碼以下

# -*- coding: utf-8 -*-

from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris

if __name__ == '__main__':
    iris = load_iris()

    print "iris.data: ", iris.data[:5]

    # 方差選擇法,返回值爲特徵選擇後的數據
    # 參數threshold爲方差的閾值
    res = VarianceThreshold(threshold=3).fit_transform(iris.data)

    print "VarianceThreshold: ", res[:5]

iris.data:  [[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
VarianceThreshold:  [[ 1.4]
 [ 1.4]
 [ 1.3]
 [ 1.5]
 [ 1.4]]

能夠看到,設定了方差爲3後,鳶尾花的樣本特徵中的第三個特徵被filter出來,代表第三列這個特徵的離散方差最大

2. 相關係數法

使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的P值。用feature_selection庫的SelectKBest類結合相關係數來選擇特徵的代碼以下

# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
from numpy import *

if __name__ == '__main__':
    iris = load_iris()

    print "iris.data: ", iris.data[:5]

    # 選擇K個最好的特徵,返回選擇特徵後的數據
    # 第一個參數爲計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項爲第i個特徵的評分和P值。在此定義爲計算相關係數
    # 參數k爲選擇的特徵個數
    res = SelectKBest(lambda X, Y: tuple(map(tuple,array(list(map(lambda x:pearsonr(x, Y), X.T))).T)), k=2).fit_transform(iris.data, iris.target)
    print res[:5]

iris.data:  [[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
[[ 1.4  0.2]
 [ 1.4  0.2]
 [ 1.3  0.2]
 [ 1.5  0.2]
 [ 1.4  0.2]]

3. 卡方檢驗

經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。假設自變量有N種取值,因變量有M種取值,考慮自變量等於i且因變量等於j的樣本頻數的觀察值與指望的差距,構建統計量:

這個統計量的含義簡而言之就是自變量對因變量的相關性。用feature_selection庫的SelectKBest類結合卡方檢驗來選擇特徵的代碼以下:

# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from numpy import *

if __name__ == '__main__':
    iris = load_iris()

    print "iris.data: ", iris.data[:5]

    # 選擇K個最好的特徵,返回選擇特徵後的數據
    res = SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
    print "SelectKBest: ", res[:5]

iris.data:  [[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
SelectKBest:  [[ 1.4  0.2]
 [ 1.4  0.2]
 [ 1.3  0.2]
 [ 1.5  0.2]
 [ 1.4  0.2]]

能夠看到,卡方檢驗得出特徵三、4的相關性最大,這和咱們用線性模型分析相關R指數的結果一致

4. 互信息法(信息增益)- 信息熵原理

經典的互信息也是評價定性自變量對定性因變量的相關性的,互信息計算公式以下:

爲了處理定量數據,最大信息係數法被提出,使用feature_selection庫的SelectKBest類結合最大信息係數法來選擇特徵的代碼以下

# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from minepy import MINE
from numpy import *

#因爲MINE的設計不是函數式的,定義mic方法將其爲函數式的,返回一個二元組,二元組的第2項設置成固定的P值0.5
def mic(x, y):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), 0.5)

if __name__ == '__main__':
    iris = load_iris()

    print "iris.data: ", iris.data[:5]

    # 選擇K個最好的特徵,返回特徵選擇後的數據
    res = SelectKBest(lambda X, Y: array(map(lambda x: mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
    print "SelectKBest: ", res[:5]

0x2: Wrapper包裝法 - 依賴具體模型,經過目標函數來決定是否加入一個特徵

根據目標函數(一般是預測效果評分),每次選擇若干特徵,或者排除若干特徵,即

1. 序列前向選擇( SFS , Sequential Forward Selection )
從空集開始,每次加入一個選最優。

2. 序列後向選擇( SBS , Sequential Backward Selection )
從全集開始,每次減小一個選最優。

3. 增L去R選擇算法 ( LRS , Plus-L Minus-R Selection )
從空集開始,每次加入L個,減去R個,選最優(L>R)或者從全集開始,每次減去R個,增長L個,選最優(L<R)。

關於特徵的選取能夠參閱這篇文章迴歸變量的選擇與逐步迴歸 - 創建多元線性迴歸模型前怎麼去作特徵工程部分的討論

0x3: Embedded集成法 - 學習器自身自動選擇特徵

集成法,先使用某些機器學習的算法和模型進行訓練,獲得各個特徵的權值係數,根據係數從大到小選擇特徵。相似於Filter方法,可是是經過訓練模型以後來肯定特徵的優劣。深度神經網絡的一個很重要的優點就是算法能在訓練過程當中自動選擇特徵

1. 基於L1/L2懲罰項的特徵選擇法

2. 基於樹模型的特徵選擇法

樹模型中GBDT也可用來做爲基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型,來選擇特徵的代碼以下:

# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
from numpy import *

if __name__ == '__main__':
    iris = load_iris()

    print "iris.data: ", iris.data[:5]

    # GBDT做爲基模型的特徵選擇
    res = SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
    print "RFE: ", res[:5]

iris.data:  [[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
RFE:  [[ 1.4  0.2]
 [ 1.4  0.2]
 [ 1.3  0.2]
 [ 1.5  0.2]
 [ 1.4  0.2]]

0x4: 降維 - 獲取一個和原始特徵空間分類效果等價的子特徵空間

在一些狀況下,可能會出現因爲特徵矩陣過大,致使計算量大,訓練時間長的問題,所以下降特徵矩陣維度也是必不可少的。常見的降維方法有

1. 基於L1懲罰項的模型
2. 主成分分析法(PCA):PCA和LDA有不少的類似點,其本質是要將原始的樣本映射到維度更低的樣本空間中,可是PCA和LDA的映射目標不同:PCA是爲了讓映射後的樣本具備最大的發散性;而LDA是爲了讓映射後的樣本有最好的分類性能。因此說PCA是一種無監督的降維方法,而LDA是一種有監督的降維方法
3. 線性判別分析(LDA):線性判別分析自己也是一個分類模型。

PCA和LDA有不少的類似點,其本質是要將原始的樣本映射到維度更低的樣本空間中,可是PCA和LDA的映射目標不同:PCA是爲了讓映射後的樣本具備最大的發散性;而LDA是爲了讓映射後的樣本有最好的分類性能。因此說PCA是一種無監督的降維方法,而LDA是一種有監督的降維方法。

1. 主成分分析法(PCA)

使用decomposition庫的PCA類選擇特徵的代碼以下

# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from numpy import *

if __name__ == '__main__':
    iris = load_iris()

    print "iris.data: ", iris.data[:5]

    # 主成分分析法,返回降維後的數據
    # 參數n_components爲主成分數目
    res = PCA(n_components=2).fit_transform(iris.data)
    print res[:5]

iris.data:  [[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
PCA:  [[-2.68420713  0.32660731]
 [-2.71539062 -0.16955685]
 [-2.88981954 -0.13734561]
 [-2.7464372  -0.31112432]
 [-2.72859298  0.33392456]]

2. 線性判別分析法(LDA)

使用lda庫的LDA類選擇特徵的代碼以下:

# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris
from sklearn.lda import LDA
from numpy import *

if __name__ == '__main__':
    iris = load_iris()

    print "iris.data: ", iris.data[:5]

    # 線性判別分析法,返回降維後的數據
    # 參數n_components爲降維後的維數
    res = LDA(n_components=2).fit_transform(iris.data, iris.target)
    print "PCA: ", res[:5]

iris.data:  [[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
PCA:  [[-8.0849532   0.32845422]
 [-7.1471629  -0.75547326]
 [-7.51137789 -0.23807832]
 [-6.83767561 -0.64288476]
 [-8.15781367  0.54063935]]

對於暴力破解這個場景來講,咱們提取出的特徵數量較少,同時從業務理解上看都和判別有較好的因果關係,所以不須要進行特徵選擇步驟

Relevant Link:

https://www.zhihu.com/question/29316149
https://zhuanlan.zhihu.com/p/27076389
http://blog.csdn.net/onlyqi/article/details/50843541
http://blog.csdn.net/onlyqi/article/details/50844826 
http://www.cnblogs.com/jasonfreak/p/5448385.html

 

7. 特徵監控

在機器學習任務中,特徵很是重要。對於重要的特徵進行監控與有效性分析,瞭解模型所用的特徵是否存在問題,當某個特別重要的特徵出問題時,須要作好備案,防止災難性結果。須要創建特徵有效性的長效監控機制

Relevant Link:

https://tech.meituan.com/machinelearning-data-feature-process.html

Copyright (c) 2017 LittleHann All rights reserved

相關文章
相關標籤/搜索