機器學習的一百個概念(7)獨熱編碼

前言

本文隸屬于專欄《機器學習的一百個概念》,該專欄為筆者原創,引用請注明來源,不足和錯誤之處請在評論區幫忙指出,謝謝!

本專欄目錄結構和參考文獻請見[《機器學習的一百個概念》


ima 知識庫

知識庫廣場搜索:

知識庫創建人
機器學習@Shockang
機器學習數學基礎@Shockang
深度學習@Shockang

正文

在這里插入圖片描述

引言 🌟

在機器學習的數據預處理階段,我們經常會遇到分類變量(categorical variables)的處理問題。這些變量可能是性別、職業、教育程度等非數值型數據。由于大多數機器學習算法只能處理數值型數據,如何有效地將這些分類變量轉換為數值型特征就成為了一個關鍵問題。獨熱編碼(One-Hot Encoding)作為最常用的解決方案之一,在這個過程中扮演著重要角色。

核心原理 🔍

基本概念

獨熱編碼的核心思想是將每個類別值轉換為一個包含0和1的向量,向量的長度等于類別的總數。在這個向量中,只有一個位置的值為1(表示當前類別),其余位置都為0。

編碼流程

在這里插入圖片描述

數學表示

對于具有 k k k 個不同類別的特征,獨熱編碼會創建一個 k k k 維向量空間,每個類別映射到這個空間中的一個標準基向量。形式化表示如下:

設類別集合 C = { c 1 , c 2 , . . . , c k } C = \{c_1, c_2, ..., c_k\} C={c1?,c2?,...,ck?}
對于類別 c i c_i ci?, 其獨熱編碼為:
e i = [ 0 , 0 , . . . , 1 , . . . , 0 ] e_i = [0,0,...,1,...,0] ei?=[0,0,...,1,...,0]
其中第 i i i 個位置為1,其余位置為0

示例說明

考慮一個包含顏色特征的數據集:

原始數據: ['紅', '藍', '綠', '紅', '綠']獨熱編碼后:: [1, 0, 0]: [0, 1, 0]: [0, 0, 1]: [1, 0, 0]: [0, 0, 1]

深入理解獨熱編碼 🧠

幾何解釋

從幾何角度看,獨熱編碼將類別映射到多維空間中的正交向量。這種表示方法確保了:

  1. 所有類別之間的歐氏距離相等
  2. 沒有引入人為的順序關系
  3. 在向量空間中形成了線性可分的表示

與其他編碼方式的對比

  1. 標簽編碼(Label Encoding)

    • 直接將類別映射為整數
    • 可能引入順序關系
    • 計算效率高
    • 適用于有序類別
  2. 二進制編碼(Binary Encoding)

    • 使用二進制表示
    • 維度增長為log2(n)
    • 計算效率較高
    • 可能失去可解釋性
  3. 獨熱編碼(One-Hot Encoding)

    • 使用獨立維度表示每個類別
    • 不引入順序關系
    • 維度增長線性
    • 保持可解釋性

在這里插入圖片描述

優缺點分析 ??

優點 👍

  1. 無序性保證

    • 消除了類別之間的人為順序關系
    • 保持了特征的獨立性
    • 適合無序類別變量
  2. 模型兼容性

    • 與大多數機器學習算法兼容
    • 特別適合線性模型和神經網絡
    • 便于特征選擇和權重分析
  3. 可解釋性

    • 結果直觀易懂
    • 便于追蹤特征重要性
    • 方便進行特征工程

缺點 👎

  1. 維度災難

    • 類別數量大時維度劇增
    • 產生稀疏矩陣
    • 增加計算復雜度
  2. 內存消耗

    • 需要更多存儲空間
    • 可能導致內存溢出
    • 處理大規模數據集困難
  3. 計算效率

    • 訓練時間增加
    • 預測速度降低
    • 模型復雜度提升

應用場景 🎯

適用場景

  1. 低基數類別特征

    • 性別(男/女)
    • 教育程度(小學/中學/大學)
    • 職業類別(少量分類)
  2. 模型類型

    • 線性回歸
    • 邏輯回歸
    • 神經網絡
    • 支持向量機
  3. 任務類型

    • 分類問題
    • 回歸問題
    • 推薦系統

不適用場景

  1. 高基數特征

    • 用戶ID
    • 產品SKU
    • 詳細地址
  2. 特定算法

    • 決策樹
    • 隨機森林
    • XGBoost

實踐指南 💻

Python實現示例

  1. 使用Scikit-learn
from sklearn.preprocessing import OneHotEncoder
import numpy as np# 示例數據
data = np.array([['男'], ['女'], ['男'], ['女']])# 創建編碼器
encoder = OneHotEncoder(sparse=False)# 訓練并轉換數據
encoded_data = encoder.fit_transform(data)# 獲取特征名稱
feature_names = encoder.get_feature_names_out(['gender'])print("編碼結果:\n", encoded_data)
print("特征名稱:", feature_names)
  1. 使用Pandas
import pandas as pd# 創建示例數據框
df = pd.DataFrame({'color': ['紅', '藍', '綠', '紅'],'size': ['大', '中', '小', '中']
})# 對指定列進行獨熱編碼
df_encoded = pd.get_dummies(df, columns=['color', 'size'])print("編碼后的數據框:\n", df_encoded)

實際應用案例

  1. 客戶流失預測
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression# 假設數據準備
data = pd.DataFrame({'age': [25, 35, 45, 55],'gender': ['男', '女', '男', '女'],'occupation': ['工程師', '教師', '醫生', '工程師'],'churn': [0, 1, 1, 0]
})# 定義分類特征和數值特征
categorical_features = ['gender', 'occupation']
numeric_features = ['age']# 創建預處理流水線
preprocessor = ColumnTransformer(transformers=[('num', 'passthrough', numeric_features),('cat', OneHotEncoder(drop='first'), categorical_features)])# 創建完整流水線
pipeline = Pipeline([('preprocessor', preprocessor),('classifier', LogisticRegression())
])# 分割數據
X = data.drop('churn', axis=1)
y = data['churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 訓練模型
pipeline.fit(X_train, y_train)

高級技巧與優化 🚀

1. 稀疏矩陣優化

from scipy.sparse import csr_matrix# 使用稀疏矩陣存儲
encoder = OneHotEncoder(sparse=True)
sparse_encoded = encoder.fit_transform(data)# 轉換為CSR格式
csr_matrix = sparse_encoded.tocsr()

2. 特征選擇策略

在這里插入圖片描述

3. 內存優化技巧

# 使用類別數據類型
df['category'] = df['category'].astype('category')# 指定dtypes減少內存使用
encoded_df = pd.get_dummies(df, columns=['category'], dtype=np.int8)

常見陷阱與注意事項 ??

  1. 虛擬變量陷阱

    • 問題:完全共線性
    • 解決:刪除一個類別或使用drop_first=True
  2. 類別處理

    • 訓練集和測試集類別不一致
    • 新類別出現的處理
    • 缺失值的處理
  3. 維度控制

    • 設置最大類別數量
    • 合并低頻類別
    • 使用降維技術

總結與展望 🎓

獨熱編碼作為處理分類變量的基礎方法,在機器學習中占據重要地位。它的簡單直觀和良好的可解釋性使其成為數據預處理的首選方法之一。然而,在實際應用中需要注意維度災難和計算效率等問題,并根據具體場景選擇合適的優化策略。

未來發展趨勢

  1. 高效編碼方法

    • 哈希編碼
    • 實體嵌入
    • 目標編碼
  2. 自動化特征工程

    • AutoML集成
    • 智能編碼選擇
    • 動態特征生成
  3. 混合編碼策略

    • 多種編碼方法組合
    • 上下文感知編碼
    • 自適應編碼機制

通過深入理解和靈活運用獨熱編碼,我們可以更好地處理分類數據,為后續的機器學習模型訓練打下堅實基礎。在實踐中,需要根據具體問題和場景,選擇合適的編碼策略,并注意平衡表達能力和計算效率。

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

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

相關文章

RHCSA復習

在Linux中, wrx 分別代表寫(write)、讀(read)和執行(execute)權限,它們對應的權限值分別是: - r (讀權限):權限值為4。 - w &am…

“樂企“平臺如何重構業財稅票全流程生態?

2025年,國家稅務總局持續推進的"便民辦稅春風行動"再次推進數字化服務升級,其中"樂企"平臺作為稅務信息化的重要載體,持續優化數電票服務能力,為企業提供更高效、更規范的稅務管理支持。在這一背景下&#xf…

Android audio(6)-audiopolicyservice介紹

AudioPolicyService 是策略的制定者,比如某種 Stream 類型不同設備的音量(index/DB)是多少、某種 Stream 類型的音頻數據流對應什么設備等等。而 AudioFlinger 則是策略的執行者,例如具體如何與音頻設備通信,維護現有系…

Boost庫搜索引擎項目(版本1)

Boost庫搜索引擎 項目開源地址 Github:https://github.com/H0308/BoostSearchingEngine Gitee:https://gitee.com/EPSDA/BoostSearchingEngine 版本聲明 當前為最初版本,后續會根據其他內容對當前項目進行修改,具體見后續版本…

git分支合并信息查看

TortoiseGit工具 1、選擇"Revision graph" 2、勾選view中的 Show branchings and merges Arrows point towards merges 3、圖案說明 紅色部分?:代表當前分支 橙色部分?:代表遠程分支 黃色部分?:代表一個tag 綠色部分?&#xf…

Java學習筆記(多線程):ReentrantLock 源碼分析

本文是自己的學習筆記,主要參考資料如下 JavaSE文檔 1、AQS 概述1.1、鎖的原理1.2、任務隊列1.2.1、結點的狀態變化 1.3、加鎖和解鎖的簡單流程 2、ReentrantLock2.1、加鎖源碼分析2.1.1、tryAcquire()的具體實現2.1.2、acquirQueued()的具體實現2.1.3、tryLock的具…

在C++11及后續標準中,auto和decltype是用于類型推導的關鍵特性,它們的作用和用法。

在C11及后續標準中,auto和decltype是用于類型推導的關鍵特性,它們的作用和用法有所不同。以下是詳細說明: 1. auto 關鍵字 基本作用 自動推導變量的類型(根據初始化表達式)主要用于簡化代碼,避免顯式書寫…

Linux:進程程序替換execl

目錄 引言 1.單進程版程序替換 2.程序替換原理 3.6種替換函數介紹 3.1 函數返回值 3.2 命名理解 3.3 環境變量參數 引言 用fork創建子進程后執行的是和父進程相同的程序(但有可能執行不同的代碼分支),我們所創建的所有的子進程,執行的代碼&#x…

LeetCode.02.04.分割鏈表

分割鏈表 給你一個鏈表的頭節點 head 和一個特定值 x ,請你對鏈表進行分隔,使得所有 小于 x 的節點都出現在 大于或等于 x 的節點之前。 你不需要 保留 每個分區中各節點的初始相對位置。 示例 1: 輸入:head [1,4,3,2,5,2], x …

Johnson算法 流水線問題 java實現

某印刷廠有 6項加工任務J1,J2,J3,J4,J5,J6,需要在兩臺機器Mi和M2上完 成。 在機器Mi上各任務所需時間為5,1,8,5,3,4單位; 在機器M2上各任務所需時間為7,2,2,4,7,4單位。 即時間矩陣為: T1 {5, …

按鍵++,--在操作uint8_t類型(一個取值為1~10的數)中,在LCD中顯示兩位數字問題

問題概況 在執行按鍵,--過程中,本來數值為1~10.但是在執行過程中,發現數值在經過10數值后,后面的“0”會一直在LCD顯示屏中顯示。 就是執行操作中,從1,2,3,4,5&#xf…

【QT】QTreeWidgetItem的checkState/setCheckState函數和isSelected/setSelected函數

目錄 1、函數原型1.1 checkState/setCheckState1.2 isSelected/setSelected2、功能用途3、示例QTreeWidget的checkState/setCheckState函數和isSelected/setSelected這兩組函數有著不同的用途,下面具體說明: 1、函數原型 1.1 checkState/setCheckState Qt::CheckState QTr…

005 vue項目結構 vue請求頁面執行流程(vue2)

文章目錄 vue項目結構vue請求頁面執行流程main.jsrouterHelloWorld.vueApp.vueindex.html vue項目結構 config目錄存放的是配置文件,比如index.js可以配置端口 node_modules存放的是該項目依賴的模塊,這些依賴的模塊在package.json中指定 src目錄分析 1…

匯豐xxx

1. Spring Boot 的了解,解決什么問題? 我的理解: Spring Boot 是一個基于 Spring 框架的快速開發腳手架,它簡化了 Spring 應用的初始搭建和開發過程。解決的問題: 簡化配置: 傳統的 Spring 應用需要大量的…

基于 Spring Boot 瑞吉外賣系統開發(一)

基于 Spring Boot 瑞吉外賣系統開發(一) 系統概述 系統功能 技術選型 初始項目和數據準備 初始項目和SQL文件下載 創建數據庫并導入數據 打開reggie項目 運行效果 主函數啟動項目,訪問URL: http://127.0.0.1:8080/backend/pag…

大型語言模型智能應用Coze、Dify、FastGPT、MaxKB 對比,選擇合適自己的LLM工具

大型語言模型智能應用Coze、Dify、FastGPT、MaxKB 對比,選擇合適自己的LLM工具 Coze、Dify、FastGPT 和 MaxKB 都是旨在幫助用戶構建基于大型語言模型 (LLM) 的智能應用的平臺。它們各自擁有獨特的功能和側重點,以下是對它們的簡要對比: Coz…

【項目管理】第6章 信息管理概論 --知識點整理

項目管理 相關文檔,希望互相學習,共同進步 風123456789~-CSDN博客 (一)知識總覽 項目管理知識域 知識點: (項目管理概論、立項管理、十大知識域、配置與變更管理、績效域) 對應&…

Zapier MCP:重塑跨應用自動化協作的技術實踐

引言:數字化協作的痛點與突破 在當今多工具協同的工作環境中,開發者與辦公人員常常面臨數據孤島、重復操作等效率瓶頸。Zapier推出的MCP(Model Context Protocol)協議通過標準化數據交互框架,為跨應用自動化提供了新的…

echart實現動態折線圖(vue3+ts)

最近接到個任務,需要用vue3實現動態折線圖。之前沒有用過,所以一路坎坷,現在記錄一下,以后也好回憶一下。 之前不清楚echart的繪制方式,以為是在第一秒的基礎上繪制第二秒,后面實驗過后,發現并…

Java學習——day24(反射進階:注解與動態代理)

文章目錄 1. 反射與注解2. 動態代理3. 實踐:編寫動態代理示例4. 注解定義與使用5. 動態代理6. 小結與思考 1. 反射與注解 注解:注解是 Java 提供的用于在代碼中添加元數據的機制。它不會影響程序的執行,但可以在運行時通過反射獲取和處理。反…