網站首頁 編程語言 正文
1. 為什么使用 one-hot 編碼?
問題:
在機器學習算法中,我們經常會遇到分類特征,例如:人的性別有男女,祖國有中國,美國,法國等。 這些特征值并不是連續的,而是離散的,無序的。
目的:
如果要作為機器學習算法的輸入,通常我們需要對其進行特征數字化。什么是特征數字化呢?例如:
性別特征:["男","女"]
祖國特征:["中國","美國,"法國"]
運動特征:["足球","籃球","羽毛球","乒乓球"]
瓶頸:
假如某個樣本(某個人),他的特征是["男","中國","乒乓球"] ,我們可以用 [0,0,4] 來表示,但是這樣的特征處理并不能直接放入機器學習算法中。因為類別之間是無序的。
2. 什么是 one-hot 編碼?
定義:
獨熱編碼即 One-Hot 編碼,又稱一位有效編碼。其方法是使用 N位 狀態寄存器來對 N個狀態 進行編碼,每個狀態都有它獨立的寄存器位,并且在任意時候,其中只有一位有效。
理解:
One-Hot 編碼是分類變量作為二進制向量的表示。
(1) 將分類值映射到整數值。
(2) 然后,每個整數值被表示為二進制向量,除了整數的索引之外,它都是零值,它被標記為1。
舉例1:
舉個例子,假設我們有四個樣本(行),每個樣本有三個特征(列),如圖:
上述feature_1有兩種可能的取值,比如是男/女,這里男用1表示,女用2表示。feature_2 和 feature_3 各有4種取值(狀態)。
one-hot 編碼就是保證每個樣本中的單個特征只有1位處于狀態1,其他的都是0。
上述狀態用 one-hot 編碼如下圖所示:
舉例2:
按照 N位狀態寄存器 來 對N個狀態 進行編碼的原理,處理后應該是這樣的
性別特征:["男","女"] (這里只有兩個特征,所以 N=2):
男 => 10
女 => 01
祖國特征:["中國","美國,"法國"](N=3):
中國 => 100
美國 => 010
法國 => 001
運動特征:["足球","籃球","羽毛球","乒乓球"](N=4):
足球 => 1000
籃球 => 0100
羽毛球 => 0010
乒乓球 => 0001
所以,當一個樣本為 ["男","中國","乒乓球"] 的時候,完整的特征數字化的結果為:
[1,0,1,0,0,0,0,0,1]
下圖可能會更好理解:
python 代碼示例:
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]]) # 訓練。這里共有4個數據,3種特征
array = enc.transform([[0,1,3]]).toarray() # 測試。這里使用1個新數據來測試
print array # [[ 1 0 0 1 0 0 0 0 1]] # 獨熱編碼結果
以上對應關系可以解釋為下圖:
3. one-hot 編碼優缺點?
優點:
(1) 解決了 分類器不好處理離散數據 的問題。
a. 歐式空間。在回歸,分類,聚類等機器學習算法中,特征之間距離計算 或 相似度計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算余弦相似性,基于的就是歐式空間。
b. one-hot 編碼。使用 one-hot 編碼,將離散特征的取值擴展到了歐式空間,離散特征的某個取值 就 對應歐式空間的某個點。將離散型特征使用 one-hot 編碼,確實會讓特征之間的距離計算更加合理。
(2) 在一定程度上也起到了 擴充特征 的作用。
缺點:
在文本特征表示上有些缺點就非常突出了。
(1) 它是一個詞袋模型,不考慮詞與詞之間的順序(文本中詞的順序信息也是很重要的);
(2) 它假設詞與詞相互獨立(在大多數情況下,詞與詞是相互影響的);
(3) 它得到的特征是離散稀疏的 (這個問題最嚴重)。
上述第3點展開:
(1) 為什么得到的特征是離散稀疏的?
例如,如果將世界所有城市名稱作為語料庫的話,那這個向量會過于稀疏,并且會造成維度災難。如下:
杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
寧波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]
在語料庫中,杭州、上海、寧波、北京各對應一個向量,向量中只有一個值為1,其余都為0。
(2)能不能把詞向量的維度變小呢?
a) Dristributed representation:
可以解決 One hot representation 的問題,它的思路是:
1. 通過訓練,將每個詞都映射到一個較短的詞向量上來。
2. 所有的這些 詞向量 就構成了 向量空間,
3. 進而可以用 普通的統計學的方法 來研究詞與詞之間的關系。
這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。
b) 舉例:
1. 比如將詞匯表里的詞用 "Royalty", "Masculinity", "Femininity" 和 "Age" 4個維度來表示,King 這個詞對應的詞向量可能是 (0.99,0.99,0.05,0.7)。
2. 在實際情況中,并不能對詞向量的每個維度做一個很好的解釋。
3.將king這個詞從一個可能非常稀疏的向量坐在的空間,映射到現在這個 四維向量 所在的空間,必須滿足以下性質:
(1)這個映射是單射;
(2)映射之后的向量 不會丟失之前的 那種向量 所含的信息 。
4.這個過程稱為word embedding(詞嵌入),即將高維詞向量嵌入到一個低維空間。如圖:
5.經過我們一系列的降維神操作,有了用 representation 表示的較短的詞向量,我們就可以較容易的分析詞之間的關系了,比如我們將詞的維度降維到 2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發現:
6. 出現這種現象的原因是,我們得到最后的詞向量的訓練過程中引入了詞的上下文。舉例:
想到得到 "learning" 的詞向量,但訓練過程中,你同時考慮了它左右的上下文,那么就可以使 "learning" 帶有語義信息了。通過這種操作,我們可以得到近義詞,甚至 cat 和它的復數 cats 的向量極其相近。
--------------------------------------------------------------------
參考博客:
通俗理解word2vec
機器學習:數據預處理之獨熱編碼(One-Hot)
原文鏈接:https://blog.csdn.net/qq_15192373/article/details/89552498
相關推薦
- 2023-07-08 如何讓element-ui的el-row內容居中(水平垂直)
- 2022-05-23 Python的代理類實現,控制訪問和修改屬性的權限你都了解嗎_python
- 2023-01-10 Flutter?RendererBinding作用源碼分析_IOS
- 2022-03-27 深入理解C++內聯函數_C 語言
- 2022-01-22 oracle之連接查詢和子查詢
- 2022-06-27 C#?使用Log4net添加日志記錄的方法_C#教程
- 2022-12-21 C和C++中argc和argv的含義及用法詳解_C 語言
- 2022-08-04 基于Python實現煙花效果的示例代碼_python
- 最近更新
-
- 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同步修改后的遠程分支