資料預處理1 分類特徵編碼

2021-10-04 17:16:57 字數 1701 閱讀 8286

背景**:we don't talk anymore

很多時候,在我們拿到的資料集裡,特徵不都是連續的值,而是由某些離散化取值的資料組成。例如,性別特徵可以具有如下取值:["male", "female"],天氣特徵有如下取值:["rainy", "sunny", "snowy"...]。

這樣的特徵是無法直接被模型識別的,因此需要將這些特徵轉換為數學模型能動的語言,乙個很容易想到的方法就是,對這些特徵進行數位化,也就是編號,比如,["male", "female"]可以用[0, 1]表示,["rainy", "sunny", "snowy"...]可以用[0,1, 2, ...]表示。總之,對於乙個有n個類別的特徵,總是可以用[0, n-1]之間的連續整數進行編號。

# 用sklearn實現

from sklearn.preprocessing import labelencoder

le = labelencoder() # 構造編碼器

le.fit(['sunny','rainy','snowy']) # 訓練編碼器

le.classes_ # 等於array(['rainy', 'snowy', 'sunny'])

le.transform(['sunny']) # 等於array([2])

上述的編碼方式,歸根結底,只是把離散型資料換了個表達方式,本質上還是不連續的。而且如果直接用的話,容易被當成是連續的數值型資料進行處理,造成錯誤,除非編碼後得到的資料連續性是有實際意義的。

對此,我們可以選擇用獨熱編碼來解決。通俗地講,對於乙個有n個類別的特徵,總是可以構造n個新特徵來唯一表示,比如,對於性別特徵可以構造兩個新特徵,兩個新特徵的取值分別為:"male"→[1, 0],"female"→[0, 1]。總之,這n個新特徵,在任何情況下,均只有1個特徵取值為1,其他特徵取值為0,從而保證了唯一性。

# 用sklearn實現

from sklearn.preprocessing import onehotencoder

ohe = onehotencoder() # 構造編碼器

ohe.fit([[1],[2],[3],[1],[3]]) # 訓練編碼器,輸入是labelencoder得到的整數型資料

ohe.active_features_ # 等於array([1, 2, 3])

ohe.transform([[2]]).toarray() # 等於array([[ 0., 1., 0.]])

可能你會感覺奇怪,特徵取值為[0, 1],還是離散的呀,何以解決資料的離散問題?那麼我們要回到本質上來看,為什麼我們不喜歡離散型資料?歸根結底,是因為沒辦法對此類特徵進行任何計算。(那你算幫我算算「李雷」和「韓梅梅」的距離有多遠?)

而我們將用onehotencoder編碼後的特徵當成是向量,相當於將特徵擴充套件到了歐式空間,那麼某個取值就對應著空間裡的某個點。在機器學習演算法中,特徵之間往往要進行相似性的計算,或者距離的計算,這些計算都是在歐式空間裡完成的。實際上,大部分機器學習演算法是基於向量空間中的度量來進行計算的。所以,onehotencoder編碼滿足了我們對於計算的要求。(為了通俗一點就這麼解釋啦)

上面也講到了,onehotencoder編碼的目的是擴充套件到歐式空間,便於計算距離。但是對於某些演算法,不需要計算特徵的距離,特徵是離散的也ok,那麼我們就沒必要多此一舉。比如決策樹演算法,以及以決策樹為基學習器的各類演算法。

資料預處理系列 (五)分類變數處理

博主簡介 風雪夜歸子 英文名 allen 機器學習演算法攻城獅,喜愛鑽研machine learning的黑科技,對deep learning和artificial intelligence充滿興趣,經常關注kaggle資料探勘競賽平台,對資料 machine learning和artificial...

新聞分類 資料預處理

結構化資料,是可以表示成多行多列的形式,並且,每行 列 都有著具體的含義。非結構化資料,無法合理地表示為多行多列的形式,即使那樣表示,每行 列 也沒有具體的含義。文字資料,是一種非結構化資料,與我們之前分析的結構化資料有所不同。因此,其預處理的步驟與方式也會與結構化資料有所差異。文字資料預處理主要包...

R語言 資料預處理 1分類時 因變數為數值型別

h ttp 1 因變數為數值型別,轉化為分類型別 cup98 target d2 cut cup98 target d,right f,breaks c 0,0.1,10,15,20,25,30,50,max cup98 target d breaks 也可以用 seq生成 breaks seq 0...