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