【深度學習】獨熱編碼(One-Hot Encoding)

獨熱編碼(One-Hot Encoding)

在機器學習中,數據預處理是不可或缺的關鍵一步。面對各種非數值類型的分類數據(Categorical Data),如何將其轉換為機器學習模型能夠“理解”的語言呢?獨熱編碼(One-Hot Encoding)便是解決這一問題的方法之一。本文將從獨熱編碼的定義、原理出發,詳細介紹其優缺點,并通過Python中的pandasscikit-learn庫進行實戰演示,助你輕松掌握這一數據預處理技術。

文章目錄

  • 獨熱編碼(One-Hot Encoding)
    • 1 什么是獨熱編碼?
    • 2 為什么需要獨熱編碼?
    • 3 獨熱編碼與Softmax輸出:從預測概率到最終決策
      • 3.1 分類模型的推理
      • 3.2 分類模型推理中獨熱編碼的應用
      • 3.3 分類模型訓練中獨熱編碼的應用
    • 4 獨熱編碼的優缺點
      • 4.1 優點
      • 4.2 缺點
    • 5 Python實戰:玩轉獨熱編碼
      • 5.1 使用 `pandas.get_dummies()`
      • 5.2 使用 `scikit-learn.preprocessing.OneHotEncoder`
    • 6 何時選擇獨熱編碼?
    • 7 總結
  • 參考資料

1 什么是獨熱編碼?

獨熱編碼(One-Hot Encoding),又稱一位有效編碼,是一種將分類變量轉換為數值形式的常用方法。其核心思想是,將一個具有N個不同類別的分類特征轉換為N個二元(0或1)特征,其中每個新特征對應原始特征中的一個類別。對于每一個樣本,只有代表其原始類別的那個新特征值為1,其余所有新特征值均為0。

舉個例子:

假設我們有一個圖像分類的任務,其標簽有“貓”、“狗”、“兔”。

樣本ID類別
1
2
3

經過獨熱編碼后,這個“類別”特征會被轉換成三個新的二元特征:“類別貓類別_貓?”、“類別狗類別_狗?”和“類別兔類別_兔?”。

樣本ID類別貓類別_貓?類別狗類別_狗?類別兔類別_兔?
1100
2010
3001

正如其名“One-Hot”,在每一行數據中,只有一個新特征是“熱”的(值為1)。

2 為什么需要獨熱編碼?

在機器學習中,許多算法,特別是線性模型(如線性回歸、邏輯回歸)和距離度量相關的算法(如K近鄰),都是基于數值計算的。如果直接將“貓”、“狗”、“兔”用數字1、2、3來表示(這種方法稱為標簽編碼 Label Encoding),模型可能會錯誤地學習到這些類別之間存在有序關系,例如“兔”(3)是“貓”(1)的三倍,或者“狗”(2)大于“貓”(1)。這顯然是荒謬的,因為不同類別之間并不存在這樣的序數/倍數關系。

獨熱編碼通過將每個類別獨立表示為一個特征,完美地解決了這個問題。每個類別都處于一個正交的向量空間中,它們(例如 [1, 0, 0]、[0, 1, 0] 和 [0, 0, 1])之間的距離是相等的,從而消除了標簽編碼可能引入的虛假順序關系,讓模型能夠更準確地學習特征與目標之間的關系。

3 獨熱編碼與Softmax輸出:從預測概率到最終決策

3.1 分類模型的推理

假設我們的模型已經訓練好,用于對測試集中的貓、狗、兔圖片進行三分類的推理(Inference)。
模型最后一層通常會使用Softmax激活函數,它會輸出一個概率分布,表示該數據點屬于每個類別的概率。
假設某一輪推理得到的Softmax得分(scores)如下:

softmax_scores=[0.1,0.2,0.7]\text{softmax\_scores} = [0.1, 0.2, 0.7]softmax_scores=[0.1,0.2,0.7]

這個列表的四個值分別對應了模型預測該圖片為“貓”、“狗”、“兔”的概率。我們可以清晰地看到:

  • P(貓)=0.1(10%)P(\text{貓}) = 0.1 \quad (10\%)P()=0.1(10%)
  • P(狗)=0.2(20%)P(\text{狗}) = 0.2 \quad (20\%)P()=0.2(20%)
  • P(兔)=0.7(70%)P(\text{兔}) = 0.7 \quad (70\%)P()=0.7(70%)

為了得到一個確定的預測結果,我們通常會選擇概率最高的那個類別。這通過一個簡單的argmax操作即可完成,即找到最大值所在的索引。

argmax(softmax_scores)=2\text{argmax}(\text{softmax\_scores}) = 2argmax(softmax_scores)=2

這個索引 2 正好對應我們類別列表中的第三個類別“兔”。因此,模型的最終預測結果就是“兔”。

3.2 分類模型推理中獨熱編碼的應用

關鍵點來了:可以將3.1中所述的預測結果也表示為獨熱編碼的形式:[0, 0, 1]

在模型評估時,我們會將這個預測的獨熱編碼 [0, 0, 1] 與真實的標簽(Ground Truth)進行比較。如果這個地點的真實標簽就是‘廣州’(其獨熱編碼也是 [0, 0, 1]),那么這次預測就是正確的。

3.3 分類模型訓練中獨熱編碼的應用

在訓練過程中,像交叉熵損失函數(Cross-Entropy Loss)這樣的工具,也正是通過比較Softmax輸出的概率分布(如 [0.1, 0.2, 0.7])和真實的獨熱編碼標簽(如 [0, 0, 1])來計算損失,并指導模型進行優化的。

分類模型訓練中獨熱編碼的應用

關于對交叉熵損失函數(Cross-Entropy Loss) 的介紹,可以參見我的這一篇文章:【深度學習】深入理解交叉熵損失函數 (Cross-Entropy Loss Function) 。

所以,獨熱編碼也為多分類模型的輸出提供了一個清晰、明確的比較基準和目標格式。

4 獨熱編碼的優缺點

4.1 優點

  1. 消除序數關系:如上所述,獨熱編碼能夠有效處理沒有內在順序的分類數據,避免模型做出錯誤的假設。
  2. 提升模型性能:對于線性模型等對特征數值大小敏感的算法,使用獨熱編碼通常能帶來更準確的預測結果。
  3. 易于理解和實現:其概念直觀,并且在主流的Python數據科學庫中都有非常便捷的實現。

4.2 缺點

  1. 維度災難(Curse of Dimensionality):當一個分類特征的類別數量非常多(即高基數特征,High Cardinality),獨熱編碼會產生大量的稀疏特征(大部分值為0),導致數據集的維度急劇膨脹。這不僅會增加計算復雜度和內存消耗,還可能降低模型的性能,尤其是在樹模型中。
  2. 信息冗余:由于N個新特征中,只要知道了前N-1個的值,最后一個的值就可以推斷出來(例如,如果“類別貓類別_貓?”和“類別狗類別_狗?”都為0,那么“類別兔類別_兔?”必然為1)。這種現象被稱為“虛擬變量陷阱”(Dummy Variable Trap),可能導致多重共線性問題。在實踐中,通常會通過丟棄其中一列來解決。

5 Python實戰:玩轉獨熱編碼

接下來,我將通過兩個最常用的Python庫——pandasscikit-learn來演示如何實現獨熱編碼。

5.1 使用 pandas.get_dummies()

pandas庫提供了get_dummies()函數,這是實現獨熱編碼最簡單快捷的方式之一。

import pandas as pd# 創建一個示例DataFrame
data = {'city': ['北京', '上海', '廣州', '深圳', '北京'],'temperature': [25, 30, 28, 32, 26]}
df = pd.DataFrame(data)print("原始數據:")
print(df)# 對 'city' 列進行獨熱編碼
df_dummies = pd.get_dummies(df, columns=['city'])print("\n使用 get_dummies 進行獨熱編碼后的數據:")
print(df_dummies)# 為了避免多重共線性,可以設置 drop_first=True
df_dummies_dropped = pd.get_dummies(df, columns=['city'], drop_first=True)
print("\n使用 get_dummies (drop_first=True) 后的數據:")
print(df_dummies_dropped)

代碼解析:

  • pd.get_dummies(df, columns=['city']) 會自動識別city列中的所有唯一類別,并為每個類別創建一個新的二元列。
  • 設置drop_first=True參數會自動丟棄第一個類別(按字母順序,這里是“廣州”)對應的列,從而解決了虛擬變量陷阱的問題。

5.2 使用 scikit-learn.preprocessing.OneHotEncoder

scikit-learn是專業的機器學習庫,其OneHotEncoder提供了更強大和靈活的功能,尤其是在構建機器學習流水線(Pipeline)時。與pandas不同,scikit-learn的編碼器通常需要先對分類數據進行整數編碼。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder# 創建一個示例DataFrame
data = {'city': ['北京', '上海', '廣州', '深圳', '北京'],'temperature': [25, 30, 28, 32, 26]}
df = pd.DataFrame(data)# 步驟1: 使用 LabelEncoder 將分類文本轉換為整數
label_encoder = LabelEncoder()
df['city_encoded'] = label_encoder.fit_transform(df['city'])print("LabelEncoder 轉換后的數據:")
print(df)# 步驟2: 使用 OneHotEncoder 進行獨熱編碼
# 需要將數據轉換為二維數組
onehot_encoder = OneHotEncoder(sparse_output=False) # sparse_output=False 返回numpy數組
encoded_data = onehot_encoder.fit_transform(df[['city_encoded']])# 將編碼后的數據轉換回 DataFrame,并添加有意義的列名
encoded_df = pd.DataFrame(encoded_data, columns=onehot_encoder.get_feature_names_out(['city']))# 合并回原始DataFrame (并刪除臨時列)
df_final = df.join(encoded_df).drop(columns=['city_encoded'])print("\n使用 scikit-learn OneHotEncoder 后的數據:")
print(df_final)

代碼解析與對比:

  • LabelEncoder:首先將’北京’、'上海’等字符串映射為0、1、2等整數。
  • OneHotEncoder:接著將這些整數轉換為獨熱編碼。fit_transform方法需要一個二維數組作為輸入,因此我們使用df[['city_encoded']]
  • sparse_output=False:默認情況下,OneHotEncoder返回一個稀疏矩陣以節省內存。在這里我們設置為False以便于觀察,它將返回一個標準的NumPy數組。
  • get_feature_names_out():這個方法可以幫助我們獲取編碼后新特征的名稱。
  • 為何使用scikit-learn 雖然pandas的方法更直接,但在機器學習工作流中,scikit-learn的編碼器更具優勢。例如,你可以在訓練集上fit一個編碼器,然后用這個相同的編碼器transform測試集,這可以保證訓練集和測試集上特征的一致性,避免因類別不匹配而導致的錯誤。它還可以無縫集成到sklearn.pipeline.Pipeline中,實現數據預處理和模型訓練的自動化。

6 何時選擇獨熱編碼?

  • 當分類特征的類別數量較少時(通常建議在15個以下),獨熱編碼是一個非常好的選擇。
  • 當特征是名義類別(Nominal Category),即類別之間沒有順序關系時(如顏色、城市、性別),應該使用獨熱編碼。
  • 對于樹模型(如決策樹、隨機森林、梯度提升樹),雖然它們對特征的數值大小不敏感,但高維度的稀疏數據可能會影響其分裂點的選擇效率。因此,當類別數非常多時,可以考慮其他編碼方式(如目標編碼、頻率編碼等)。

7 總結

