網站首頁 編程語言 正文
1.介紹?
? ? ? 在計算機科學中,數據可以用很多不同的方式表示,自然而然地,每一種方式在某些領域都有其優點和缺點。
? ? ? 由于計算機無法處理分類數據,因為這些類別對它們沒有意義,如果我們希望計算機能夠處理這些信息,就必須準備好這些信息。
? ? ? 此操作稱為預處理。 預處理的很大一部分是編碼 - 以計算機可以理解的方式表示每條數據(該名稱的字面意思是“轉換為計算機代碼”)。
? ? ? 在計算機科學的許多分支中,尤其是機器學習和數字電路設計中,One-Hot Encoding
被廣泛使用。
? ? ? 在本文中,我們將解釋什么是 one-hot 編碼,并使用一些流行的選擇(Pandas 和 Scikit-Learn)在 Python 中實現它。 我們還將比較它與計算機中其他類型表示的有效性、優點和缺點,以及它的應用。
2.什么是One-Hot編碼?
? ? ? One-hot Encoding
是一種向量表示,其中向量中的所有元素都是 0,除了一個,它的值是 1,其中 1 表示指定元素類別的布爾值。
? ? ? 還有一個類似的實現,稱為One-Cold Encoding
,其中向量中的所有元素都是 1,除了 1 的值是 0。
? ? ? 例如,[0, 0, 0, 1, 0] 和 [1 ,0, 0, 0, 0] 可以是One-hot 向量的一些示例。 與此類似的技術,也用于表示數據,例如統計中的虛擬變量。
? ? ? 這與其他編碼方案非常不同,其他編碼方案都允許多個位的值為 1。 下表比較了從 0 到 7 的數字在二進制、格雷碼和 one-hot 中的表示:
實際上,對于每個 one-hot 向量,我們會問 n 個問題,其中 n 是我們擁有的類別數:
? ? ? 這是數字1嗎? 這是數字2嗎? ......這是數字7嗎?
? ? ? 每個“0”都是“假”,一旦我們在向量中找到“1”,問題的答案就是“真”。
? ? ? One-hot 編碼將分類特征轉換為一種更適合分類和回歸算法的格式。 它在需要多種類型數據表示的方法中非常有用。
例如,一些向量可能最適合回歸(基于以前的返回值逼近函數),而一些可能最適合分類(分類為固定集/類,通常是二元的):
這里我們有六個分類數據的樣本輸入。 此處使用的編碼類型稱為“label encoding”——它非常簡單:我們只需為分類值分配一個 ID。
? ? ? 我們的計算機現在知道如何表示這些類別,因為它知道如何處理數字。 然而,這種編碼方法并不是很有效,因為它自然會賦予更高的數字更高的權重。
? ? ? 說我們的“Strawberries”類別大于或小于“Apples”是沒有意義的,或者將類別“Lemon”添加到“Peach”會給我們一個類別“Orange”,因為這些值不是序數。
? ? ? 如果我們用 one-hot 編碼表示這些類別,我們實際上會用列替換行。 我們通過為每個給定類別創建一個布爾列來實現這一點,其中只有這些列之一可以為每個樣本取值 1:
我們可以從上表中看出,與二進制或格雷碼相比,one-hot 表示需要更多的數字。 對于n個數字,one-hot編碼只能表示n個值,而Binary或Gray編碼可以用n個數字表示2n個值。
?3.實現-Pandas?
? ? ? 讓我們看一個簡單的示例,說明如何通過 one-hot 編碼方案將數據集中的分類列中的值轉換為對應的數值。? ??
我們將創建一個非常簡單的數據集 - 國家及其 ID 的列表:
? ? ? ?在上面的腳本中,我們使用兩個列表(即 ids 和國家/地區)創建了一個Pandas dataframe
,稱為 df。 如果您在數據幀上調用 head() 方法,會看到以下結果:
Countries列包含分類值。 我們可以使用 get_dummies() 函數將Countries列中的值轉換為one-hot編碼向量:
我們將 Country
作為 get_dummies()
方法的前綴屬性的值傳遞,因此您可以在輸出中的每個單熱編碼列的標題之前看到字符串 Country 前綴。
?4.實現-Scikit-Learn?
? ? ? 另一種方法是使用另一個流行的庫 - Scikit-Learn
。 為此,它提供了 OneHotEncoder
類和 LabelBinarizer
類。
首先,導入庫LabelBinarizer:
打印y值:
同樣,我們可以使用支持多列數據的 OneHotEncoder 類,與之前的類不同:
5.?One-hot編碼在機器學習領域的應用?
? ? ? 如上所述,計算機不太擅長處理分類數據。 雖然我們很好地理解分類數據,但這是由于計算機不具備的一種先決知識。
? ? ? 大多數機器學習技術和模型使用非常有限的數據集(通常是二進制)。 神經網絡消耗數據并產生 0..1 范圍內的結果,我們很少會超出該范圍。
? ? ? 簡而言之,絕大多數機器學習算法都會接收樣本數據(“訓練數據”),從中提取特征。 基于這些特征,創建了一個數學模型,然后用于進行預測或決策,而無需明確編程來執行這些任務。
? ? ? 一個很好的例子是分類,其中輸入在技術上可以是無界的,但輸出通常僅限于幾個類別。 在二元分類的情況下(假設我們正在教一個神經網絡對貓和狗進行分類),我們的映射為 0 代表貓,1 代表狗。
? ? ? 大多數情況下,我們希望對其進行預測的訓練數據是分類的,就像上面提到的帶有水果的例子一樣。 同樣,雖然這對我們很有意義,但這些詞本身對算法沒有意義,因為它不理解它們。
? ? ? 在這些算法中使用one-hot
編碼來表示數據在技術上不是必需的,但如果我們想要一個有效的實現,它非常有用。
原文鏈接:https://blog.51cto.com/u_14857544/5024208
相關推薦
- 2022-10-14 MapStruct 代碼生成器
- 2022-12-10 OpenMP深入剖析reduction子句教程_C 語言
- 2022-11-02 Python嵌套函數與nonlocal使用詳細介紹_python
- 2022-11-02 用戶態和內核態-用戶線程和內核態線程的區別_其它相關
- 2022-06-17 Go模板template用法詳解_Golang
- 2022-07-11 使用?Loki?實現?Kubernetes?容器日志監控的方法_相關技巧
- 2022-05-28 python中數組和列表的簡單實例_python
- 2022-09-02 C#實現裝飾器模式_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支