數據與特徵
獨熱編碼(one-hot encoding)
/ WUN-hot en-KOH-ding /
模型做的是算術,可許多特徵卻是詞語:顏色是「紅」「綠」或「藍」;城市是「東京」或「利馬」。如果你天真地把它們編成1、2、3,模型就會以為藍(3)莫名其妙地是紅(1)的三倍,或者紅與藍的平均數是綠——純屬胡來。獨熱編碼用「給每個類別各配一個是/否開關」的辦法來解決這個問題。
具體說來,一欄有k個可能取值的類別欄,會變成k個新欄,每個取值各占一欄。對任意一列,這些欄裡恰好有一個是1(「熱」),其餘都是0。於是「綠」就變成了(紅=0, 綠=1, 藍=0)。沒有哪個類別被當作比另一個更大;它們只是不同而已。這樣就能讓無序的類別——稱為名義類別(nominal)——如實地彼此分開,不會被偷偷塞進一個虛假的排序。
為何重要:它是把類別特徵餵給「期望數字」的模型的標準做法,從線性迴歸到神經網路皆然。代價在於「變寬」:一欄有成千上萬個類別的特徵(比如每個商品ID)會爆炸成成千上萬欄、且大多是零,既浪費又可能有害。對這種高基數情形,人們會轉向學習得到的嵌入(embedding)等替代方案。此外,獨熱編碼是給無序類別用的;若類別本有天然次序(小、中、大),把它們編成有序的數字反而可能更好。
一欄取值為蘋果、香蕉、櫻桃的「水果」欄,會變成三欄。一列香蕉讀作(蘋果=0, 香蕉=1, 櫻桃=0);一列蘋果讀作(蘋果=1, 香蕉=0, 櫻桃=0)。模型現在看到的是三個各自獨立、地位平等的選項,而不是一個虛假的1-2-3排序。
一欄類別變成幾個0/1開關——平等、無排序、如實。
留意類別數量。對一個有成千上萬個不同取值的特徵做獨熱編碼,會把你的資料脹成一片零的海洋;對這種高基數特徵,學習得到的嵌入或目標編碼通常是更明智的選擇。
又稱
另見