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