為什麼使用one hot編碼來處理離散型特徵

2021-09-29 13:59:23 字數 1352 閱讀 7314

————————————————————————————————————————

from sklearn import preprocessing  

enc = preprocessing.onehotencoder()  

enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])  #這裡一共有4個資料,3種特徵

array = enc.transform([[0,1,3]]).toarray()  #這裡使用乙個新的資料來測試

print array   # [[ 1  0  0  1  0  0  0  0  1]]

結果為 1 0 0 1 0 0 0 0 1

————————————————————————————————————————

在回歸,分類,聚類等機器學習演算法中,特徵之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算余弦相似性,基於的就是歐式空間。

而我們使用one-hot編碼,將離散特徵的取值擴充套件到了歐式空間,離散特徵的某個取值就對應歐式空間的某個點。

將離散型特徵使用one-hot編碼,確實會讓特徵之間的距離計算更加合理。

比如,有乙個離散型特徵,代表工作型別,該離散型特徵,共有三個取值,不使用one-hot編碼,其表示分別是x_1 = (1), x_2 = (2), x_3 = (3)。兩個工作之間的距離是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那麼x_1和x_3工作之間就越不相似嗎?顯然這樣的表示,計算出來的特徵的距離是不合理。那如果使用one-hot編碼,則得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那麼兩個工作之間的距離就都是sqrt(2).即每兩個工作之間的距離是一樣的,顯得更合理。

————————————————————————————————————————

將離散型特徵進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特徵是離散的,並且不用one-hot編碼就可以很合理的計算出距離,那麼就沒必要進行one-hot編碼。

比如,該離散特徵共有1000個取值,我們分成兩組,分別是400和600,兩個小組之間的距離有合適的定義,組內的距離也有合適的定義,那就沒必要用one-hot 編碼。

離散特徵進行one-hot編碼後,編碼後的特徵,其實每一維度的特徵都可以看做是連續的特徵。就可以跟對連續型特徵的歸一化方法一樣,對每一維特徵進行歸一化。比如歸一化到[-1,1]或歸一化到均值為0,方差為1。

分類時為什麼都選擇one hot編碼

這裡可以做乙個思考啊,分類時,一般都會選擇把類別用one hot進行編碼,比如共有5個類,那麼就有5個編碼 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 這是為什麼呢?為什麼不直接用1,2,3,4,5來表示5個類別呢?個人覺得,乙個很重要的原因在...

在機器學習中為什麼要進行 One Hot 編碼?

類別資料是一種只有標籤值而沒有數值的變數。它的值通常屬於乙個大小固定且有限的集合。類別變數也常被稱為標稱值 nominal 下面舉例說明 以上例子中的每個值都代表著乙個不同的類別。有些類別彼此間存在一定的自然關係,比如自然的排序關係。上述例子中,位次 place 變數的值就有這種自然的排序關係。這種...

使用Numpy進行one hot編碼

在實現很多機器學習任務的時候,經常需要將labels進行one hot encoding,具體思想這裡就不詳述,借一張圖來表示 numpy實現可以是這樣 函式需不需要返回轉置要根據具體情況看 如果不轉置每個label返回的就是乙個行向量 這裡轉置了,每個label就是對應的列向量 def conve...