如何在 Python 中將分類特徵轉換為數值特徵?
在機器學習中,資料有多種型別,包括數值資料、分類資料和文字資料。分類特徵是指取值有限的一組值的特徵,例如顏色、性別或國家。但是,大多數機器學習演算法都需要數值特徵作為輸入,這意味著我們需要在訓練模型之前將分類特徵轉換為數值特徵。
在本文中,我們將探討在 Python 中將分類特徵轉換為數值特徵的各種技術。我們將討論獨熱編碼、標籤編碼、二進位制編碼、計數編碼和目標編碼,並提供使用 category_encoders 庫實現這些技術的示例。在閱讀完本文後,您將對如何在機器學習專案中處理分類特徵有一個很好的理解。
標籤編碼
標籤編碼是一種透過為每個類別分配一個唯一的整數值來將分類資料轉換為數值資料的技術。例如,一個名為“顏色”的分類特徵,其類別為“紅色”、“綠色”和“藍色”,可以分別分配值 0、1 和 2。
標籤編碼易於實現且記憶體效率高,只需要一列來儲存編碼後的值。但是,它可能無法準確表示類別的固有順序或排名,並且某些機器學習演算法可能會將編碼後的值解釋為連續變數,從而導致錯誤的結果。
為了在 Python 中實現標籤編碼,我們可以使用 scikit-learn 庫中的 LabelEncoder 類。以下是一個示例
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() data['color_encoded'] = le.fit_transform(data['color'])
在這段程式碼中,我們首先建立 LabelEncoder 類的例項。然後,我們將編碼器擬合到資料集的“顏色”列,並將該列轉換為其編碼後的值。
獨熱編碼
獨熱編碼是一種將類別轉換為數字的方法。我們為每個類別建立一個新特徵,如果某一行具有該類別,則其特徵獲取 1,而其他特徵獲取 0。此技術非常適合表示名義分類特徵,並允許輕鬆比較類別。但是,如果類別很多,它可能需要大量記憶體並且速度很慢。
為了在 Python 中實現獨熱編碼,我們可以使用 pandas 庫中的 get_dummies() 函式。以下是一個示例
To implement one-hot encoding in Python, we can use the get_dummies() function from the pandas library. Here is an example:
在這段程式碼中,我們首先從 CSV 檔案讀取資料集。然後,我們使用 get_dummies() 函式為“顏色”列中每個類別的建立新的二進位制特徵。
二進位制編碼
二進位制編碼是一種將分類特徵轉換為二進位制表示的技術。例如,我們可以為名為“顏色”的特徵的類別分配值 0、1 和 2,然後將其轉換為二進位制表示:0 變成 00,1 變成 01,2 變成 10。此技術結合了標籤編碼和獨熱編碼的優點。
二進位制編碼可以減少記憶體使用並捕獲有關類別的某些序數資訊。但是,它可能無法準確表示名義分類特徵,並且在類別很多時可能會變得複雜。
為了在 Python 中實現二進位制編碼,我們可以使用 category_encoders 庫。以下是一個示例
import category_encoders as ce encoder = ce.BinaryEncoder(cols=['color']) encoded_data = encoder.fit_transform(data)
在這段程式碼中,我們首先匯入 category_encoders 庫。然後,我們建立 BinaryEncoder 類的例項,並將“顏色”列指定為要編碼的列。我們將編碼器擬合到資料集,並將該列轉換為其二進位制編碼後的值。
計數編碼
計數編碼是一種用類別在資料集中出現的次數替換每個類別的技術。例如,如果名為“顏色”的分類特徵具有三個類別,“紅色”出現 10 次,“綠色”出現 5 次,“藍色”出現 3 次,我們可以將“紅色”替換為 10,“綠色”替換為 5,“藍色”替換為 3。
計數編碼對於高基數分類特徵很有用,因為它減少了透過獨熱編碼建立的列數。它還可以捕獲類別的頻率,但對於序數分類特徵可能並不理想,在序數分類特徵中,頻率不一定表示類別的順序或排名。
為了在 Python 中實現計數編碼,我們可以使用 category_encoders 庫。以下是一個示例
import category_encoders as ce encoder = ce.CountEncoder(cols=['color']) encoded_data = encoder.fit_transform(data)
在這段程式碼中,我們首先匯入 category_encoders 庫。然後,我們建立 CountEncoder 類的例項,並將“顏色”列指定為要編碼的列。我們將編碼器擬合到資料集,並將該列轉換為其計數編碼後的值。
目標編碼
目標編碼是一種用該類別的平均目標值替換每個類別的方法。例如,如果我們有一個名為“顏色”的分類特徵和一個二進位制目標變數,我們可以將“紅色”替換為 0.3 的平均目標值,“綠色”替換為 0.6,“藍色”替換為 0.4。目標編碼適用於高基數分類特徵,並且可以捕獲類別與目標變數之間的關係。但是,如果類別很少見或目標變數不平衡,它可能會過擬合。
為了在 Python 中實現目標編碼,我們可以使用 category_encoders 庫。以下是一個示例
import category_encoders as ce encoder = ce.TargetEncoder(cols=['color']) encoded_data = encoder.fit_transform(data, target)
在這段程式碼中,我們首先匯入 category_encoders 庫。然後,我們建立 TargetEncoder 類的例項,並將“顏色”列指定為要編碼的列。我們將編碼器擬合到資料集,並將該列轉換為其目標編碼後的值,使用目標變數作為目標。
結論
總而言之,在本文中,我們介紹了在 Python 中將分類特徵轉換為數值特徵的不同方法,例如獨熱編碼、標籤編碼、二進位制編碼、計數編碼和目標編碼。方法的選擇取決於分類特徵的型別和使用的機器學習演算法。將分類特徵轉換為數值特徵有助於機器學習演算法更準確地處理和分析分類資料,從而可以獲得更好的模型。