獨熱編碼是數據預處理武器庫中一件強大而基礎的工具。它通過將分類數據轉換為模型友好的數值格式,解決了序數假設問題,為許多機器學習算法的成功應用鋪平了道路。通過掌握pandasget_dummiesscikit-learnOneHotEncoder,你將能夠根據不同的場景和需求,靈活高效地處理數據,為構建高性能的機器學習模型打下堅實的基礎。在實際應用中,請務必注意其可能帶來的維度災難問題,并結合業務理解選擇最合適的編碼策略。


參考資料

  1. 深入淺出 one-hot

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91187.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Promise完全體總結

我們在上篇文章提到了異步會導致無法通過返回值來獲取函數的執行結果,我們通過傳入一個回調函數的方式,以參數的形式獲取到了我們想要獲取的數據,但是這樣如果需要對數據進行多次操作導致形成回調地獄那種不便于閱讀以及護理的代碼。為了解決…

SpringJDBC源碼初探-DataSource類

一、DataSource接口核心作用 DataSource是JDBC規范的核心接口,位于javax.sql包中,用于替代傳統的DriverManager獲取數據庫連接。Spring框架通過org.springframework.jdbc.datasource包對該接口進行了增強,提供連接池管理、事務綁定等高級特性…

C語言(08)——關于指針(逐漸清晰版)

為了更好地理解本篇文章的知識內容,讀者可以將以下文章作為補充知識進行閱讀 : C語言————原碼 補碼 反碼 (超絕詳細解釋)-CSDN博客 C語言————二、八、十、十六進制的相互轉換-CSDN博客 C語言————斐波那契數列的理解…

LeetCode 1616.分割兩個字符串得到回文串

給你兩個字符串 a 和 b ,它們長度相同。請你選擇一個下標,將兩個字符串都在 相同的下標 分割開。由 a 可以得到兩個字符串: aprefix 和 asuffix ,滿足 a aprefix asuffix ,同理,由 b 可以得到兩個字符串 …

算法【1】

