獨熱編碼和標籤編碼詳解


簡介

分類變數廣泛應用於資料分析和機器學習中。許多演算法無法直接處理這些變數,在使用之前必須將其編碼或轉換為數值資料。獨熱編碼和標籤編碼是兩種常用的分類資料編碼方法。獨熱編碼為分類變數中的每個類別提供一個二進位制向量,指示該類別是否存在。

我們將討論獨熱編碼和標籤編碼的概念,以及它們的優缺點,並舉例說明何時以及如何使用每種方法。

獨熱編碼

分類變數經常用於機器學習和資料分析中。例如顏色、性別或年齡組,這些變數具有有限數量的不同值。然而,大多數機器學習演算法需要數值輸入,而分類變數不是數值型的。因此,我們需要將這些分類變數編碼成數值表示。

獨熱編碼是一種常用的將分類變數轉換為數值值的方法。這是將分類資料轉換為二進位制資料,其中所有類別都由一個二進位制值表示。為整個分類變數生成長度等於類別數的二進位制向量。例如,假設你的分類變數有三個類別:“紅色”、“綠色”和“藍色”,則該變數的獨熱編碼表示具有三個維度,每個維度代表一個類別。

在獨熱編碼中,反映觀測值所屬類別的維度被賦予二進位制值 1,所有其他維度被賦予二進位制值 0。例如,如果一個觀測值屬於“紅色”類別,則其獨熱編碼向量的第一個維度將為 1,所有其他維度將為 0。如果一個觀測值屬於“綠色”類別,則其獨熱編碼向量的第二個維度將具有值 1,而所有其他維度將具有值 0。

獨熱編碼的一個優點是它使機器學習演算法能夠將分類輸入視為連續變數,從而可能提高模型精度。它還可以避免為類別賦予任意數值的問題,這可能會導致不正確的推斷。

但是,獨熱編碼也有一些侷限性。主要擔憂之一是,特別是如果分類變數具有許多類別,它可能會產生大量的特徵。當特徵數量超過資料集大小時,就會出現“維度災難”,導致過擬合和效能下降。獨熱編碼也可能導致共線性,當兩個或多個特徵高度相關時,這會損害模型效能。

示例

import pandas as pd 
 
# create a sample dataframe with categorical variables 
df = pd.DataFrame({'Fruit': ['Apple', 'Orange', 'Banana', 'Banana', 'Orange', 'Apple']}) 
 
# perform one hot encoding 
one_hot_df = pd.get_dummies(df, columns=['Fruit']) 
 
# print the encoded dataframe 
print(one_hot_df) 

輸出

   Fruit_Apple  Fruit_Banana  Fruit_Orange 
0	 1             0              0 
1	 0             0              1 
2	 0             1              0 
3	 0             1              0 
4	 0             0              1 
5	 1             0              0 

此示例建立了一個包含名為“水果”的分類變數的 Pandas 資料框,該變數具有 6 個可用值。接下來,我們使用 Pandas 的 `get_dummies()` 方法對“水果”變數進行獨熱編碼。`get_dummies` 是一個建立新列的函式()。此新列的每一行都有一個二進位制值 1 或 0,並且包含不同的水果變數。該數字是 1 還是 0 取決於該特定行的水果是否與列中的值匹配。匯出編碼後的資料框後,將顯示結果。

標籤編碼

另一種編碼類別資訊的方法是標籤編碼。它透過為每個類別分配一個數值來將其轉換為序數資料。使用這種技術,每個類別都分配一個唯一的整數值。例如,如果分類變數“顏色”包含類別“紅色”、“綠色”和“藍色”,則標籤編碼將為“紅色”、“綠色”和“藍色”分別分配值 1、2 和 3。

標籤編碼易於實現,並保留類別的順序,在某些情況下這可能是有利的。然而,標籤編碼也有侷限性。透過為每個類別分配一個獨特的整數值,它會在它們之間建立隱式的序數關係。如果類別之間沒有自然的順序,這可能會導致問題。此外,由於為類別分配的數值的任意性,標籤編碼可能無法始終有效地反映類別之間的潛在關係。

標籤編碼的另一個缺點是它可能會在與機器學習演算法一起使用時導致問題。某些演算法,如決策樹和線性迴歸,可能會將數值視為連續變數,從而導致模型預測不準確。因此,必須謹慎使用標籤編碼,並在生產環境中使用之前仔細檢查模型的效能。

示例

from sklearn.preprocessing import LabelEncoder 
 
# Sample data data = ['apple', 'banana', 'banana', 'orange', 'kiwi', 'mango', 'apple'] 
 
# Create label encoder object 
le = LabelEncoder() 
 
# Fit and transform the data 
encoded_data = le.fit_transform(data) 
 
print(encoded_data) 

輸出

[0 1 1 4 2 3 0] 

在此示例中,我們從 `sklearn.preprocessing` 包中匯入了 `LabelEncoder` 模組。接下來,我們建立一個 `LabelEncoder` 類的例項,並使用 `fit_transform()` 函式來擬合和轉換樣本資料。編碼後的原始資料的版本作為輸出返回。

請注意,標籤編碼為資料中每個類別分配唯一的數值,從 0 開始。在此示例中,“蘋果”分配為 0,“香蕉”分配為 1,“橙子”分配為 2,“奇異果”分配為 3,“芒果”分配為 4。

結論

最後,獨熱編碼和標籤編碼是機器學習中兩種廣泛使用的用於編碼分類資料的策略。獨熱編碼為每個類別生成二進位制列,而標籤編碼為每個類別提供唯一的數值標籤。這兩種策略的選擇取決於資料的性質和所使用的機器學習演算法。為了確保準確和成功的分析,瞭解每種方法的優勢和侷限性至關重要。

更新於:2023年7月24日

4K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.