Python分析特征數(shù)據(jù)類別與預(yù)處理方法速學(xué)
前言
當(dāng)我們開始準(zhǔn)備數(shù)據(jù)建模、構(gòu)建機器學(xué)習(xí)模型的時候,第一時間考慮的不應(yīng)該是就考慮到選擇模型的種類和方法。而是首先拿到特征數(shù)據(jù)和標(biāo)簽數(shù)據(jù)進行研究,挖掘特征數(shù)據(jù)包含的信息以及思考如何更好的處理這些特征數(shù)據(jù)。那么數(shù)據(jù)類型本身代表的含義就需要我們進行思考,究竟是定量計算還是進行定類分析更好呢?這就是這篇文章將要詳解的一個問題。
一、特征類型判別
特征類型判斷以及處理是前期特征工程重要的一環(huán),也是決定特征質(zhì)量好壞和權(quán)衡信息丟失最重要的一環(huán)。其中涉及到的數(shù)據(jù)有數(shù)值類型的數(shù)據(jù),例如:年齡、體重、身高這類特征數(shù)據(jù)。也有字符類型特征數(shù)據(jù),例如性別、社會階層、血型、國家歸屬等數(shù)據(jù)。
按照數(shù)據(jù)存儲的數(shù)據(jù)格式可以歸納為兩類:
按照特征數(shù)據(jù)含義又可分為:
- 離散型隨機變量:取值只能是可取范圍內(nèi)的指定數(shù)值類型的隨機變量,比如年齡、車流量此類數(shù)據(jù)。
- 連續(xù)隨機變量:按照測量或者計算方法得到,在某個范圍內(nèi)連取n個值,此類數(shù)據(jù)可化為定類數(shù)據(jù)。
- 二分類數(shù)據(jù):此類數(shù)據(jù)僅只有兩類:例如是與否、成功與失敗。
- 多分類數(shù)據(jù):此類數(shù)據(jù)有多類:例如天氣出太陽、下雨、陰天。
- 周期型數(shù)據(jù):此類數(shù)據(jù)存在一個周期循環(huán):例如周數(shù)月數(shù)。
二、定量數(shù)據(jù)特征處理
拿到獲取的原始特征,必須對每一特征分別進行歸一化,比如,特征A的取值范圍是[-1000,1000],特征B的取值范圍是[-1,1].如果使用logistic回歸,w1x1+w2x2,因為x1的取值太大了,所以x2基本起不了作用。所以,必須進行特征的歸一化,每個特征都單獨進行歸一化。
關(guān)于處理定量數(shù)據(jù)我已經(jīng)在:數(shù)據(jù)預(yù)處理歸一化詳細解釋這篇文章里面講述的很詳細了,這里進行前后關(guān)聯(lián),共有min-max標(biāo)準(zhǔn)化、Z-score標(biāo)準(zhǔn)化、Sigmoid函數(shù)標(biāo)準(zhǔn)化三種方法:
根據(jù)特征數(shù)據(jù)含義類型來選擇處理方法:
- 離散型隨機變量處理方法:min-max標(biāo)準(zhǔn)化、Z-score標(biāo)準(zhǔn)化、Sigmoid函數(shù)標(biāo)準(zhǔn)
- 連續(xù)隨機變量處理:Z-score標(biāo)準(zhǔn)化,Sigmoid函數(shù)標(biāo)準(zhǔn)
三.定類數(shù)據(jù)特征處理
我的上篇文章[數(shù)據(jù)預(yù)處理歸一化詳細解釋]并沒有介紹關(guān)于定類數(shù)據(jù)我們?nèi)绾稳ヌ幚?,在本篇文章詳細介紹一些常用的處理方法:
1.LabelEncoding
直接替換方法適用于原始數(shù)據(jù)集中只存在少量數(shù)據(jù)需要人工進行調(diào)整的情況。如果需要調(diào)整的數(shù)據(jù)量非常大且數(shù)據(jù)格式不統(tǒng)一,直接替換的方法也可以實現(xiàn)我們的目的,但是這種方法需要的工作量會非常大。因此, 我們需要能夠快速對整列變量的所有取值進行編碼的方法。
LabelEncoding,即標(biāo)簽編碼,作用是為變量的 n 個唯一取值分配一個[0, n-1]之間的編碼,將該變量轉(zhuǎn)換成連續(xù)的數(shù)值型變量。
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() le.fit(['擁堵','緩行','暢行']) le.transform(['擁堵','擁堵','暢行','緩行'])
array([0, 0, 1, 2])
2.OneHotcoding
對于處理定類數(shù)據(jù)我們很容易想到將該類別的數(shù)據(jù)全部替換為數(shù)值:比如車輛擁堵情況,我們把擁堵標(biāo)為1,緩行為2,暢行為3.那么這樣是實現(xiàn)了標(biāo)簽編碼的,但同時也給這些無量綱的數(shù)據(jù)轉(zhuǎn)為了有量綱數(shù)據(jù),我們本意是沒有將它們比較之意的。機器可能會學(xué)習(xí)到“擁堵<緩行<暢行”,所以采用這個標(biāo)簽編碼是不夠的,需要進一步轉(zhuǎn)換。因為有三種區(qū)間,所以有三個比特,即擁堵編碼為100,緩行為010,暢行為001.如此一來每兩個向量之間的距離都是根號2,在向量空間距離都相等,所以這樣不會出現(xiàn)偏序性,基本不會影響基于向量空間度量算法的效果。
自然狀態(tài)碼為:000,001,010,011,100,101
獨熱編碼為:000001,000010,000100,001000,010000,100000
我們可以使用sklearn的onehotencoder來實現(xiàn):
from sklearn import preprocessing enc = preprocessing.OneHotEncoder() enc.fit([[0, 0, 1], [0, 1, 0], [1, 0, 0]]) # fit來學(xué)習(xí)編碼 enc.transform([[0, 0, 1]]).toarray() # 進行編碼
array([[1., 0., 1., 0., 0., 1.]])
數(shù)據(jù)矩陣是3*3的,那么原理是怎么來的呢?我們仔細觀察:
第一列的第一個特征維度有兩種取值0/1,所以對應(yīng)的編碼方式為10、01.
第二列的第二個特征也是一樣的,類比第三列的第三個特征。固001的獨熱編碼就是101001了。
因為大部分算法是基于向量空間中的度量來進行計算的,為了使非偏序關(guān)系的變量取值不具有偏序性,并且到圓點是等距的。使用one-hot編碼,將離散特征的取值擴展到了歐式空間,離散特征的某個取值就對應(yīng)歐式空間的某個點。將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。離散特征進行one-hot編碼后,編碼后的特征,其實每一維度的特征都可以看做是連續(xù)的特征。就可以跟對連續(xù)型特征的歸一化方法一樣,對每一維特征進行歸一化。比如歸一化到[-1,1]或歸一化到均值為0,方差為1。
將離散特征通過one-hot編碼映射到歐式空間,是因為,在回歸,分類,聚類等機器學(xué)習(xí)算法中,特征之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算余弦相似性,基于的就是歐式空間。
優(yōu)點:
獨熱編碼解決了分類器不好處理屬性數(shù)據(jù)的問題,在一定程度上也起到了擴充特征的作用。它的值只有0和1,不同的類型存儲在垂直的空間。
缺點:
當(dāng)類別的數(shù)量很多時,特征空間會變得非常大。在這種情況下,一般可以用PCA來減少維度。而且one hot encoding+PCA這種組合在實際中也非常有用。
應(yīng)用場景:
獨熱編碼用來解決類別型數(shù)據(jù)的離散值問題。
無用場景:
將離散型特征進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特征是離散的,并且不用one-hot編碼就可以很合理的計算出距離,那么就沒必要進行one-hot編碼。有些基于樹的算法在處理變量時,并不是基于向量空間度量,數(shù)值只是個類別符號,即沒有偏序關(guān)系,所以不用進行獨熱編碼。 Tree Model不太需要one-hot編碼: 對于決策樹來說,one-hot的本質(zhì)是增加樹的深度。
代碼實現(xiàn)
方法一: 實現(xiàn)one-hot編碼有兩種方法:sklearn庫中的 OneHotEncoder() 方法只能處理數(shù)值型變量如果是字符型數(shù)據(jù),需要先對其使用 LabelEncoder() 轉(zhuǎn)換為數(shù)值數(shù)據(jù),再使用 OneHotEncoder() 進行獨熱編碼處理,并且需要自行在原數(shù)據(jù)集中刪去進行獨熱編碼處理的原變量。
import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import LabelEncoder, OneHotEncoder lE = LabelEncoder() df=pd.DataFrame({'路況':['擁堵','暢行','暢行','擁堵','暢行','緩行','緩行','擁堵','緩行','擁堵','擁堵','擁堵']}) df['路況']=lE.fit_transform(df['路況']) OHE = OneHotEncoder() X = OHE.fit_transform(df).toarray() df = pd.concat([df, pd.DataFrame(X, columns=['擁堵', '緩行','暢行'])],axis=1) df
方法二:
pandas自帶get_dummies()方法
get_dummies() 方法可以對數(shù)值數(shù)據(jù)和字符數(shù)據(jù)進行處理,直接在原數(shù)據(jù)集上應(yīng)用該方法即可。該方法產(chǎn)生一個新的Dataframe,列名由原變量延伸而成。將其合并入原數(shù)據(jù)集時,需要自行在原數(shù)據(jù)集中刪去進行虛擬變量處理的原變量。
import pandas as pd df=pd.DataFrame({'路況':['擁堵','暢行','暢行','擁堵','暢行','緩行','緩行','擁堵','緩行','擁堵','擁堵','擁堵']}) pd.get_dummies(df,drop_first=False)
以上就是Python分析特征數(shù)據(jù)類別與預(yù)處理方法速學(xué)的詳細內(nèi)容,更多關(guān)于Python 數(shù)據(jù)類別分析預(yù)處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pytorch實現(xiàn)LSTM案例總結(jié)學(xué)習(xí)
這篇文章主要介紹了Pytorch實現(xiàn)LSTM案例總結(jié)學(xué)習(xí),文章通過構(gòu)建網(wǎng)絡(luò)層、前向傳播forward()展開主題介紹,需要的小伙吧可以參考一下2022-07-07Python列表切片操作實例探究(提取復(fù)制反轉(zhuǎn))
在Python中,列表切片是處理列表數(shù)據(jù)非常強大且靈活的方法,本文將全面探討Python中列表切片的多種用法,包括提取子列表、復(fù)制列表、反轉(zhuǎn)列表等操作,結(jié)合豐富的示例代碼進行詳細講解2024-01-01從零學(xué)python系列之教你如何根據(jù)圖片生成字符畫
網(wǎng)上有很多的字符畫,看起來很炫酷,下面就告訴你如何用Python做這么炫酷的事,2014-05-05python如何使用requests提交post請求并上傳文件(multipart/form-data)
這篇文章主要給大家介紹了關(guān)于python如何使用requests提交post請求并上傳文件(multipart/form-data)的相關(guān)資料,Python有許多庫支持,它們可以簡化HTTP上的數(shù)據(jù)傳輸,requests庫是最受歡迎的Python包之一,因為它在網(wǎng)絡(luò)刮削中被大量使用,需要的朋友可以參考下2023-11-11在pandas中遍歷DataFrame行的實現(xiàn)方法
這篇文章主要介紹了在pandas中遍歷DataFrame行的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10python實現(xiàn)給scatter設(shè)置顏色漸變條colorbar的方法
今天小編就為大家分享一篇python實現(xiàn)給scatter設(shè)置顏色漸變條colorbar的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python創(chuàng)建二維數(shù)組實例(關(guān)于list的一個小坑)
下面小編就為大家?guī)硪黄狿ython創(chuàng)建二維數(shù)組實例(關(guān)于list的一個小坑)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11