網址:主站 工具補充 1. sort 函數的使用規則 作用:對容器元素進行排序,默認升序。語法:sort(起始迭代器, 結束迭代器, 比較規則) 前兩個參數是排序范圍:[begin, end)(包含begin,不包含end&am…

信創國產Linux操作系統匯總:從桌面到服務器,百花齊放

在數字化浪潮席卷全球的今天,操作系統作為信息產業的基石,其戰略地位日益凸顯。曾經由國外巨頭壟斷的格局正悄然改變——中國本土Linux操作系統歷經多年沉淀,已形成了百花齊放的局面。無論是日常辦公、專業開發,還是關鍵行業應用&…

claudia for claude code

一.安裝所有必需的依賴項 1.安裝 Git for Windows 步驟: 訪問 Git 的官方網站 git-scm.com。 下載適用于 Windows 的最新版本安裝程序。 運行安裝程序。在安裝向導的各個步驟中,建議保留所有默認設置,這些設置對于本指南的后續操作已經足夠。 驗證…

企業內外網文件安全傳輸解決方案

企業內外網文件安全傳輸解決方案 基于零信任架構的智能中轉系統設計 一、業務背景與挑戰分析 1.1 企業網絡安全現狀 在數字化轉型浪潮下,企業面臨著前所未有的安全挑戰。傳統的"城墻式"網絡防護已無法滿足現代企業靈活協作的需求。根據《2024年中國企業…

《HCIA-Datacom 認證》希賽三色筆記:詳解 VLAN 間通信的 3 種實現方式

標記說明:■掌握內容 ■次重點 ■理解內容 在局域網部署中,VLAN 技術通過隔離廣播域提升了網絡安全性和穩定性,但不同 VLAN 間的通信需求又成了新的難題。比如財務部門的電腦(VLAN 10)需要訪問服務…

Windows 10 系統下的編程字體安裝與配置(VSCode)教程

Windows 10 系統下的編程字體安裝與配置教程 常見的優秀編程字體 開發者社區中有許多備受推崇的編程字體,它們都致力于提升代碼的可讀性和舒適度。以下是一些常見的選擇: Fira Code: 以其豐富的編程連字(ligatures)而聞名&…

ITIL 4 高速IT:解耦架構——構建快速迭代的技術基座

一、為什么要解耦:從“架構”談到“速度”1.高速IT的真正瓶頸:不是能力,而是架構在我們深入學習ITIL 4 高速IT的時候,大家可能都會有個疑問:為什么有些組織在數字化轉型過程中推得動,有些卻始終難以突破&am…

網絡協議——MPLS(多協議標簽轉發)

一,基本概述1. mpls基本概念MPLS位于二三層之間,可以向所有網絡層提供服務。通過在數據鏈路層和網絡層之間增加額外的MPLS頭部,基于MPLS頭部實現數據快速轉發。2. 控制平面和轉發平面控制平面:負責產生和維護路由信息以及標簽信息…

影刀RPA_初級課程_玩轉影刀自動化_EXCEL操作自動化

聲明:相關內容來自影刀學院,本文章為自用筆記,切勿商用!(若有侵權,請聯絡刪除) 1. 數據的表達 1.1 列表 1.1 獲取一段字符(字符串列表的截取 —— 前開后閉) 1.2 獲取長…

當貝純凈版_海信ip811n海思mv320處理器安卓4.42及9.0主板優盤免拆刷機固件及教程

海信IP811N安卓4.4.2及安卓9.0主板免拆升級教程 下載固件之前,請拆機確認下主板處理器是否為 海思hi3798mv320處理器,拆機將主板上 位于中心位置的CPU芯片上的黑色貼紙取下 然后查看芯片第二行是否有V32字樣,如下圖 然后進入機頂盒設置&a…

三、平衡橋電路

一、電路結構 由于平衡橋后要連接雙T型橋逆變電路并聯,這里采用平衡橋電路來穩定母線和中線的電壓平衡,使正母線電壓BUS和負母線電壓BUS-相對于中線的電壓大小相等,極性相反,如50VBUS,-50BUS-。 平衡橋電路由兩個電容…

Java-85 深入淺出 MySQL InnoDB 存儲結構:Buffer Pool、寫緩沖與日志機制全解

點一下關注吧!!!非常感謝!!持續更新!!! 🚀 AI篇持續更新中!(長期更新) AI煉丹日志-30-新發布【1T 萬億】參數量大模型!Kim…

Linux救援模式之應用篇

掛載并訪問文件系統1. 首先識別分區 fdisk -l # 查看所有磁盤和分區 lsblk # 以樹狀結構查看塊設備 blkid # 查看分區的UUID和文件系統類型2. 創建掛載點并掛載分區 mkdir /mnt/rescue # 創建掛載點# 掛載根分區(根據你實際的根分區設備) mount /dev/…

【學習路線】游戲開發大師之路:從編程基礎到獨立游戲制作

前言 游戲開發是一個充滿創意和技術挑戰的領域,它融合了編程、美術、音效、設計等多個學科。隨著游戲產業的蓬勃發展,游戲開發已成為最具吸引力的技術職業之一。本文將為您提供一條從零基礎到游戲開發大師的完整學習路線,涵蓋編程基礎、游戲引…

宇樹 G1 部署(九)——遙操作控制腳本 teleop_hand_and_arm.py 分析與測試部署

首先,我使用的是 v1.0 版本,宇樹最近發力了更新的很快:xr_teleoperate-1.0 teleop_hand_and_arm.py 支持通過 XR 設備(比如手勢或手柄)來控制實際機器人動作,也支持在虛擬仿真中運行。可以根據需要&#x…

第十一天:不定方程求解

每日一道C題:不定方程求解 問題:給定正整數a,b,c。求不定方程 axbyc 關于未知數x和y的所有非負整數解組數。 要求:輸入一行,包含三個正整數a,b,c,兩個整數之間用單個空格…