在進行資料分析時,有時需要將類別欄位轉換為數值欄位,以便進行數值計算和機器學習模型訓練等操作。由於模型是基於數學模型設計的方法,必須要輸入資料將類別欄位轉換為數值欄位模型才能讀得懂。例如,某個欄位的取值為「男」和「女」,可以將其轉換為數值欄位,例如「0」表示男性,「1」表示女性。這樣可以讓機器學習模型更容易理解和處理資料。
# 可使用目錄功能快速確認要閱覽的主題
有順序
的類別數據且類別數量較少
的數據無順序
且類別數量較少
的數據無順序
且類別數量較多
的數據回歸
問題,類別變量與目標變量有較強的相關性
數量較多
且類別出現的頻率與目標變量相關性較弱
的數據Label Encoding 是一種將類別變量轉換為數值變量的技術。具體來說,標籤編碼將每個類別值映射到一個唯一的整數。例如,如果有三個類別值 "red"、"green" 和 "blue",標籤編碼可能會將它們分別映射為 0、1 和 2。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
data = {'size': ['small', 'medium', 'large', 'medium', 'small']}
df = pd.DataFrame(data)
# 初始化標籤編碼器
le = LabelEncoder()
# 將 'size' 欄位進行標籤編碼
df['size_encoded'] = le.fit_transform(df['size'])
print(df)
"""
size size_encoded
0 small 2
1 medium 1
2 large 0
3 medium 1
4 small 2
"""
※ Label Encoding 並沒有內建的機制來識別或維持類別的順序。標籤編碼器會按照字母順序(alphabetical order)或數字順序來分配標籤。因此,在處理有序類別數據時,需要確保在編碼之前已經按照正確的順序來指定標籤。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 創建一個範例數據集
data = {'size': ['small', 'medium', 'large', 'medium', 'small']}
df = pd.DataFrame(data)
# 指定有序類別的順序
size_mapping = {'small': 0, 'medium': 1, 'large': 2}
# 使用映射進行編碼
df['size_encoded'] = df['size'].map(size_mapping)
print(df)
"""
size size_encoded
0 small 0
1 medium 1
2 large 2
3 medium 1
4 small 0
"""
優點
缺點
One-Hot Encoding 是將分類數據轉換為二進位變量的過程。對於每個類別變量,會創建一個新的二進位變量。每個變量都表示是否存在某個特定的類別。這意味著,對於每一個觀測值,僅有一個二進位變量為1,其餘為0。
import pandas as pd
# 創建一個範例數據集
data = {'color': ['red', 'blue', 'green', 'blue', 'red']}
df = pd.DataFrame(data)
# 使用pd.get_dummies() 進行One-Hot Encoding
df_one_hot = pd.get_dummies(df, columns=['color'])
print(df_one_hot)
"""
color_blue color_green color_red
0 0 0 1
1 1 0 0
2 0 1 0
3 1 0 0
4 0 0 1
"""
import pandas as pd
# 創建範例數據集
data = {
'color': ['red', 'blue', 'green', 'blue', 'red'],
'city': ['New York', 'Paris', 'London', 'Berlin', 'Paris']
}
df = pd.DataFrame(data)
# 使用pd.get_dummies進行One-Hot Encoding
df_encoded = pd.get_dummies(df, columns=['color', 'city'])
print(df_encoded)
"""
color_blue color_green color_red city_Berlin city_London city_New York city_Paris
0 0 0 1 0 0 1 0
1 1 0 0 0 0 0 1
2 0 1 0 0 1 0 0
3 1 0 0 1 0 0 0
4 0 0 1 0 0 0 1
"""
優點:
缺點:
Binary Encoding 是將類別數據轉換為二進位數據的一種方法。它先將類別轉換為數值,然後再將這些數值轉換為二進位碼。每個類別用二進位碼表示,並將每個二進位碼的位數拆分成不同的列。
import pandas as pd
import category_encoders as ce
# 創建範例數據集
data = {
'product_id': ['A123', 'B234', 'C345', 'A123', 'B234'],
'customer_id': ['C1', 'C2', 'C3', 'C4', 'C5']
}
df = pd.DataFrame(data)
# 使用 Binary Encoder 進行二進位編碼
encoder = ce.BinaryEncoder(cols=['product_id', 'customer_id'])
df_encoded = encoder.fit_transform(df)
print(df_encoded)
"""
product_id_0 product_id_1 product_id_2 customer_id_0 customer_id_1 customer_id_2
0 1 0 0 1 0 0
1 0 1 0 0 1 0
2 1 1 0 1 1 0
3 1 0 0 0 0 1
4 0 1 0 0 1 1
"""
優點:
缺點:
Target Encoding 是一種將類別變量轉換為數值變量的方法。其基本思想是用目標變量的平均值(或其他統計量)來替換類別變量的值。這通常是通過計算每個類別的目標變量的平均值來完成的。
import pandas as pd
import category_encoders as ce
# 創建一個範例數據集
data = pd.DataFrame({
'city': ['New York', 'Los Angeles', 'New York', 'Chicago', 'Los Angeles', 'Chicago', 'New York', 'Chicago'],
'house_type': ['Apartment', 'House', 'House', 'Apartment', 'House', 'House', 'Apartment', 'Apartment'],
'price': [500000, 450000, 600000, 350000, 400000, 300000, 700000, 250000]
})
# 使用 Target Encoder 進行目標編碼
encoder = ce.TargetEncoder(cols=['city', 'house_type'])
data_encoded = encoder.fit_transform(data[['city', 'house_type']], data['price'])
# 合併編碼後的數據
data_encoded['price'] = data['price']
print(data_encoded)
"""
city house_type price
0 467885.197669 444799.885093 500000
1 441090.292533 442700.114907 450000
2 467885.197669 442700.114907 600000
3 421545.618144 444799.885093 350000
4 441090.292533 442700.114907 400000
5 421545.618144 442700.114907 300000
6 467885.197669 444799.885093 700000
7 421545.618144 444799.885093 250000
"""
city
和 house_type
這兩個類別型欄位被轉換成了數值型欄位,這些數值是根據 price
的平均值計算出來的。優點:
缺點:
Frequency Encoding 是一種將類別型資料轉換為數值型資料的編碼方法。這種方法基於每個類別出現的頻率,即每個類別在資料集中出現的次數。具體來說,頻率編碼會將每個類別替換為該類別在資料集中出現的次數。
import pandas as pd
# 創建一個範例數據集
data = pd.DataFrame({
'user_id': ['user_1', 'user_2', 'user_3', 'user_1', 'user_4', 'user_2', 'user_3', 'user_1'],
'visit_count': [10, 15, 10, 20, 5, 25, 10, 30]
})
# 計算每個用戶ID出現的頻率
frequency_encoding = data['user_id'].value_counts(normalize=True)
# 將頻率映射回原數據集
data['user_id_freq'] = data['user_id'].map(frequency_encoding)
print(data)
"""
user_id visit_count user_id_freq
0 user_1 10 0.375
1 user_2 15 0.250
2 user_3 10 0.250
3 user_1 20 0.375
4 user_4 5 0.125
5 user_2 25 0.250
6 user_3 10 0.250
7 user_1 30 0.375
"""
優點:
缺點: