版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章數(shù)據(jù)預(yù)處理與特征工程5.1數(shù)據(jù)預(yù)處理5.2特征提取5.3特征選擇5.4降維5.5小結(jié)5.1數(shù)據(jù)預(yù)處理標(biāo)準(zhǔn)化歸一化離散化對類別特征編碼缺失值計算多項式特征標(biāo)準(zhǔn)化
對于一組數(shù)據(jù)來說,如果數(shù)據(jù)中存在少量的異常數(shù)據(jù)點,那么對于最后的結(jié)果就可能會產(chǎn)生一些偏差,為了盡可能減少這種偏差,我們就可以對數(shù)據(jù)進行標(biāo)準(zhǔn)化處理。
常用的標(biāo)準(zhǔn)化方法是:z-score,z-score利用的是scikit-learn中的StandardScaler,將離散的數(shù)據(jù)轉(zhuǎn)化為標(biāo)準(zhǔn)差為1,均差為0范圍內(nèi)的數(shù)據(jù)。
具體的實現(xiàn)公式如下:
其中ave代表特征的平均值(average),n代表樣本總量。
這樣做的目的就是將離散化的數(shù)據(jù)縮放,但由于該變化是線性的,數(shù)據(jù)轉(zhuǎn)換之后不會影響到原來數(shù)據(jù)的順序,還可以使優(yōu)化結(jié)果。代碼實現(xiàn):
先從sklearn庫中的preprocessing分支中導(dǎo)入StandardScaler,實例化StandardScaler。fromsklearn.preprocessingimportStandardScalers=StandardScaler()test_data=[[780,40],[700,51],[740,45],[810,66]]standard_data=s.fit_transform(test_data)print(standard_data)輸出結(jié)果歸一化
在我們研究一些問題時,往往會遇到特征同等重要,但是彼此之間的單位不同的情況,如果不對其進行處理,就可能會對最終的結(jié)果造成相當(dāng)大的影響。
例如,已知身高和體重,要你找出與“某人”體型相同的人。在這個問題中身高和體重的單位是不相同的,而且彼此之間也不能相互轉(zhuǎn)換,這時如果你直接使用未經(jīng)處理的數(shù)據(jù)集來預(yù)測和某人體型相同的人可能就會出現(xiàn)很大的偏差。
所以我們就要對數(shù)據(jù)進行歸一化處理,將數(shù)據(jù)縮放到同一個區(qū)間,使得每個特征對于問題的影響是相同的。
常用的歸一化的方法是:(極差變換法),即通過線性變換將數(shù)據(jù)映射到[0,1]之間,但數(shù)據(jù)的排列順序由于是線性變化,所以并沒有改變。數(shù)學(xué)公式:其中,Xi為特征值,min為最小值,max為最大值。
min-max方法利用的是scikit-learn庫中的MinMaxScaler,具體的實現(xiàn)方法是:
先從sklearn庫中的preprocessing分支中導(dǎo)入MinMaxScaler,實例化MinMaxScalerfromsklearn.preprocessingimportMinMaxScalers=MinMaxScaler()test_data=[[110,23],[434,10],[121,55],[999,90]]Minmax_data=s.fit_transform(test_data)print(Minmax_data)輸出結(jié)果
從上述結(jié)果中我們可以看到所有數(shù)據(jù)都轉(zhuǎn)化為[0,1]之間的數(shù),使得數(shù)據(jù)更為方便的應(yīng)用于你所構(gòu)建你的模型。離散化 離散化,就是把無限空間中的有限個體映射到有限空間中去,通俗的說,離散化就是再不改變數(shù)據(jù)相對大小的條件下,對數(shù)據(jù)進行相應(yīng)的縮小,以此來提高算法的時空效率,避免一些冗陳而又復(fù)雜的計算。
當(dāng)數(shù)據(jù)只與它們之間的相對大小有關(guān),而與具體是多少無關(guān)時,就可以應(yīng)用離散化。離散化(又叫特征分箱),就是將根據(jù)數(shù)據(jù)輸入的范圍,將數(shù)據(jù)劃分成一個一個的區(qū)間(又叫箱子),由于我們只考慮數(shù)據(jù)之間的相對大小,所以我們可以賦給每個區(qū)間一個能表示區(qū)間大小關(guān)系的一個簡單的數(shù)值,這樣就可以將數(shù)據(jù)簡化,從而簡化計算,提高模型的擬合效果。
要實現(xiàn)特征分箱,我們利用的是numpy庫中的linspace函數(shù)和digitize函數(shù),linspace函數(shù)的作用就是對于給定的[x,y]區(qū)間和所需要的劃分段數(shù)k,linspace可以將這個區(qū)間劃分成k-1個子區(qū)間,而digitize函數(shù)的作用就是可以計算出數(shù)據(jù)所在的區(qū)間的位置。importnumpyasnpx=[21,10,2,44,66,99]bins=np.linspace(0,100,11)print("bins:",bins)輸出結(jié)果
為什么np.linspace(0,100,11)中要填“11”而不是“10”?
linspace(x,y,z)中z的作用是創(chuàng)建z個元素,而不是z個區(qū)間。接下來我們用numpy中的另一個函數(shù)digitize來計算x中每個元素所對應(yīng)的區(qū)間的位置。
特別的對于一些定性數(shù)據(jù),我們我們無法劃定其區(qū)間長,而且機器學(xué)習(xí)是無法直接使用定性特征的,需要將定性特征轉(zhuǎn)化成定量特征,這樣才能用于機器學(xué)習(xí)。例如學(xué)習(xí)成績,如果我們只關(guān)心學(xué)生的學(xué)習(xí)成績是“及格”還是“不及格”,那么學(xué)習(xí)成績就是一個定性特征。我們不妨用“0”代替“不及格”,用“1”代替“及格”,那么我們的所有數(shù)據(jù)就可以用“0”和“1”來代替。這樣做就不必存儲一些無關(guān)特征,比如學(xué)生的成績(低于60全為0,高于60全為1),極大地節(jié)省了空間并且簡化了計算量,而這樣的操作又叫二值化。
二值化利用的是sklearn庫中preporccessing分支的Binarizer函數(shù),Binarizer函數(shù)的作用是對于一個給定的閾值(threshold),Binarizer將大于這個閾值的數(shù)值變成1,小于這個數(shù)值的數(shù)值變成0,從而將整體數(shù)據(jù)二值化。fromsklearn.preprocessingimportBinarizerx=[[1,1],[21,12],[11,1],[102,211],[43,95]]x_trans=Binarizer(threshold=35).fit_transform(x)print("x_trans:\n",x_trans)對類別特征編碼
對于“性別”、“城市”和“日期”等定性特征,我們所構(gòu)建的模型是無法對其直接使用的。但就“城市”這個特征而言,可能有“北京”、“上?!?、“杭州”和“濟南”等多個變量,但是對于某一個確定的人來說,就只有一個確定的量。而且我們在對數(shù)據(jù)進行處理的時候也不可能直接將數(shù)據(jù)存成“北京”、“上?!?、“濟南”等。那在機器學(xué)習(xí)中這種定性特征該如何參與運算呢?
對于“性別”、“城市”和“日期”等定性變量,我們可以對它進行分類,就比如說“性別”。那么對于一個人我們就可以將性別分成兩個特征,分別為“男性”和“女性”,如果這個人是男人,那么就可以將“男性”記為“1”,“女性”記為“0”,來表示這個人是男性。所以,對于某一個定性特征,我們可以將其分為N類,每一類作為一個新的特征,新特征的取值是“0”和“1”,這樣做就可以將機器無法直接處理的定性特征轉(zhuǎn)化成能直接處理的定量特征。One-hot編碼
到目前為止,我們表示分類特征最常用的方法是one-hot編碼,又稱虛擬變量。其中心思想是,對于一個定性特征(分類特征),我們可以將其轉(zhuǎn)化成一個或多個新的特征來替代原來的特征,新特征的取值為“0”和“1”。對于單獨的數(shù)據(jù)而言,由原來的的分類特征轉(zhuǎn)化成的N個新特征的取值只有1個為“1”,其余的N-1個特征的取值都為“0”。
One-hot編碼的實現(xiàn)方式是利用sklearn庫中preporcessing分支中的OneHotEncoder,OneHotEncoder的作用就是創(chuàng)建N-1個新特征,新特征的取值為0,而原先已有的特征取值為1。One-hot編碼實現(xiàn)方式:fromsklearn.preprocessingimportOneHotEncoderimportnumpyasnpdata=np.array([["China"],["USA"],["Japan"],["England"],["Australia"]])data_OHE=OneHotEncoder(sparse=False).fit_transform(data)print(data_OHE)
One-hot編碼的編碼方式是按字典序進行編碼的,所以我們可以看到輸出的第一行(China)所對應(yīng)的第一列不為1。由于Australia比China小,所以China排在第二位,即第一行對應(yīng)的第二列為1。LabelEncoder編碼
one-hot編碼只能適用于我們不關(guān)心特征的取值的情況,如果定性特征的取值不能忽略,那么我們就不能使用one-hot編碼將特征簡單地賦值成0和1,這樣做是沒有任何意義的。就例如“尺碼”這個定性特征,“尺碼”特征可以取“L”、“XL”、“XXL”等,這是如果我們用one-hot編碼將其轉(zhuǎn)化成0和1,那么我們得出的結(jié)果將沒有任何意義。所以這是我們就可以使用另一種編碼方式,LabelEncoder。
LabelEncoder的實現(xiàn)是利用了sklearn庫中preporcessing分支中的LabelEncoder。LabelEncoder的作用是對于不連續(xù)的文本或數(shù)字進行編號,假如一個定性特征可以分成N個新特征,而且新特征的取值是有要求的,那么這是我們就可以使用LabelEncoder對N個新特征分別賦值為[0,N-1],從而不影響新特征之間的相互關(guān)系。代碼實現(xiàn):importnumpyasnpfromsklearn.preprocessingimportLabelEncoderLE=LabelEncoder()data=np.array([["M"],["L"],["XL"],["XXL"],["XXXL"]])data_LE=LE.fit_transform(data)print(data_LE)缺失值計算
在現(xiàn)實生活中,十全十美的事很少,不盡如人意的的事卻有很多,當(dāng)然我們收集的數(shù)據(jù)也是如此。十分完美的數(shù)據(jù)是通常情況下都是很少見的,我們收集的數(shù)據(jù)中總是一些數(shù)據(jù)是缺失的,而且我們往往無法自己補全。原因有很多,可能是人為因素,比如由于疏忽導(dǎo)致輸入時數(shù)據(jù)缺失或被別的數(shù)據(jù)覆蓋、誤刪達到,又比如歷史的故意隱瞞或者調(diào)查時人們拒絕回答。還可能是客觀原因如硬盤損壞、機器故障造成的數(shù)據(jù)缺失。所以,我們應(yīng)該對我們所收集的數(shù)據(jù)的缺失值進行處理,使得數(shù)據(jù)更適合我們所構(gòu)建的模型。目前常見的幾種缺失值處理方法:1.直接使用含有缺失值的數(shù)據(jù)2.直接刪除含有缺失值的數(shù)據(jù)3.計算并補全缺失值方法一:直接使用含有缺失值的數(shù)據(jù),如果缺失的數(shù)據(jù)是一些無關(guān)緊要的特征,那么我們就忽略這些特征,直接使用缺失數(shù)據(jù)。但如果缺失的是一些非常重要的數(shù)據(jù),那么我們直接使用的話,就可能影響結(jié)果的準(zhǔn)確性。方法二:直接刪除含有缺失值的數(shù)據(jù),這種方法一般使用的不多,原因是在未進行機器學(xué)習(xí)之前,你也不知道哪種特征對于我們所構(gòu)建的模型的重要性,如果貿(mào)然將數(shù)據(jù)直接刪除的話,可能就會對我們構(gòu)建的模型產(chǎn)生一些不可估計的影響。缺失值刪除代碼實現(xiàn):importpandasaspdimportnumpyasnpdata=pd.DataFrame({"name":['A','B','C'],"sex":[np.nan,"Male","Female"],"born":[pd.NaT,pd.Timestamp("2000-1-1"),pd.NaT]})DataFrame.dropna(axis=0,how='any',thresh=None,subset=None,inplace=False)
我們可以通過修改括號中的參數(shù)來實現(xiàn)任意的刪除功能axis的取值為“0”(index)、“1”(columns),axis=0時表示對行的刪除,axis=1時表示對列的刪除,一般dropna默認axis=0。how的取值為‘a(chǎn)ny’或‘a(chǎn)ll’,how=‘a(chǎn)ny’時表示刪除只要有任何NA存在的行或列,how=‘a(chǎn)ll’時表示刪除該行或該列全為NA的行或列。thresh參數(shù)的作用是保留數(shù)據(jù),防止一些數(shù)據(jù)被錯誤的刪除,其取值為int整數(shù)數(shù)據(jù)類型。thresh與axis結(jié)合使用便可實現(xiàn)對任意N行或M列的保留,而且thresh保留的是含有缺失值最少的一行或一列。subset參數(shù)的作用是刪除含有缺失值的指定列,其取值為數(shù)據(jù)中所有特征。方法三:計算并補全缺失值。缺失值補全是現(xiàn)實生活中實際工程使用的最廣泛的方法,其中心思想是:計算出最可能的值,來代替缺失值。這種方法多用于缺失值較少或者缺失值比較重要的情況。我們以一下數(shù)據(jù)作為樣例data=pd.DataFrame({"name":["A","B","C","D"],"sex":[np.nan,np.nan,"Male","Female"],"height":[155,pd.NaT,167,190],"weight":[pd.NaT,55,60,77]})DataFrame.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None)fillna的作用是在將缺失值替換為我們所指定的值。value參數(shù)的作用是fillna用來替換缺失值的值。value的取值為任意實數(shù),當(dāng)然我們也可以用字典來填充缺失值。method參數(shù)的作用是指定填充缺失值的方法,其取值為“ffill/pad”或“bfill/backfill”。method=“ffill/pad”表示用該列數(shù)據(jù)的前一個非缺失值來填充缺失值,method=“bfill/backfill”表示用該列數(shù)據(jù)的后一個非缺失值來填充缺失值。inplace參數(shù),inplace的作用是是否創(chuàng)建副本,其取值為True或False,inplace=True表示不創(chuàng)建副本,直接在原數(shù)據(jù)上進行修改,inplace=False表示創(chuàng)建副本,在副本上進行修改而不改變原數(shù)據(jù)的值。limit參數(shù),limit參數(shù)的作用是限制填充缺失值的個數(shù),limit長與method和value一起用。當(dāng)然,我們使用sklearn.preprocessing中的Imputer也可以做到以上的效果,接下來我們介紹幾種常見的缺失值補全的方法。均值插補
對于可以度量的量,如果數(shù)據(jù)中存在缺失值,那么我們通常會用該列數(shù)據(jù)的平均值來代替缺失值,例如身高、體重、學(xué)生成績等。
但是,如果對于不可以度量的數(shù)據(jù),例如“性別”、“國籍”、“政治面貌”等,我們無法將數(shù)據(jù)的平均值或中位數(shù)來替代缺失值。這時,比較好的方法是用數(shù)據(jù)的眾數(shù)(即出現(xiàn)次數(shù)最多的數(shù))來替代缺失值。多重插補對于數(shù)據(jù)中的缺失值來說,我們可以做這樣一個假設(shè):認為所有待補全的缺失值的值是隨機的,且待補全的缺失值的值全部來源于我們已知的值。具體實現(xiàn):1.機器首先通過已有的值預(yù)測(或估計)出待補全的缺失值的值。2.給預(yù)測出的數(shù)據(jù)加上多組干擾值,形成N多種不同的組合。3.根據(jù)某種選擇方式,選取出最合適的值。多項式特征
對于一個數(shù)據(jù)集而言通常會有多個特征,但是有些時候我們直接使用這些特征對問題進行分析,得出的結(jié)果可能就會差強人意。但是如果我們對于這些特征進行了一個處理(平方、開方、加減乘除等)就會構(gòu)成一些新的特征,生成的這些新的特征即為這些特征的變量的有機組合。如果我們使用數(shù)據(jù)集中的特征所構(gòu)建的模型對于問題的求解不夠理想,那么我們將一些特征進行一些結(jié)合或?qū)ζ浔旧磉M行一些操作使其構(gòu)成一些新的特征,再將其用于問題的求解,那么我們就可能會得到我們想要的結(jié)果。
多項式特征在前面多項式回歸時有涉及,多項式回歸就是采用了多項式特征的自動添加新特征的方式,接下來對多項式特征進行詳細講解。
我們使用Python以這個函數(shù)構(gòu)造一組數(shù)據(jù),并且用多項式來擬合。importnumpyasnpimportmathimportrandomimportmatplotlib.pyplotaspltx=np.random.uniform(0.01,2.5,100)x=x.reshape(-1,1)y=[i**2-3*i+random.uniform(-0.25,0.25)+math.log(i)foriinx]plt.scatter(x,y)plt.show()這里我們可以看出y-x的關(guān)系并不是線性的關(guān)系
這時候直接用線性模型進行擬合
幾乎大部分的點都不在直線上。所以,這時候我們就可以嘗試一下添加一個新特征——x2。
那么如何添加新特征呢?
兩種方法:1.手動添加new_x=np.hstack([x,x**2]).reshape(-1,1)2.sklearn自動添加fromsklearn.preprocessingimportPolynomialFeaturespf=PolynomialFeatures(degree=2)new_x=pf.fit_transform(x)
這里,PolynomialFeatures是sklearn.preprocessing中的一個方法,其作用是對數(shù)據(jù)進行預(yù)處理,給數(shù)據(jù)添加新的特征。其中,degree的作用是控制多項式中最高項的維度,例如degree=3,最高項就是x^3。下面我們來看看新添加了x2這一項后的擬合情況fromsklearn.preprocessingimportPolynomialFeaturespf=PolynomialFeatures(degree=2)new_x=pf.fit_transform(x)log.fit(new_x,y)fit_x=np.linspace(start=0.01,stop=2.5,num=100).reshape(-1,1)plt.scatter(x,y,c='g')plt.plot(fit_x,log.predict(pf.fit_transform(fit_x)),'b-')plt.show()
根據(jù)前后兩次的圖像對比,我們可以看到新添加x2的曲線的擬合效果要好于原始數(shù)據(jù)曲線的效果當(dāng)degree=12時,圖像已經(jīng)大致和原函數(shù)吻合我們可以查看各項的系數(shù)和截距。print("coef_:\n{}".format(log.coef_))print("intercept_:\n{}".format(ercept_))我們用R2決定系數(shù)檢驗擬合的效果fromsklearn.metricsimportr2_scoreprint("score:{}".format(r2_score(y,log.predict(pf.fit_transform(x)))))輸出結(jié)果:R3-score:0.9461278631787718
degree=12,R3-score≈0.94,相對來說這是一個非常不錯的成功率了。所以如果你搜集到的數(shù)據(jù)特征比較少或者去除冗沉特征后特征數(shù)量稀少,再或者擬合效果差強人意,你都可以嘗試這用多項式特征來擴充你的特征數(shù)量。5.2特征提取
特征提取主要是指字典特征提取、文本特征提取和圖像特征提取這三個方面。萬物皆可為特征。因此,特征的種類千變?nèi)f化,特征的數(shù)量無窮無盡。針對不同種類的特征采取不同的特征提取方法,往往會對你所研究的問題有所益處。字典特征提取
如果你要對你所需要的數(shù)據(jù)進行特診提取,但這些數(shù)據(jù)恰巧都單獨成一個字典,例如學(xué)生的成績、城市的一些數(shù)據(jù)、書籍的版號等等。如果對這些數(shù)據(jù)進行直接提取,那么過程就會非常的復(fù)雜。特別是當(dāng)數(shù)據(jù)量非常大的時候,稍有不慎,可能你所提取出的數(shù)據(jù)就會出錯,導(dǎo)致你所研究的問題的結(jié)果錯誤。
所以,這時候我們就可以借助sklearn庫中feature_extraction分支中的DictVectorizer。DictVectorizer(字典矢量器)的作用是對特征進行特征值化,即保留連續(xù)特征并對離散特征為其創(chuàng)建虛擬變量。例如以下數(shù)據(jù)(隨機數(shù)據(jù)):{'neme':'gxml','sex':'Female','score':61}{'neme':'ecnk','sex':'Male','score':50}{'neme':'selq','sex':'Male','score':83}{'neme':'pjow','sex':'Male','score':67}{'neme':'ziqi','sex':'Male','score':19}{'neme':'tqub','sex':'Female','score':64}{'neme':'vcms','sex':'Female','score':64}{'neme':'oigc','sex':'Male','score':71}{'neme':'jlim','sex':'Male','score':62}{'neme':'itau','sex':'Male','score':68}
我們可以看到,對于每一個學(xué)生的信息,都是存放在一個單獨的字典里。因此,我們首先將所有學(xué)生的信息都存放在一個列表當(dāng)中(即轉(zhuǎn)化成字典列表),然后就可以用DictVectorizer方法對其進行特征提取。
由于DictVectorizer默認返回的是一個sparse矩陣,為了方便直觀,我們將sparse的值設(shè)置為False。fromsklearn.feature_extractionimportDictVectorizerdv=DictVectorizer(sparse=False)new=dv.fit_transform(dit)print(new)print(dv.get_feature_names())其中dit中存放的是由每個學(xué)生信息所構(gòu)成的字典列表。結(jié)果如下:在這里我們可以看到,輸出的每一行即為一個學(xué)生的信息,例如第一行的學(xué)生的姓名是“gxml”,性別是“Female”,成績是“61”分。文本特征提取
在特征提取中,文本特征提取所占有的地位非常重要。文字是人類文化傳承的重要載體,所以如果想要在機器學(xué)習(xí)中有所建樹,那么文本特征提取便是你必不可少的技能之一。
文本是由單詞、短語和句子組成的一種自由化的組合,其形式多種多樣,但總是可以將其轉(zhuǎn)換為結(jié)構(gòu)化數(shù)據(jù)屬性的存在。同過文本特征提取,我們可以分析兩個不同文本間的相似度,還可以提取整片文章的關(guān)鍵詞和主題,更可以對文章進行感情色彩分析等等。
在進行文本特征提取時,我們首先要對文本進行預(yù)處理,使得我們所提取的特征能更好的被我們使用。下面一段短文,我們對其進行文本特征提取Spidersarenotinsects,asmanypeoplethink,norevennearlyrelatedtothem.Onecantellthedifferencealmostataglance,foraspideralwayshaseightlegsandinsectnevermorethansix.Howmanyspidersareengagedinthisworknoourbehalf?OneauthorityonspidersmadeacensusofthespidersingrassfieldinthesouthofEngland,andheestimatedthatthereweremorethan2250000inoneacre;thatissomethinglike6000000spidersofdifferentkindsonafootballpitch.首先,我們要將這一段話讀入,并利用正則表達式將其分割importres=input()ss=re.sub(r'\,|\.','',s)s=re.sub(r'[0-9]','',s)s=re.split(r'\s+',s)
將這一整段文字分割成單詞后,我們發(fā)現(xiàn)其中有一些詞語是我們所不需要的,例如“is”、“of”等,所以我們需對其做一些預(yù)處理,使得文本僅保留我們所需要的單詞。step_words=['is','am','are','of','on','the','more','than','nor','and','this','these','that','those','not','as','can','at','a','an','for','to','nearly','almost','even','many','always','has','have','in','no','our','was','were']s=[''ifiinstep_wordselseiforiins]while''ins:s.remove('')結(jié)果:['spiders','insects','people','think','related','them','one','tell','difference','glance','spider','eight','legs','insect','never','six','how','spiders','engaged','work','behalf?','one','authority','spiders','made','census','spiders','grass','field','south','england','he','estimated','there','one','acre;','something','like','spiders','different','kinds','football','pitch','']
可能讀者看到這種處理方式會覺得非常麻煩,別擔(dān)心,這只是一種簡單的處理方法,如果真的要對文章進行處理的話,還要用到Python中的nltk庫。Nltk庫是專門用來處理自然語言的工具,如果有需要的讀者可以翻到本書的第八章來進行學(xué)習(xí)。詞袋模型
我們可以將文本裝進詞袋模型中去處理文本。詞袋模型可以形象化的理解成把句子或文件用一個袋子來裝著這些詞,這種表現(xiàn)方式不考慮文法以及詞的順序,接下來我們將介紹三種詞袋模型。
CountVectorizer是sklearn庫中feature_extraction分支中的一個常見的特征數(shù)值計數(shù)類,其作用是將文本轉(zhuǎn)化成詞頻矩陣。N-Grams袋模型
N-Grams袋模型是詞袋模型的一個擴展,被用來統(tǒng)計按順序出現(xiàn)的單詞或短語的出現(xiàn)頻率。N-Grams的初始化是一個m*n的矩陣,m為文檔的數(shù)量,n是短語的長度。例如,我們想調(diào)查一個有三個單詞組成的短語在文章中的出現(xiàn)頻率,我們就可以通過設(shè)置CountVectorizer中ngram_range=(3,3)來實現(xiàn)。但是要注意,N-Grams統(tǒng)計的是文章中去除關(guān)鍵詞后連續(xù)的詞。TF-IDF模型
TF-IDF模型,被用來解決文檔中某些出現(xiàn)頻率較少的特征被出現(xiàn)頻率較大的特征掩蓋的問題,是信息檢索和自然語言處理領(lǐng)域中一個不可或缺的模型。舉個例子,給你大量談?wù)揂喜歡吃什么的文章,讓你從中提取A這個人喜歡吃的都有什么。假設(shè)A喜歡吃烤鴨、白菜、油條、豆?jié){、西紅柿和饅頭,且A頓頓都吃饅頭。所以在一篇文章中,通常饅頭這個詞出現(xiàn)的頻率是高于其他幾個特征出現(xiàn)的頻率。那么,在文章足夠多的情況下,可能饅頭這個詞的出現(xiàn)頻率會高達99%,從而認為饅頭是A喜歡吃的,而烤鴨、白菜等則被作為干擾項而排除。圖像特征提取
在我們?nèi)粘I钪校瑘D像是繼文字外又一重要的信息承載體,當(dāng)下的圖片處理技術(shù)同樣也離不開圖像特征提取。不過在講解如何提取圖像特征之前,我們首先要知道什么是圖像以及圖像在機器中是如何存儲的。
以上面這張圖為例,我們可以看到這張圖是由64個小方格組成的(8*8),這每一個小方格我們稱之為像素,上面這張圖的像素就是64像素。仔細看這張圖,我們會發(fā)現(xiàn)白色的地方有的白一點,有的黑一點,我們可以用一個數(shù)值來量化它們,越黑的地方數(shù)值越?。兒跒榱悖?,越白的地方數(shù)值越大,這樣整張圖就可以轉(zhuǎn)化成一個二維矩陣的形式來在機器中存儲,這就是黑白圖像在機器中的存儲方式,矩陣中的數(shù)值我們稱之為灰度。[[0.0.0.12.13.0.0.0.][0.0.5.16.8.0.0.0.][0.0.13.16.3.0.0.0.][0.0.14.13.0.0.0.0.][0.0.15.12.7.2.0.0.][0.0.13.16.13.16.3.0.][0.0.7.16.11.15.8.0.][0.0.1.9.15.11.3.0.]]
上面這個二維矩陣就是圖片在機器中存儲的結(jié)果,其中的數(shù)值代表灰度。如果圖片是一張黑白圖片,那么我們通常會稱之為灰度圖。
對于彩色圖片在機器中的存儲,我們以上面這張圖為例。彩色圖的存儲不同于灰度圖,對于灰度圖來說,像素只需要一個二維矩陣就可以儲存,但對于彩色圖來說,一個像素就需要不止一個矩陣來保存,矩陣中的列會包含多個子列,即含有多個顏色通道,例如RGB圖像就有紅、綠、藍三個顏色通道。對于多通道圖來說,有N個通道,其存儲就需要N維矩陣。
上面4個圖片分別是三通道圖、“B”通道圖、“R”通道圖和“G”通道圖。[[251251251...255255255][251251251...255255255][251251251...255255255]...[249250250...255255255][249250250...255255255][249250250...255255255]]這里只展示“B”通道的存儲矩陣。
了解了圖片在機器中是如何存儲的之后,我們來熟悉一下簡單的圖片操作。對圖像的的處理本書采用的是Python中的OpenCV庫首先讓我們來了解一下基本操作:importcv2ascv讀入圖片:tp=cv.imread('D:\s.jpg')輸出圖片:cv.imshow('tp',tp)cv.waitKey()waitKey的作用是使圖片延時關(guān)閉,括號中可自定義關(guān)閉時間。保存圖片:cv.imwrite("D:\\a.jpg",tp)顯示某個顏色通道:tp=cv.imread('D:\s.jpg')B,G,R=cv.split(tp)cv.imshow('B',B)cv.imshow('G',G)cv.imshow('R',R)cv.waitKey()轉(zhuǎn)化成灰度圖:importcv2ascvtp=cv.imread('D:\s.jpg')t=cv.cvtColor(tp,cv.COLOR_BGR2GRAY)cv.imshow('t',t)cv.waitKey()我們知道,對于jpg彩色圖來說,其存儲方式都是RBG三色通道(即三維矩陣),但是在cv2中,圖片的顏色通道的排列順序卻是BGR排列,我們把它轉(zhuǎn)化成灰度圖(二維矩陣),就要對其進行壓縮,而cv.cvtColor(tp,cv.COLOR_BGR2GRAY)的作用就是將圖片壓縮成二維矩陣(轉(zhuǎn)化成灰度圖)。我們以這章灰度圖為例,講解如何提取像素值特征首先,我們要將這張灰度圖讀入tp=cv.imread('D:\s.jpg',0)0的作用是以灰度圖的形式讀入。我們知道,一張圖是由若干個像素做成的,且每個像素都有自己的值(灰度)。所以我們可以將每一個像素看做是一個單獨的特征,那么這一張圖片就有N*M個特征(N代指圖片的長,M代指圖片的寬),所以我們接下來只要知道這個圖片有多少像素就可以知道這張圖片有多少像素值特征。查看圖片大?。簆rint(tp.shape)結(jié)果:(728,728)所以這張圖片就有728*728即529984個特征。提取:Feature_tp=np.reshape(tp,(728*728))print(feature_tp.shape)print(feature_tp)輸出:(529984,)[0.570101570.570101570.5686949...0.552929410.568615690.57645882]5.3特征選擇
當(dāng)特征經(jīng)過特征提取和預(yù)處理之后,我們就應(yīng)該思考一個問題:如何選擇對我們最有意義的特征?在未進行模型訓(xùn)練之前,我們可不可以剔除一些無關(guān)緊要的特征使得我們所構(gòu)建的模型具有更好的泛化能力?而這就是我們即將要學(xué)習(xí)的特征選擇。FilterFilter過濾法,根據(jù)特征在各種統(tǒng)計檢驗中的得分以及與目標(biāo)的相關(guān)性來進行特征選擇。從方差的角度考慮,如果一個特征的方差為0,那么我們就可以毫不客氣的把這個特征移除。一個特征的方差越小,說明這個特征在我們所研究的模型中基本相同,甚至取值也相同,那么我們就可以把這個無關(guān)特征剔除。VarianceThreshold方差過濾,是Filter中常用的一個方法,是sklearn.feature_selection中的一個方法。以如下數(shù)據(jù)為例:[[100000][110000][111000][111100][111110][111111]]fromsklearn.feature_selectionimportVarianceThresholdvt=VarianceThreshold(threshold=.6*(1-.6))data=vt.fit_transform(data)print(data)結(jié)果:[[0][0][0][1][1][1]]我們可以看到,VarianceThreshold刪除了出現(xiàn)概率大于0.6(方差小于0.6*(1-0.6)=0.24)的特征。如果我們從相關(guān)性的角度考慮,研究單一特征對于目標(biāo)的相關(guān)性來進行特征選擇。那么我們將從以下兩個方面進行考慮:對于研究目標(biāo)為連續(xù)特征(分類問題):我們可以使用皮爾森相關(guān)系數(shù)和最大信息系數(shù)來進行特征選擇;對于研究目標(biāo)為離散特征(回歸問題):我們可以使用卡方檢驗來進行特征選擇;接下來我們分別演示上述方法的代碼實現(xiàn)??ǚ綑z驗:我們以sklearn自帶的cancer數(shù)據(jù)集為例;fromsklearn.datasetsimportload_breast_cancerfromsklearn.feature_selectionimportchi2,SelectKBestcancer=load_breast_cancer()x,y=cancer.data,cancer.targetprint(x.shape)x_after_chi2=SelectKBest(chi2,k=3).fit_transform(x,y)print(x_after_chi2.shape)輸出:(569,30)(569,3)我們可以看到,經(jīng)過卡方檢驗后,選擇出了三個最優(yōu)的特征,其中SelectKBest中k的作用是調(diào)節(jié)選出特征的數(shù)量,這里作者設(shè)置的是k=3。皮爾森相關(guān)系數(shù):fromscipy.statsimportpearsonrimportpandasaspdcancer=load_breast_cancer()data=cancer.dataname=cancer.feature_namesdf_data=pd.DataFrame(data,columns=name)mean_radius=df_data['meanradius'].valuesmean_area=df_data['meanarea'].valuesprint(pearsonr(mean_radius,cancer.target))print(pearsonr(mean_area,cancer.target))print(pearsonr(1/mean_radius,cancer.target))print(pearsonr(mean_radius,mean_area))print(pearsonr(1/mean_radius,mean_area))輸出:(-0.7300285113754555,8.465940572265007e-96)(-0.708983836585389,4.734564310308523e-88)(0.6963446864460401,1.008218724950505e-83)(0.9873571700566124,0.0)(-0.8949235983985604,7.361249768074129e-201)Pearsonr輸出的是一個二元組(score,p-value),其中score的取值為[-1,1],score的值越接近1表示具有正相關(guān),0表示不相關(guān),-1表示具有負相關(guān)。但是,皮爾森相關(guān)系數(shù)還有一個明顯的缺陷:只對線性相關(guān)敏感,對于非線性相關(guān)則不敏感。例如:x=np.random.randint(-100,100,1000)y=x**xprint(pearsonr(x,y))輸出:(-0.023685330149289394,0.4543611970681528)最大信息系數(shù),彌補了皮爾森相關(guān)系數(shù)對非線性相關(guān)不敏感的缺點fromminepyimportMINEm=MINE()x=np.random.randint(-100,100,1000)y=x**2pute_score(x,y)print(m.mic())輸出:0.9999663372141733WrapperWrapper包裝法,其原理是根據(jù)一個目標(biāo)函數(shù)進行訓(xùn)練,每次選擇若干特征或排除若干特征,常用的方法是遞歸消除特征法(RecursiveFeatureElimination,RFE)。遞歸消除特征法(RFE),選定一個基模型進行多輪訓(xùn)練,每輪訓(xùn)練過后,移除若干權(quán)重系值的特征,新的特征重新開始下輪訓(xùn)練。實現(xiàn):我們以sklearn自帶的鳶尾花iris數(shù)據(jù)集為例fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegression,LogisticRegressionfromsklearn.feature_selectionimportRFEiris=load_iris()rfe=RFE(estimator=LogisticRegression(),n_features_to_select=2)rfe.fit(iris.data,iris.target)new_data=rfe.transform(iris.data)tr_x,te_x,tr_y,te_y=train_test_split(new_data,iris.target)reg=LinearRegression()reg.fit(tr_x,tr_y)print("score_ref:{}".format(reg.score(te_x,te_y)))輸出:score_ref:0.9520066024532783如果我們不進行特征選擇,結(jié)果:score:0.9111603863444916我們可以看到,我們使用了RFE進行遞歸消除特征,得到的結(jié)果比沒有遞歸得到的結(jié)果反而要好上許多,這里n_feature_to_select的取值為[1,特征數(shù)],estimator為所選擇的基函數(shù)。當(dāng)然我們也可以查看遞歸消除特征后選擇的新特征print(rfe.ranking_)利用RFE中的ranking_函數(shù)查看。結(jié)果:[3211]我們可以從中看出,RFE之后,新特征保留了第三列和第二列的特征,刪除了第一列和第零列的特征。EmbeddedEmbedded嵌入法,讓特征選擇和算法同時訓(xùn)練,讓算法選擇去使用那些特征。其原理是先特征在模型中訓(xùn)練,利用訓(xùn)練得到的各項特征的權(quán)值系數(shù)按照從大到小原則去選擇特征,一般選取能對特征進行打分的模型來進行特征選擇。這里,我們利用sklearn.feature_selection中SelectFromModel進行特征選擇。實現(xiàn):基于L1的特征選擇我們以sklearn中的wine數(shù)據(jù)集為例fromsklearn.svmimportLinearSVCfromsklearn.datasetsimportload_winefromsklearn.feature_selectionimportSelectFromModelfromsklearn.linear_modelimportLinearRegressionfromsklearn.model_selectionimporttrain_test_splitwine=load_wine()model=SelectFromModel(LinearSVC(C=0.06,penalty='l1',dual=False).fit(wine.data,wine.target),prefit=True)new_data=model.transform(wine.data)print(new_data.shape)tr_x,te_x,tr_y,te_y=train_test_split(new_data,wine.target)reg=LinearRegression().fit(tr_x,tr_y)print(reg.score(te_x,te_y))我們可以比對一下結(jié)果:score_L1:0.900416686283543score:0.8777617089374858這里我們也可以查看L1特征選擇后新特征的個數(shù)print(wine.data.shape)print(new_data.shape)輸出:(178,13)(178,8)可以看到,L1選擇后舍棄了5個特征?;陔S機森林的特征選擇fromsklearn.ensembleimportRandomForestClassifiernew_data=SelectFromModel(RandomForestClassifier(n_estimators=10),threshold=0.02).fit_transform(wine.data,wine.target)tr_x,te_x,tr_y,te_y=train_test_split(new_data,wine.target)reg=LinearRegression().fit(tr_x,tr_y)print(reg.score(te_x,te_y))對比結(jié)果:score_randomforest:0.9197384294818963score:0.8762378048776154當(dāng)然還有很多模型可供選擇5.4降維
通常情況下,我們通過特征提取得到的特征往往都是比較冗沉和復(fù)雜的,特征數(shù)量達到幾十或者幾百。在這種情況下,即使我們對特征進行預(yù)處理和特征選擇,用所得到的新特征進行機器學(xué)習(xí),但模型的泛化能力可能仍然達不到理想的標(biāo)準(zhǔn)。再者說,特征(維度)越多,所能用于機器學(xué)習(xí)的樣本就越少,而且在高維情形下計算也成了很大一個難題。
降維,就是將高維度的數(shù)據(jù)經(jīng)過有限次的變換,轉(zhuǎn)變成低維度的數(shù)據(jù)。從而使得數(shù)據(jù)能更好的應(yīng)用在機器學(xué)習(xí)上,得到一個更好的結(jié)果。降維對高維度特征數(shù)據(jù)預(yù)處理方法,將高維度的數(shù)據(jù)保留下最重要的一些特征,去除噪聲和不重要的特征,從而實現(xiàn)提升數(shù)據(jù)處理速度的目的。在實際的生產(chǎn)和應(yīng)用中,降維在一定的信息損失范圍內(nèi),可以為我們節(jié)省大量的時間和成本。降維也成為應(yīng)用非常廣泛的數(shù)據(jù)預(yù)處理方法。降維的優(yōu)點有:使得數(shù)據(jù)集更易使用,降低算法的計算開銷,去除噪聲,使得結(jié)果容易理解。
降維的算法有很多,比如主成分分析(PCA)、獨立成分分析(ICA)、線性辨別分析(LDA),主成分分析和獨立成分分析是無監(jiān)督學(xué)習(xí),而線性辨別分析是監(jiān)督學(xué)習(xí)。本節(jié)只對PCA進行詳細講解,并對ICA和LDA進行簡單介紹。PCA
PCA是最常用的線性降維方法,它的目標(biāo)是通過某種線性投影,將高維的數(shù)據(jù)映射到低維的空間中表示,并期望在所投影的維度上數(shù)據(jù)的方差最大,以此使用較少的數(shù)據(jù)維度,同時保留住較多的原數(shù)據(jù)點的特性。
通俗的理解,如果把所有的點都映射到一起,那么幾乎所有的信息都丟失了,而如果映射后方差盡可能的大,那么數(shù)據(jù)點則會分散開來,以此來保留更
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度城市公共交通車輛運營管理合同3篇
- 2025年度柴油市場分析與預(yù)測服務(wù)合同范本4篇
- 專業(yè)設(shè)備銷售協(xié)議模板集(2024版)版
- 2025年廠區(qū)綠化生態(tài)教育推廣與培訓(xùn)服務(wù)協(xié)議4篇
- 2024年起重機研發(fā)與購銷合作項目合同范本3篇
- 二零二四家居建材店員工勞動合同模板3篇
- 2025年度智能機器人技術(shù)研發(fā)合作協(xié)議4篇
- 2024版企業(yè)技術(shù)改造借款的合同范本
- 二零二五版醫(yī)療設(shè)備采購與租賃合同范本3篇
- 2024年04月吉林銀行總行投資銀行部2024年社會招考1名負責(zé)人筆試歷年參考題庫附帶答案詳解
- 人口老齡化背景下居民養(yǎng)老金融資產(chǎn)配置影響因素研究
- 2024文旅古街元旦沉浸式體驗國風(fēng)游園會(古巷十二時辰主題)活動方案活動-46正式版
- (課件)-談研究生培養(yǎng)
- 《disc性格分析》課件
- 2025年臨床醫(yī)師定期考核必考復(fù)習(xí)題庫及答案(900題)
- 反恐應(yīng)急預(yù)案3篇
- 英語-2025廣西柳州高三二模試卷和答案
- 微更新視角下老舊社區(qū)公共空間適老化設(shè)計策略研究
- 電工中級工練習(xí)題庫(含參考答案)
- 骨科2025年度工作計劃
- 學(xué)校幫扶工作計劃
評論
0/150
提交評論