1。 one-hot 獨熱
獨熱,是機器學習中初學者經常聽到的一個詞。
從字面意義看,獨表示唯獨,一家獨大,獨佔鰲頭,獨熱表示只有1個熱,其他都是涼的。
事實也是如此。
我們來看一個獨熱編碼的例子:
[0, 1, 0, 0, 0]
可以看到,上面只有一個1,其他都是涼涼的0,這就是獨熱。
假設,我們有5種狀態:金、木、水、火、土。我們給這5個狀態留了5個空,它們都有專門的位置。
數字
位置編號
金
0
木
1
水
2
火
3
土
4
自從有了這個規則以後,但凡是老金出現,都是以這種狀態示人:[1, 0, 0, 0, 0],我有5個兄弟,我表示第一個。老土出現那就是:[0, 0, 0, 0, 1]。
如果兩個一起出現,是這樣式的:[[1, 0, 0, 0, 0],[0, 0, 0, 0, 1]]。
這就是獨熱的表示。
2。 為什麼要用獨熱?
為什麼會用這種奇怪的方式表示呢?老金直接是0,老土直接是4不就完了?
其實這麼做是有目的的。
獨熱是為了體現公平。每次出現都攜帶著團隊成員的數量,避免了招搖撞騙,說房子是自己的,其實自己只佔幾分之一。另外,每個成員只能是1,只是用來標記是不是你,無法誇大你的比重,比如展示成[99, 0, 0, 0, 0],這樣就不是獨熱的標準。
透過獨熱的編碼標準,使得計算時,公平公正。大家的值都是1,避免了你是1我是2,出現誰大誰小從而干擾計算。
如果,你的基礎學科比較好的話,其實我上面說那麼多,都是下面的通俗化:
大部分演算法是基於向量空間中的度量來進行計算的,為了使非偏序關係的變數取值不具備偏序性,而且到圓點是等距的。使用one-hot編碼,將離散特徵的取值擴充套件到了歐式空間,離散特徵的某個取值就對應歐式空間的某個點。將離散型特徵使用one-hot編碼,會讓特徵之間的距離計算更加合理。
3。 獨熱的侷限
雖然,獨熱編碼有優勢。但是,它也是有侷限性的。
獨熱適合表示少量的,無關聯的資料。
首先說它不適合大量的資料。如果總共有5條資料,那其中一條是這麼表示[1, 0, 0, 0, 0],如果是10條,這麼表示[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]。如果是5000條,那就是1個1,4999個0。這種情況,術語上叫過於稀疏,反而不利於計算。
另外,也是因為獨熱很公正公平,所以導致成員間沒有個人關係。有時候,尤其當自然語言處理時,我們很希望能表示出每個詞語間的相關性。
比如,我們要表示心情好壞程度,有如下幾種心情:悲傷、鬱悶、無聊、微笑、大笑、爆笑。那麼,我們假設以0為中心點,負面的情緒定義為負數,正面的情緒定義為正數。上面幾種狀態可以這麼表示:
心情
表示
悲傷
-3
鬱悶
-2
無聊
-1
微笑
1
大笑
2
爆笑
3
這樣,我們就可以瞭解他們之間的關係了:爆笑(3)程度要大於微笑(1)。大笑(2)和鬱悶(-2)是完全相反的狀態。
這種帶成員關係的資料,就不合適用獨熱來表示了。
4。 獨熱的應用場景
一般的分類問題,比如手寫數字識別,OCR識別,花朵種類識別。
TensorFlow提供了一個將數值轉換為獨熱編碼的方法:
import tensorflow as tflabels = [1,2,3]ys = tf。keras。utils。to_categorical(labels, 5)print(ys)
最終輸出的結果:
[[0。 1。 0。 0。 0。] [0。 0。 1。 0。 0。] [0。 0。 0。 1。 0。]]
此方法很有用,因為一般訓練集標記的不是獨熱編碼,比如手寫識別結果儲存都是具體的:3、6、2,我們可以使用to_categorical來轉化為獨熱編碼。