
- 機器學習基礎
- ML - 首頁
- ML - 簡介
- ML - 入門
- ML - 基本概念
- ML - 生態系統
- ML - Python 庫
- ML - 應用
- ML - 生命週期
- ML - 技能要求
- ML - 實現
- ML - 挑戰與常見問題
- ML - 限制
- ML - 真實案例
- ML - 資料結構
- ML - 數學基礎
- ML - 人工智慧
- ML - 神經網路
- ML - 深度學習
- ML - 獲取資料集
- ML - 類別型資料
- ML - 資料載入
- ML - 資料理解
- ML - 資料準備
- ML - 模型
- ML - 監督學習
- ML - 無監督學習
- ML - 半監督學習
- ML - 強化學習
- ML - 監督學習 vs. 無監督學習
- 機器學習資料視覺化
- ML - 資料視覺化
- ML - 直方圖
- ML - 密度圖
- ML - 箱線圖
- ML - 相關矩陣圖
- ML - 散點矩陣圖
- 機器學習統計學
- ML - 統計學
- ML - 平均數、中位數、眾數
- ML - 標準差
- ML - 百分位數
- ML - 資料分佈
- ML - 偏度和峰度
- ML - 偏差和方差
- ML - 假設
- 機器學習中的迴歸分析
- ML - 迴歸分析
- ML - 線性迴歸
- ML - 簡單線性迴歸
- ML - 多元線性迴歸
- ML - 多項式迴歸
- 機器學習中的分類演算法
- ML - 分類演算法
- ML - 邏輯迴歸
- ML - K近鄰演算法 (KNN)
- ML - 樸素貝葉斯演算法
- ML - 決策樹演算法
- ML - 支援向量機
- ML - 隨機森林
- ML - 混淆矩陣
- ML - 隨機梯度下降
- 機器學習中的聚類演算法
- ML - 聚類演算法
- ML - 基於中心點的聚類
- ML - K均值聚類
- ML - K中心點聚類
- ML - 均值漂移聚類
- ML - 層次聚類
- ML - 基於密度的聚類
- ML - DBSCAN聚類
- ML - OPTICS聚類
- ML - HDBSCAN聚類
- ML - BIRCH聚類
- ML - 親和傳播
- ML - 基於分佈的聚類
- ML - 凝聚層次聚類
- 機器學習中的降維
- ML - 降維
- ML - 特徵選擇
- ML - 特徵提取
- ML - 後向消除法
- ML - 前向特徵構造
- ML - 高相關性過濾
- ML - 低方差過濾
- ML - 缺失值比率
- ML - 主成分分析
- 強化學習
- ML - 強化學習演算法
- ML - 利用與探索
- ML - Q學習
- ML - REINFORCE演算法
- ML - SARSA強化學習
- ML - 演員-評論家方法
- 深度強化學習
- ML - 深度強化學習
- 量子機器學習
- ML - 量子機器學習
- ML - 使用Python的量子機器學習
- 機器學習雜項
- ML - 效能指標
- ML - 自動工作流
- ML - 提升模型效能
- ML - 梯度提升
- ML - 自舉匯聚 (Bagging)
- ML - 交叉驗證
- ML - AUC-ROC曲線
- ML - 網格搜尋
- ML - 資料縮放
- ML - 訓練和測試
- ML - 關聯規則
- ML - Apriori演算法
- ML - 高斯判別分析
- ML - 成本函式
- ML - 貝葉斯定理
- ML - 精度和召回率
- ML - 對抗性
- ML - 堆疊
- ML - 輪次
- ML - 感知器
- ML - 正則化
- ML - 過擬合
- ML - P值
- ML - 資訊熵
- ML - MLOps
- ML - 資料洩露
- ML - 機器學習的盈利化
- ML - 資料型別
- 機器學習 - 資源
- ML - 快速指南
- ML - 速查表
- ML - 面試問題
- ML - 有用資源
- ML - 討論
機器學習中的類別型資料
什麼是類別型資料?
機器學習中的類別型資料指的是由類別或標籤組成的資料,而不是數值資料。這些類別可能是名義上的,這意味著它們之間沒有固有的順序或等級(例如,顏色、性別),也可能是順序的,這意味著類別之間存在自然順序(例如,教育水平、收入等級)。
類別型資料通常使用離散值表示,例如整數或字串,並且在用作機器學習模型的輸入之前,通常會編碼為獨熱向量。獨熱編碼涉及為每個類別建立一個二進位制向量,其中向量在對應於該類別的位置上為1,在所有其他位置上為0。
處理類別型資料的技巧
處理類別型資料是機器學習預處理的重要組成部分,因為許多演算法都需要數值輸入。根據演算法和類別型資料的性質,可以使用不同的編碼技術,例如標籤編碼、序數編碼或二進位制編碼等。
在本章的後續部分,我們將討論以下處理機器學習中類別型資料的不同技術,以及它們在Python中的實現。
讓我們瞭解上面提到的每種處理機器學習中類別型資料的技術。
1. 獨熱編碼
獨熱編碼是處理機器學習中類別型資料的一種常用技術。它涉及為每個類別建立一個二進位制向量,其中向量的每個元素表示該類別的存在或不存在。例如,如果我們有一個表示顏色的類別變數,其值為紅色、藍色和綠色,則獨熱編碼將分別建立三個二進位制向量:[1, 0, 0]、[0, 1, 0] 和 [0, 0, 1]。
示例
下面是使用Pandas庫在Python中執行獨熱編碼的示例:
import pandas as pd # Creating a sample dataset with a categorical variable data = {'color': ['red', 'green', 'blue', 'red', 'green']} df = pd.DataFrame(data) # Performing one-hot encoding one_hot_encoded = pd.get_dummies(df['color'], prefix='color') # Combining the encoded data with the original data df = pd.concat([df, one_hot_encoded], axis=1) # Drop the original categorical variable df = df.drop('color', axis=1) # Print the encoded data print(df)
輸出
這將建立一個具有三個二進位制變數(“color_blue”、“color_green”和“color_red”)的獨熱編碼資料框,如果存在相應的顏色,則這些變數取值為1,否則取值為0。此編碼資料(下面給出的輸出)可用於機器學習任務,例如分類和迴歸。
color_blue color_green color_red 0 0 0 1 1 0 1 0 2 1 0 0 3 0 0 1 4 0 1 0
獨熱編碼技術適用於小型且有限的類別變數,但對於大型類別變數可能會存在問題,因為它會導致大量的輸入特徵。
2. 標籤編碼
標籤編碼是處理機器學習中類別型資料的另一種技術。它涉及為類別變數中的每個類別分配一個唯一的數值,數值的順序基於類別的順序。
例如,假設我們有一個名為“Size”的類別變數,它有三個類別:“small”、“medium”和“large”。使用標籤編碼,我們將分別為這些類別分配值0、1和2。
示例
下面是使用scikit-learn庫在Python中執行標籤編碼的示例:
from sklearn.preprocessing import LabelEncoder # create a sample dataset with a categorical variable data = ['small', 'medium', 'large', 'small', 'large'] # create a label encoder object label_encoder = LabelEncoder() # fit and transform the data using the label encoder encoded_data = label_encoder.fit_transform(data) # print the encoded data print(encoded_data)
這將建立一個編碼陣列,其值為[0, 1, 2, 0, 2],分別對應於編碼類別“small”、“medium”和“large”。請注意,預設情況下,編碼基於類別的字母順序,但可以透過傳遞自定義列表到LabelEncoder物件來更改順序。
輸出
[2 1 0 2 0]
當類別之間存在自然順序時,例如序數類別變數,標籤編碼很有用。但是,對於名義類別變數,應謹慎使用它,因為數值可能會暗示實際上不存在的順序。在這些情況下,獨熱編碼是更安全的選擇。
3. 頻率編碼
頻率編碼是處理機器學習中類別型資料的另一種技術。它涉及用類別在資料集中出現的頻率(或計數)替換類別變數中的每個類別。頻率編碼背後的思想是,更頻繁出現的類別可能對機器學習演算法更重要或更有資訊量。
示例
下面是使用Python執行頻率編碼的示例:
import pandas as pd # create a sample dataset with a categorical variable data = {'color': ['red', 'green', 'blue', 'red', 'green']} df = pd.DataFrame(data) # calculate the frequency of each category in the categorical variable freq = df['color'].value_counts(normalize=True) # replace each category with its frequency df['color_freq'] = df['color'].map(freq) # drop the original categorical variable df = df.drop('color', axis=1) # print the encoded data print(df)
這將建立一個編碼資料框,其中包含一個變數(“color_freq”),表示原始類別變數中每個類別的頻率。例如,如果原始變數有兩個“red”和三個“green”,則相應的頻率將分別為0.4和0.6。
輸出
color_freq 0 0.4 1 0.4 2 0.2 3 0.4 4 0.4
頻率編碼可能是獨熱編碼或標籤編碼的有用替代方案,尤其是在處理高基數類別變數(即具有大量類別的變數)時。但是,它可能並不總是有效,其效能可能取決於所使用的資料集和機器學習演算法。
4. 目標編碼
目標編碼是處理機器學習中類別型資料的另一種技術。它涉及用該類別的目標變數(即您想要預測的變數)的平均值(或其他聚合)替換類別變數中的每個類別。目標編碼背後的思想是,它可以捕獲類別變數和目標變數之間的關係,從而提高機器學習模型的預測效能。
示例
下面是使用Scikit-learn庫在Python中執行目標編碼的示例,透過結合標籤編碼器和平均編碼器:
import pandas as pd from sklearn.preprocessing import LabelEncoder # create a sample dataset with a categorical variable and a target variable data = {'color': ['red', 'green', 'blue', 'red', 'green'], 'target': [1, 0, 1, 0, 1]} df = pd.DataFrame(data) # create a label encoder object and fit it to the data label_encoder = LabelEncoder() label_encoder.fit(df['color']) # transform the categorical variable using the label encoder df['color_encoded'] = label_encoder.transform(df['color']) # create a mean encoder object and fit it to the transformed data mean_encoder = df.groupby('color_encoded')['target'].mean().to_dict() # map the mean encoded values to the categorical variable df['color_encoded'] = df['color_encoded'].map(mean_encoder) # print the encoded data print(df)
在此示例中,我們首先建立一個Pandas DataFrame df,其中包含一個類別變數'color'和一個目標變數'target'。然後,我們從scikit-learn建立一個LabelEncoder物件,並將其擬合到df的'color'列。
接下來,我們使用標籤編碼器轉換類別變數'color',透過在標籤編碼器物件上呼叫transform方法,並將生成的編碼值分配給df中的新列'color_encoded'。
最後,我們透過對'color_encoded'列進行分組並計算每個組的'target'列的平均值來建立一個平均編碼器物件。然後,我們將此平均編碼器物件轉換為字典,並將平均編碼值對映到df的原始'color'列。
輸出
color target color_encoded 0 red 1 0.5 1 green 0 0.5 2 blue 1 1.0 3 red 0 0.5 4 green 1 0.5
目標編碼可能是提高機器學習模型預測效能的強大技術,尤其是在具有高基數類別變數的資料集中。但是,重要的是要避免過度擬合,方法是使用交叉驗證和正則化技術。
5. 二進位制編碼
二進位制編碼是另一種用於在機器學習中對類別變數進行編碼的技術。在二進位制編碼中,每個類別都分配一個二進位制程式碼,其中每個數字表示該類別是否存在(1)或不存在(0)。二進位制程式碼通常基於類別在所有類別排序列表中的位置。
示例
以下是使用category_encoders庫在Python中實現二進位制編碼的示例:
import pandas as pd import category_encoders as ce # create a sample dataset with a categorical variable data = {'color': ['red', 'green', 'blue', 'red', 'green']} df = pd.DataFrame(data) # create a binary encoder object and fit it to the data binary_encoder = ce.BinaryEncoder(cols=['color']) binary_encoder.fit(df['color']) # transform the categorical variable using the binary encoder encoded_data = binary_encoder.transform(df['color']) # merge the encoded variable with the original dataframe df = pd.concat([df, encoded_data], axis=1) # print the encoded data print(df)
在此示例中,我們首先建立一個Pandas DataFrame df,其中包含一個類別變數'color'。然後,我們從category_encoders庫建立一個BinaryEncoder物件,並將其擬合到df的'color'列。
接下來,我們使用二進位制編碼器轉換類別變數'color',透過在二進位制編碼器物件上呼叫transform方法,並將生成的編碼值分配給新的DataFrame encoded_data。
最後,我們使用concat方法沿列軸(axis=1)將編碼變數與原始DataFrame df合併。結果DataFrame應包含原始'color'列以及編碼的二進位制列。
輸出
執行程式碼後,將產生以下輸出:
color color_0 color_1 0 red 0 1 1 green 1 0 2 blue 1 1 3 red 0 1 4 green 1 0
二進位制編碼最適合具有中等數量類別的分類變數,因為對於具有大量類別的變數,它可能會很快變得效率低下。