發布時間: 2019-09-19 10:12:28
特征是數據中抽取出來的對結果預測有用的信息,可以是文本或者數據。特征工程是使用專業背景知識和技巧處理數據,使得特征能在機器學習算法上發揮更好的作用的過程。過程包含了特征抽取、特征預處理、特征選擇等過程。
sklearn是機器學習中一個常用的python第三方模塊,網址:http://scikit-learn.org/stable/index.html ,里面對一些常用的機器學習方法進行了封裝,在進行機器學習任務時,并不需要每個人都實現所有的算法,只需要簡單的調用sklearn里的模塊就可以實現大多數機器學習任務。
機器學習任務通常包括特征工程、分類(Classification)和回歸(Regression),常用的分類器包括SVM、KNN、貝葉斯、線性回歸、邏輯回歸、決策樹、隨機森林、xgboost、GBDT、boosting、神經網絡NN。
常見的降維方法包括TF-IDF、主題模型LDA、主成分分析PCA等等
以下特征工程使用sklearn來實現
數據準備包括數據采集、清洗、采樣
1,數據采集:數據采集前需要明確采集哪些數據,一般的思路為:
- 哪些數據對最后的結果預測有幫助?
- 數據我們能夠采集到嗎?
- 線上實時計算的時候獲取是否快捷?
2,數據清洗: 數據清洗就是要去除臟數據,就是對有問題的數據進行預處理。(在特征處理的時候會對空值等進行處理,這里主要是對一些不合理的數據先處理掉,比如一個有33天),* 常用的異常點檢測算法包括*
- 偏差檢測:聚類、最近鄰等
- 基于統計的異常點檢測:例如極差,四分位數間距,均差,標準差等,這種方法適合于挖掘單變量的數值型數據。全距(Range),又稱極差,是用來表示統計資料中的變異量數(measures of variation) ,其較大值與最小值之間的差距;四分位距通常是用來構建箱形圖,以及對概率分布的簡要圖表概述。
- 基于距離的異常點檢測:主要通過距離方法來檢測異常點,將數據集中與大多數點之間距離大于某個閾值的點視為異常點,主要使用的距離度量方法有絕對距離 ( 曼哈頓距離 ) 、歐氏距離和馬氏距離等方法。
- 基于密度的異常點檢測:考察當前點周圍密度,可以發現局部異常點,例如LOF算法
3,數據采樣:采集、清洗過數據以后,正負樣本是不均衡的,要進行數據采樣。采樣的方法有隨機采樣和分層抽樣。但是隨機采樣會有隱患,因為可能某次隨機采樣得到的數據很不均勻,更多的是根據特征采用分層抽樣。
就是從原始的數據中構造特征集,原始數據可能是時間戳、文本、圖片、音頻等。我們需要從這些數據中構建特征集
對于類別型數據不能用數值表示。(比如顏色{紅、綠、藍},數字1、2、3可以表示,但是顏色本身沒有數學關系,這會誤導我們的數學模型)。常用的方法是熱編碼-(one-hot方法)(OneHotEncoder類)
|
(1)詞袋:本數據預處理后,去掉停用詞,剩下的詞組成的list,在詞庫中的映射稀疏向量。Python中用CountVectorizer處理詞袋。 也就是考慮某個詞在當前訓練樣本中出現的頻率。
(2)使用TF-IDF特征:TF-IDF是一種統計方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。TF(t) = (詞t在當前文中出現次數) / (t在全部文檔中出現次數),IDF(t) = ln(總文檔數/ 含t的文檔數),TF-IDF權重 = TF(t) * IDF(t)。自然語言處理中經常會用到。(考慮到了這個詞語是不是在大部分文件都出現了,即包含這個詞語的文本條數的倒數,這種詞語一般沒有什么作用,排除掉常用詞語的干擾)
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer import jieba import numpy as np import pandas as pd def cutwords(): ''' 計算詞的重要性 ''' def tfidvec(): c1, c2, c3 = cutwords() tv = TfidfVectorizer() data = tv.fit_transform([c1,c2,c3]) print(tv.get_feature_names()) print(data.toarray()) return None |
歸一化方法有兩種形式,一種是把數變為(0,1)之間的小數,一種是把有量綱表達式變為無量綱表達式。主要是為了數據處理方便提出來的,把數據映射到0~1范圍之內處理,更加便捷快速,應該歸到數字信號處理范疇之內。
min-max標準化(Min-max normalization)/0-1標準化(0-1 normalization)
也叫離差標準化,是對原始數據的線性變換,使結果落到[0,1]區間,轉換函數如下:
注:作用于每一列,max為一列的較大值,min為一列的最小值,那么X’’為最終結果,mx,mi分別為指定區間值默認mx為1,mi為0
from sklearn.preprocessing import MinMaxScaler,
|
通過對原始數據進行變換把數據變換到均值為0,標準差為1范圍內
from sklearn.preprocessing import StandardScaler
|
對于缺失特征可以修改成新的特征,也可以刪除,常用有:
(1)刪除:最簡單的方法是刪除,刪除屬性或者刪除樣本。如果大部分樣本該屬性都缺失,這個屬性能提供的信息有限,可以選擇放棄使用該維屬性;如果一個樣本大部分屬性缺失,可以選擇放棄該樣本。雖然這種方法簡單,但只適用于數據集中缺失較少的情況。
(2) 統計填充:對于缺失值的屬性,尤其是數值類型的屬性,根據所有樣本關于這維屬性的統計值對其進行填充,如使用平均數、中位數、眾數、較大值、最小值等,具體選擇哪種統計值需要具體問題具體分析。另外,如果有可用類別信息,還可以進行類內統計,比如身高,男性和女性的統計填充應該是不同的。
(3) 統一填充:對于含缺失值的屬性,把所有缺失值統一填充為自定義值,如何選擇自定義值也需要具體問題具體分析。當然,如果有可用類別信息,也可以為不同類別分別進行統一填充。常用的統一填充值有:“空”、“0”、“正無窮”、“負無窮”等。
(4) 預測填充:我們可以通過預測模型利用不存在缺失值的屬性來預測缺失值,也就是先用預測模型把數據填充后再做進一步的工作,如統計、學習等。雖然這種方法比較復雜,但是最后得到的結果比較好。
from sklearn.preprocessing import Imputer import numpy as np
|
很多任務與時間維度有關系,比如用電量等,此時要將時間戳數據轉換為時間特征。常見的轉換有:
(1)day of weak(一周的星期幾)、day of month、day of year、week of year、month of year、hour of day、minute of day 、哪個季度。
(2)t_m24(前一天的數值)、t_m48(前兩天的數值)等。
(3)tdif(與親一天的數值的差值)等。
當數據預處理完成后,我們需要選擇有意義的特征輸入機器學習的算法和模型進行訓練。原始的特征可能有冗余(兩個特征說的是一個問題,相關性太強)、噪聲(會影響問題的效果)。通常來說,從兩個方面考慮來選擇特征:
特征是否發散:如果一個特征不發散,例如方差接近于0,也就是說樣本在這個特征上基本上沒有差異,這個特征對于樣本的區分并沒有什么用。
特征與目標的相關性:這點比較顯見,與目標相關性高的特征,應當優選選擇。除方差法外,本文介紹的其他方法均從相關性考慮。
1,filter(過濾法):方法:評估單個特征和結果值之間的相關程度, 排序留下Top相關的特征部分。 評價方式: Pearson相關系數, 互信息, 距離相關度。 缺點:只評估了單個特征對結果的影響,沒有考慮到特征之間的關聯作用, 可能把有用的關聯特征誤踢掉。因此工業界使用比較少。
(1)方差選擇:計算各個特征的方差,然后根據閾值,選擇方差大于閾值的特征。使用feature_selection庫的VarianceThreshold類。
(2)相關系數法:計算各個特征對目標值的相關系數以及相關系數的P值。用feature_selection庫的SelectKBest類結合相關系數來選擇。
(卡方檢驗是檢驗定性自變量對定性因變量的相關性,互信息是評價定性自變量對定性因變量的相關性,可以用這兩個值和SelectKBest類來選擇)
2,wrapper(包裹法): 方法:把特征選擇看做一個特征子集搜索問題, 篩選各種特 征子集, 用模型評估子集特征的效果。 典型算法:“遞歸特征刪除算法”,應用在邏輯回歸的過程:
a.用全量特征跑一個模型;
b.根據線性模型的系數(體現相關性),刪掉5-10%的弱特征,觀察準確率/auc的變化;
c.逐步進行, 直至準確率/auc出現大的下滑停止。
(python中是RFE類)
3,嵌入法: 方法:根據模型來分析特征的重要性,最常見的方式為用正則化方式來做特征選擇。(這種方式在工業界很常用)
(1)基于懲罰項的方法:就是用L1,L2正則化來做特征選擇。L1正則有截斷效應:不重要的特征的參數權重為0,L1正則方法具有稀疏解的特性,因此天然具備特征選擇的特性,但是要注意,L1沒有選到的特征不代表不重要,原因是兩個具有高相關性的特征可能只保留了一個,如果要確定哪個特征重要應再通過L2正則方法交叉檢驗;;L2正則有縮放效應:拿到手的特征都比較小。SelectFromModel類來解決。
(2)基于樹模型的特征選擇法:樹模型中GBDT也可用來作為基模型進行特征選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型。
from sklearn.feature_selection import VarianceThreshold
|
當特征選擇完成后,可以直接訓練模型了,但是可能由于特征矩陣過大,導致計算量大,訓練時間長的問題,因此降低特征矩陣維度也是必不可少的。常見的降維方法除了以上提到的基于L1懲罰項的模型以外,另外還有主成分分析法(PCA)和線性判別分析(LDA),線性判別分析本身也是一個分類模型。PCA和LDA有很多的相似點,其本質是要將原始的樣本映射到維度更低的樣本空間中,但是PCA和LDA的映射目標不一樣: PCA是為了讓映射后的樣本具有較大的發散性;而LDA是為了讓映射后的樣本有最好的分類性能。所以說PCA是一種無監督的降維方法,而LDA是一種有監督的降維方法。PCA和LDA降維原理涉及到大量的數學推導過程,請自行查閱相關文檔
from sklearn.decomposition import PCA
|
上一篇: 思科認證更新常見問題FAQ