書接上文,進(jìn)行數(shù)據(jù)清洗過程后,我們得到了沒有空值、異常值、錯(cuò)誤值的數(shù)據(jù),但想要用海量的數(shù)據(jù)來建立我們所需要的算法模型,僅僅是數(shù)據(jù)清洗的過程是不夠的,因?yàn)橛械臄?shù)據(jù)類型是數(shù)值,有的是字符,怎樣將不同類型的數(shù)據(jù)聯(lián)系起來?以及在保證最大化信息量的前提下,怎樣得到便于分析的數(shù)據(jù)?這就是特征預(yù)處理要做的工作。
一、理論基礎(chǔ)
1. 基本概念
特征預(yù)處理是數(shù)據(jù)預(yù)處理過程的重要步驟,是對數(shù)據(jù)的一個(gè)的標(biāo)準(zhǔn)的處理,幾乎所有的數(shù)據(jù)處理過程都會涉及該步驟。在進(jìn)行特征預(yù)處理之前需要確定標(biāo)注,即標(biāo)簽(label)。標(biāo)注的選擇主要與我們的目的相契合,比如要探究不同種族、不同地區(qū)的人們長壽是否與性別相關(guān),那么性別就可以作為標(biāo)注來表明我們的目的。
2. 一般步驟
2.1 特征選擇
目標(biāo)是尋找最優(yōu)特征子集。特征選擇能剔除與標(biāo)注不相關(guān)(irrelevant)或冗余(redundant )的特征,從而達(dá)到減少特征個(gè)數(shù),提高模型精確度,減少運(yùn)行時(shí)間的目的。另一方面,選取出真正相關(guān)的特征簡化模型,協(xié)助理解數(shù)據(jù)產(chǎn)生的過程。
之所以要考慮特征選擇,是因?yàn)闄C(jī)器學(xué)習(xí)經(jīng)常面臨過擬合的問題。?過擬合的表現(xiàn)是模型參數(shù)太貼合訓(xùn)練集以及驗(yàn)證集數(shù)據(jù),在訓(xùn)練集上效果很好而在測試集上表現(xiàn)不好。簡言之模型的泛化能力差。過擬合的原因是模型對于訓(xùn)練集數(shù)據(jù)來說太復(fù)雜,要解決過擬合問題,一般考慮用特征選擇的方法對數(shù)據(jù)進(jìn)行降維。
特征選擇的思想主要有三種:
- 過濾思想:在n個(gè)特征中,對每個(gè)特征 x(i),分別計(jì)算 x(i) 相對于標(biāo)注 y 的信息量 S(i) ,得到 n 個(gè)結(jié)果。然后將 n 個(gè) S(i) 按照從大到小排序,輸出前 k 個(gè)特征。顯然,這樣數(shù)據(jù)的復(fù)雜度大大降低。那么關(guān)鍵的問題就是使用什么樣的方法來度量 S(i) ,我們的目標(biāo)是選取與 y 關(guān)聯(lián)最密切的一些 特征x(i)。
- 包裹思想:基于留出法(hold-out),將特征全集X劃分為兩個(gè)互斥的集合,其中一個(gè)集合作為訓(xùn)練集S,另外一個(gè)作為測試集T,即X=S∪T,S∩T=0。在S上訓(xùn)練出模型后,用T來評估其測試誤差,作為對泛化誤差的評估。將訓(xùn)練集根據(jù)特征子集選擇方法選出特征子集,對于每一個(gè)待選的特征子集,都在訓(xùn)練集上訓(xùn)練一遍模型,然后在測試集上根據(jù)誤差大小選擇出特征子集。需要先選定特定算法,通常選用普遍效果較好的算法, 例如Random Forest, SVM, kNN等等。
- 嵌入思想:先使用某些機(jī)器學(xué)習(xí)的簡單回歸模型進(jìn)行訓(xùn)練,得到各個(gè)特征的權(quán)值系數(shù),根據(jù)系數(shù)從大到小選擇特征(采用這個(gè)方法有比較大的風(fēng)險(xiǎn),要慎重選擇用哪個(gè)回歸模型)。
2.1.1 過濾思想
?2.1.1.1 皮爾遜(pearson)相關(guān)系數(shù)
特征選擇與提取最全總結(jié)之過濾法 - 騰訊云開發(fā)者社區(qū)-騰訊云 (tencent.com)
相關(guān)系數(shù)是衡量特征與標(biāo)注相關(guān)性最直接簡單的方法,取值范圍在[-1,1],當(dāng)相關(guān)系數(shù)接近或等于0時(shí),說明該特征與標(biāo)注的相關(guān)性很小或不相關(guān)。皮爾遜相關(guān)系數(shù)可以用來探究任何數(shù)據(jù)類型之間的相關(guān)性,即使有離散非二值的數(shù)據(jù),經(jīng)過定序處理后也可用相關(guān)系數(shù)的方法。
以下代碼為相關(guān)系數(shù)的輸出,若要遍歷特征全集根據(jù)相關(guān)系數(shù)篩選特征,還需要通過函數(shù)或方程等方法遍歷全集。
import pandas as pd
s1=pd.Series([0.1,0.2,1.1,2.4,1.3,0.3,0.5])
s2=pd.Series([0.5,0.4,1.2,2.5,1.1,0.7,0.1])
s1.corr(s2,method='pearson ') #輸出s1、s2之間的相關(guān)系數(shù)
Pearson相關(guān)系數(shù)的一個(gè)明顯缺陷是,它只對線性關(guān)系敏感。如果關(guān)系是非線性的,即便兩個(gè)變量具有一一對應(yīng)的關(guān)系,Pearson相關(guān)性也可能會接近 0 。?
? 2.1.1.2 卡方檢驗(yàn)
卡方檢驗(yàn)用在屬性相關(guān)性檢驗(yàn)上,一般所探查的數(shù)據(jù)類型為類別性數(shù)據(jù)??ǚ綑z驗(yàn)的本質(zhì)是推測兩組數(shù)據(jù)之間的差異,其檢驗(yàn)的原假設(shè)是”兩組數(shù)據(jù)是相互獨(dú)立的”??ǚ綑z驗(yàn)返回卡方值和P值兩個(gè)統(tǒng)計(jì)量,其中卡方值很難界定有效的范圍,而p值,我們一般使用0.01或0.05作為顯著性水平,即p值判斷的邊界??ǚ綑z驗(yàn)的具體介紹見:
卡方檢驗(yàn)_百度百科 (baidu.com)
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest #常用的特征選擇的函數(shù)
from sklearn.feature_selection import chi2
iris = load_iris()
X, y = iris.data, iris.target #iris數(shù)據(jù)集,y取值有0,1,2,為標(biāo)簽化數(shù)據(jù)
#選擇K=2個(gè)最好的特征,返回選擇特征后的數(shù)據(jù)
X_new = SelectKBest(chi2, k=2).fit_transform(X, y) #chi2為指定檢驗(yàn)為卡方檢驗(yàn)
先看X的前5行數(shù)據(jù)
X[0:5,:]
?y的前5行數(shù)據(jù)
y[:5]
?最后提取出的新特征的前5行,可以看到結(jié)果為提取X的最后兩列特征。
? 2.1.1.3 互信息(熵增益)和最大信息系數(shù)
互信息法是用來捕捉每個(gè)特征與標(biāo)注之間的任意關(guān)系(包括線性和非線性關(guān)系)的過濾方法,適用于特征和標(biāo)注都是離散二值的研究。互信息從字面上理解為相互包含的信息,互信息法不返回p值或F值類似的統(tǒng)計(jì)量,它返回“每個(gè)特征與標(biāo)注之間的互信息量的估計(jì)”,這個(gè)估計(jì)量在[0,1]之間取值,為0則表示兩個(gè)變量獨(dú)立,為1則表示兩個(gè)變量完全相關(guān)?;バ畔⒌挠?jì)算公式為:
其中:H()表示求熵,例如:
關(guān)于熵的定義在此不再贅述,不理解的話可去搜一下資料。
想把互信息直接用于特征選擇其實(shí)不是太方便:
- 它不屬于度量方式,也沒有辦法歸一化,在不同數(shù)據(jù)及上的結(jié)果無法做比較
- 對于連續(xù)變量的計(jì)算不是很方便,通常變量需要先離散化,而互信息的結(jié)果對離散化的方式很敏感。
最大信息系數(shù)(MIC)克服了這兩個(gè)問題。它首先尋找一種最優(yōu)的離散化方式,然后把互信息取值轉(zhuǎn)換成一種度量方式,取值區(qū)間在 [0,1] 。minepy提供了MIC功能。
簡單來說,最大信息系數(shù)就是將兩個(gè)變量在二維空間中進(jìn)行離散化處理,然后將二維空間按照行列數(shù)規(guī)定分成一定數(shù)量的區(qū)間塊,并計(jì)算這些區(qū)間塊的互信息,這就是一種分割下的互信息值。接著計(jì)算按照其他分割方法下的區(qū)塊的互信息值,最后在這些互信息中選出最大的一個(gè)互信息進(jìn)行歸一化處理后(除以log(最小互信息))得到的就是最大信息系數(shù)。python中有包可以直接計(jì)算MIC,這是另外一位博主的代碼,僅供參考:
from minepy import MINE
m = MINE()
x = np.random.uniform(-1, 1, 10000) #創(chuàng)建10000個(gè)取值在-1到1之間的隨機(jī)數(shù)
m.compute_score(x, x**2) #取x的平方
print(m.mic())
from sklearn.feature_selection import SelectKBest
#由于MINE的設(shè)計(jì)不是函數(shù)式的,定義mic方法將其為函數(shù)式的,返回一個(gè)二元組,二元組的第2項(xiàng)設(shè)置成固定的P值0.5
def mic(x, y):
m = MINE()
m.compute_score(x, y)
return (m.mic(), 0.5)
# 選擇K個(gè)最好的特征,返回特征選擇后的數(shù)據(jù)
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T,k=2).fit_transform(iris.data, iris.target)
?2.1.1.4?方差選擇法
過濾特征選擇法還有一種方法不需要度量特征 x(i)?和標(biāo)注Y的信息量。這種方法先要計(jì)算各個(gè)特征的方差,然后根據(jù)閾值,選擇方差大于閾值的特征。這是因?yàn)榉讲钤酱?,該特征所包含的信息量越多,對于?biāo)注有著更強(qiáng)的解釋含義。
VarianceThreshold是特征選擇的簡單基線方法??梢詣h除方差超過某個(gè)閾值的所有特征。默認(rèn)情況下,它會刪除所有零差異特征,即所有樣本中具有相同值的特征。代碼如下:
from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
# 假設(shè)X是特征全集中的三個(gè)離散二值特征子集
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
# 方差選擇法,返回值為特征選擇后的數(shù)據(jù)
# 參數(shù)threshold為方差的閾值,因?yàn)槎?xiàng)分布的方差為p(1-p),則上面代碼表示當(dāng)方差超過(.8 * (1 - .8)時(shí)刪除特征
print(sel.fit_transform(X))
返回結(jié)果為第二、第三列。
2.1.2 包裹思想
?2.1.2.1 向前搜索
基本思想為:最初時(shí)創(chuàng)建一個(gè)空的集合F,在n個(gè)特征子集選出一個(gè)特征子集加入到F中,這時(shí)通過交叉驗(yàn)證來判斷錯(cuò)誤率,接著繼續(xù)往F集合中加入特征子集計(jì)算錯(cuò)誤率,循環(huán)上述過程直至獲得n個(gè)錯(cuò)誤率或達(dá)到我們設(shè)定的閾值,最后挑選出最小錯(cuò)誤率的特征子集。
?2.1.2.2 向后搜索
與向前搜索往F集合里增加特征相反的是,向后搜索是剛開始時(shí)F集合就包含了若干個(gè)特征子集,得出錯(cuò)誤率后,每次刪除一個(gè)特征子集,直到達(dá)到閾值或集合為空,然后得到最小錯(cuò)誤率的特征集合。
?2.1.2.3 遞歸特征消除法(RFE)
遞歸特征消除(RFE)就是通過遞歸地考慮越來越小的特征集來選擇特征。首先,對初始特征集訓(xùn)練估計(jì)器,通過coef_屬性或feature_importances_屬性獲得每個(gè)特征的重要性。然后,從當(dāng)前的特征集中刪除最不重要的特征。也就是說通過不斷地建立模型,每一次刪除掉差的特征,直至遍歷所有的特征。這種方法的效果很依賴于我們所選擇的模型,以上面iris數(shù)據(jù)集為例:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#遞歸特征消除法,返回特征選擇后的數(shù)據(jù)
#參數(shù)estimator為基模型
#參數(shù)n_features_to_select為選擇的特征個(gè)數(shù)
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
2.1.3 嵌入法
基本思想:建立簡單的回歸模型,常用的模型是基于樹的預(yù)測模型(SelectFromModel),能夠計(jì)算特征的重要程度。基于樹的方法比較易于使用,因?yàn)樗麄儗Ψ蔷€性關(guān)系的建模比較好,并且不需要太多的調(diào)試,但要注意過擬合問題。參考:打牛地的博客-CSDN博客_封裝式特征選擇
?2.1.3.1 帶懲罰項(xiàng)的基模型
比如LR加入正則。通過L1正則項(xiàng)來選擇特征:L1正則方法具有稀疏解的特性,因此天然具備特征選擇的特性,但是要注意,L1沒有選到的特征不代表不重要,原因是兩個(gè)具有高相關(guān)性的特征可能只保留了一個(gè),如果要確定哪個(gè)特征重要應(yīng)再通過L2正則方法交叉檢驗(yàn)。
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
X.shape #查看X的規(guī)格,顯示為150行4列
(150, 4)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
#penalty:{‘l1’, ‘l2’}, default=’l2’,正則化方法,默認(rèn)為L1
#loss:{‘hinge’, ‘squared_hinge’}, default=’squared_hinge’,即hinge的平方
#dual:bool, default=True,Prefer dual=False when n_samples > n_features. 令樣本數(shù)大于特征數(shù)
#C:float, default=1.0,正則化的強(qiáng)度與 C 成反比.
#max_iter:int, default=1000,要運(yùn)行的最大迭代次數(shù)。
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X_new.shape
(150,3) #返回三個(gè)特征
?2.1.3.2 樹模型(隨機(jī)森林、決策樹)
訓(xùn)練能夠?qū)μ卣鞔蚍值念A(yù)選模型:RandomForest和Logistic Regression等都能對模型的特征打分,通過打分獲得相關(guān)性后再訓(xùn)練最終模型。代碼以博主的文章為例:
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
clf = ExtraTreesClassifier()
clf = clf.fit(X, y)
clf.feature_importances_ # 返回每個(gè)特征的重要性
array([ 0.04..., 0.05..., 0.4..., 0.4...])
model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
X_new.shape
(150, 2)
2.1.4 編碼操作
接下來用三個(gè)思想來分析一個(gè)簡單的數(shù)據(jù)集
import numpy as np
import pandas as pd
import scipy.stats as ss
df=pd.DataFrame({'A':ss.norm.rvs(size=10),'B':ss.norm.rvs(size=10),'C':ss.norm.rvs(size=10),'D':np.random.randint(low=0,high=2,size=10)})
#創(chuàng)建一個(gè)df數(shù)據(jù)集,其中A、B、C都是符合正態(tài)分布大小為10的隨機(jī)數(shù),D為取值為0到1、大小為10的整數(shù)。
from sklearn.svm import SVR #SVR為常用的回歸模型包、回歸器
from sklearn.tree import DecisionTreeRegressor #DecisionTreeRegressor為決策樹回歸器
X=df.loc[:,['A','B','C']] #將A、B、C設(shè)置為特征
Y=df.loc[:,['D']] #將D設(shè)置為標(biāo)注
from sklearn.feature_selection import SelectKBest,RFE,SelectFromModel
#上面SelectKBest為過濾思想用到的特征選擇包,RFE為包裹思想中的遞歸特征消除法,SelectFromModel為嵌入思想的模型選擇包
#過濾思想
skb=SelectKBest(k=2) #從特征中選出兩個(gè)特征
skb.fit(X,Y) #擬合模型,輸出指定函數(shù)
skb.transform(X) #轉(zhuǎn)化選擇的兩個(gè)特征
#包裹思想
rfe=RFE(estimator=SVR(kernel='linear'),n_features_to_select=2,step=1)
#estimator為指定回歸器,linear為線性回歸,n_features_to_select=2表示選擇兩個(gè)特征,step=1表示每次刪除一個(gè)特征
rfe.fit_transform(X,Y) #轉(zhuǎn)化出選擇的兩個(gè)特征和標(biāo)注
#嵌入思想
sfm=SelectFromModel(estimator=DecisionTreeRegressor(),threshold=0.1)
#threshold=0.1 表示重要性低于0.1時(shí)就刪除特征
sfm.fit_transform(X,Y)
以上就是特征選擇的基本方法和簡單的代碼操作,想要學(xué)習(xí)復(fù)雜度較高的代碼的小伙伴可以去Sklearn的官網(wǎng)看看。其他內(nèi)容待下回分解......
部分資料和代碼來源于以下參考文獻(xiàn):
特征預(yù)處理 - 知乎 (zhihu.com)
機(jī)器學(xué)習(xí) 特征選擇(Feature Selection)方法匯總 - 知乎 (zhihu.com)
數(shù)據(jù)分析3——預(yù)處理理論(特征工程、數(shù)據(jù)清洗、特征預(yù)處理)_嘖嘖嘖@的博客-CSDN博客
機(jī)器學(xué)習(xí) 特征選擇(過濾法 封裝法 嵌入法)_打牛地的博客-CSDN博客_封裝式特征選擇文章來源:http://www.zghlxwxcb.cn/news/detail-430964.html
華為大佬用159小時(shí)講完的Python數(shù)據(jù)分析-數(shù)據(jù)挖掘教程,整整600集,零基礎(chǔ)快速入門 手把手教學(xué),學(xué)完即可就業(yè)_嗶哩嗶哩_bilibili文章來源地址http://www.zghlxwxcb.cn/news/detail-430964.html
到了這里,關(guān)于Python數(shù)據(jù)分析之特征處理筆記三——特征預(yù)處理(特征選擇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!