特征工程之特征缩放特征编码
機器學習入門系列(2)–如何構建一個完整的機器學習項目,第五篇!
該系列的前四篇文章:
- 機器學習入門系列(2)–如何構建一個完整的機器學習項目(一)
- 機器學習數據集的獲取和測試集的構建方法
- 特征工程之數據預處理(上)
- 特征工程之數據預處理(下)
本篇文章會繼續(xù)介紹特征工程的內容,這次會介紹特征縮放和特征編碼,前者主要是歸一化和正則化,用于消除量綱關系的影響,后者包括了序號編碼、獨熱編碼等,主要是處理類別型、文本型以及連續(xù)型特征。
3.2 特征縮放
特征縮放主要分為兩種方法,歸一化和正則化。
3.2.1 歸一化
- 某些算法要求樣本數據或特征的數值具有零均值和單位方差;
- 為了消除樣本數據或者特征之間的量綱影響,即消除數量級的影響。如下圖所示是包含兩個屬性的目標函數的等高線
- 數量級的差異將導致量級較大的屬性占據主導地位。從下圖左看到量級較大的屬性會讓橢圓的等高線壓縮為直線,使得目標函數僅依賴于該屬性。
- 數量級的差異會導致迭代收斂速度減慢。原始的特征進行梯度下降時,每一步梯度的方向會偏離最小值(等高線中心點)的方向,迭代次數較多,且學習率必須非常小,否則非常容易引起寬幅震蕩。但經過標準化后,每一步梯度的方向都幾乎指向最小值(等高線中心點)的方向,迭代次數較少。
- 所有依賴于樣本距離的算法對于數據的數量級都非常敏感。比如 KNN 算法需要計算距離當前樣本最近的 k 個樣本,當屬性的量級不同,選擇的最近的 k 個樣本也會不同。
- 線性函數歸一化(Min-Max Scaling)。它對原始數據進行線性變換,使得結果映射到[0,1]的范圍,實現對原始數據的等比縮放,公式如下:
Xnorm=X?XminXmax?XminX_{norm}=\frac{X-X_{min}}{X_{max}-X_{min}} Xnorm?=Xmax??Xmin?X?Xmin??
其中 X 是原始數據,Xmax,XminX_{max}, X_{min}Xmax?,Xmin?分別表示數據最大值和最小值。
- 零均值歸一化(Z-Score Normalization)。它會將原始數據映射到均值為 0,標準差為 1 的分布上。假設原始特征的均值是μ\muμ、方差是σ\sigmaσ,則公式如下:
z=x?μσz = \frac{x-\mu}{\sigma} z=σx?μ?
3.2.2 正則化
假設數據集為:
對樣本首先計算 Lp 范數,得到:
正則化后的結果是:每個屬性值除以其 Lp 范數
正則化的過程是針對單個樣本的,對每個樣本將它縮放到單位范數。
歸一化是針對單個屬性的,需要用到所有樣本在該屬性上的值。
通常如果使用二次型(如點積)或者其他核方法計算兩個樣本之間的相似性時,該方法會很有用。
3.3 特征編碼
3.3.1 序號編碼(Ordinal Encoding)
定義:序號編碼一般用于處理類別間具有大小關系的數據。
比如成績,可以分為高、中、低三個檔次,并且存在“高>中>低”的大小關系,那么序號編碼可以對這三個檔次進行如下編碼:高表示為 3,中表示為 2,低表示為 1,這樣轉換后依然保留了大小關系。
3.3.2 獨熱編碼(One-hot Encoding)
定義:獨熱編碼通常用于處理類別間不具有大小關系的特征。
獨熱編碼是采用 N 位狀態(tài)位來對 N 個可能的取值進行編碼。比如血型,一共有 4 個取值(A、B、AB 以及 O 型),那么獨熱編碼會將血型轉換為一個 4 維稀疏向量,分別表示上述四種血型為:
- A型:(1,0,0,0)
- B型:(0,1,0,0)
- AB型:(0,0,1,0)
- O型:(0,0,0,1)
獨熱編碼的優(yōu)點有以下幾個:
- 能夠處理非數值屬性。比如血型、性別等
- 一定程度上擴充了特征。
- 編碼后的向量是稀疏向量,只有一位是 1,其他都是 0,可以利用向量的稀疏來節(jié)省存儲空間。
- 能夠處理缺失值。當所有位都是 0,表示發(fā)生了缺失。此時可以采用處理缺失值提到的高維映射方法,用第 N+1 位來表示缺失值。
當然,獨熱編碼也存在一些缺點:
1.高維度特征會帶來以下幾個方面問題:
- KNN 算法中,高維空間下兩點之間的距離很難得到有效的衡量;
- 邏輯回歸模型中,參數的數量會隨著維度的增高而增加,導致模型復雜,出現過擬合問題;
- 通常只有部分維度是對分類、預測有幫助,需要借助特征選擇來降低維度。
2.決策樹模型不推薦對離散特征進行獨熱編碼,有以下兩個主要原因:
-
產生樣本切分不平衡問題,此時切分增益會非常小。
比如對血型做獨熱編碼操作,那么對每個特征是否 A 型、是否 B 型、是否 AB 型、是否 O 型,會有少量樣本是 1 ,大量樣本是 0。
這種劃分的增益非常小,因為拆分之后:
-
較小的那個拆分樣本集,它占總樣本的比例太小。無論增益多大,乘以該比例之后幾乎可以忽略。
-
較大的那個拆分樣本集,它幾乎就是原始的樣本集,增益幾乎為零。
-
-
影響決策樹的學習。
決策樹依賴的是數據的統(tǒng)計信息。而獨熱碼編碼會把數據切分到零散的小空間上。在這些零散的小空間上,統(tǒng)計信息是不準確的,學習效果變差。
本質是因為獨熱編碼之后的特征的表達能力較差。該特征的預測能力被人為的拆分成多份,每一份與其他特征競爭最優(yōu)劃分點都失敗。最終該特征得到的重要性會比實際值低。
3.3.3 二進制編碼(Binary Encoding)
二進制編碼主要分為兩步:
繼續(xù)以血型為例子,如下表所示:
| A | 1 | 0 0 1 | 1 0 0 0 |
| B | 2 | 0 1 0 | 0 1 0 0 |
| AB | 3 | 0 1 1 | 0 0 1 0 |
| O | 4 | 1 0 0 | 0 0 0 1 |
從上表可以知道,二進制編碼本質上是利用二進制對類別 ID 進行哈希映射,最終得到 0/1 特征向量,并且特征維度小于獨熱編碼,更加節(jié)省存儲空間。
3.3.4 二元化
定義:特征二元化就是將數值型的屬性轉換為布爾型的屬性。通常用于假設屬性取值分布是伯努利分布的情形。
特征二元化的算法比較簡單。對屬性 j 指定一個閾值 m。
- 如果樣本在屬性 j 上的值大于等于 m, 則二元化后為 1;
- 如果樣本在屬性 j 上的值小于 m,則二元化為 0
根據上述定義,m 是一個關鍵的超參數,它的取值需要結合模型和具體的任務來選擇。
3.3.5 離散化
定義:顧名思義,離散化就是將連續(xù)的數值屬性轉換為離散的數值屬性。
那么什么時候需要采用特征離散化呢?
這背后就是需要采用“海量離散特征+簡單模型”,還是“少量連續(xù)特征+復雜模型”的做法了。
- 對于線性模型,通常使用“海量離散特征+簡單模型”。
- 優(yōu)點:模型簡單
- 缺點:特征工程比較困難,但一旦有成功的經驗就可以推廣,并且可以很多人并行研究。
- 對于非線性模型(比如深度學習),通常使用“少量連續(xù)特征+復雜模型”。
- 優(yōu)點:不需要復雜的特征工程
- 缺點:模型復雜
分桶
1.離散化的常用方法是分桶:
- 將所有樣本在連續(xù)的數值屬性 j 的取值從小到大排列 a0,a1,...,aN{a_0, a_1, ..., a_N}a0?,a1?,...,aN? 。
- 然后從小到大依次選擇分桶邊界b1,b2,...,bMb_1, b_2, ..., b_Mb1?,b2?,...,bM? 。其中:
- M 為分桶的數量,它是一個超參數,需要人工指定。
- 每個桶的大小bk+1?bkb_{k+1}-b_kbk+1??bk? 也是一個超參數,需要人工指定。
- 給定屬性 j 的取值aia_iai?,對其進行分桶:
- 如果ai<b1a_i < b_1ai?<b1?,則分桶編號是 0。分桶后的屬性的取值為 0;
- 如果bk≤ai≤bk+1b_k \le a_i \le b_{k+1}bk?≤ai?≤bk+1?,則分桶編號是 k。分桶后的屬性取值是 k;
- 如果 ai≥bMa_i \ge b_Mai?≥bM?, 則分桶編號是 M。分桶后的屬性取值是 M。
2.分桶的數量和邊界通常需要人工指定。一般有兩種方法:
- 根據業(yè)務領域的經驗來指定。如:對年收入進行分桶時,根據 2017 年全國居民人均可支配收入約為 2.6 萬元,可以選擇桶的數量為5。其中:
- 收入小于 1.3 萬元(人均的 0.5 倍),則為分桶 0 。
- 年收入在 1.3 萬元 ~5.2 萬元(人均的 0.5~2 倍),則為分桶 1 。
- 年收入在 5.3 萬元~26 萬元(人均的 2 倍~10 倍),則為分桶 2 。
- 年收入在 26 萬元~260 萬元(人均的 10 倍~100 倍),則為分桶 3 。
- 年收入超過 260 萬元,則為分桶 4 。
- 根據模型指定。根據具體任務來訓練分桶之后的數據集,通過超參數搜索來確定最優(yōu)的分桶數量和分桶邊界。
3.選擇分桶大小時,有一些經驗指導:
-
分桶大小必須足夠小,使得桶內的屬性取值變化對樣本標記的影響基本在一個不大的范圍。
即不能出現這樣的情況:單個分桶的內部,樣本標記輸出變化很大。
-
分桶大小必須足夠大,使每個桶內都有足夠的樣本。
如果桶內樣本太少,則隨機性太大,不具有統(tǒng)計意義上的說服力。
-
每個桶內的樣本盡量分布均勻。
特性
1.在工業(yè)界很少直接將連續(xù)值作為邏輯回歸模型的特征輸入,而是將連續(xù)特征離散化為一系列 0/1 的離散特征。
其優(yōu)勢有:
-
離散化之后得到的稀疏向量,內積乘法運算速度更快,計算結果方便存儲。
-
離散化之后的特征對于異常數據具有很強的魯棒性。
如:銷售額作為特征,當銷售額在 [30,100) 之間時,為1,否則為 0。如果未離散化,則一個異常值 10000 會給模型造成很大的干擾。由于其數值較大,它對權重的學習影響較大。
-
邏輯回歸屬于廣義線性模型,表達能力受限,只能描述線性關系。特征離散化之后,相當于引入了非線性,提升模型的表達能力,增強擬合能力。
假設某個連續(xù)特征 j ,它離散化為 M 個 0/1 特征 j1,j2,...,jMj_1, j_2, ..., j_Mj1?,j2?,...,jM? 。則:$w_j * x_j -> w_{j1} * x_{j1}^+ w_{j2} * x_{j2}^ + …+w_{jM} * x_{jM}^` $
。其中 xj1‘,xj2‘,...,xjM‘x_{j1}^`,x_{j2}^`,..., x_{jM}^`xj1‘?,xj2‘?,...,xjM‘? 是離散化之后的新的特征,它們的取值空間都是 {0, 1}。
上式右側是一個分段線性映射,其表達能力更強。
-
離散化之后可以進行特征交叉。假設有連續(xù)特征j ,離散化為 N 個 0/1 特征;連續(xù)特征 k,離散化為 M 個 0/1 特征,則分別進行離散化之后引入了 N+M 個特征。
假設離散化時,并不是獨立進行離散化,而是特征 j,k 聯(lián)合進行離散化,則可以得到 N*M 個組合特征。這會進一步引入非線性,提高模型表達能力。
-
離散化之后,模型會更穩(wěn)定。
如對銷售額進行離散化,[30,100) 作為一個區(qū)間。當銷售額在40左右浮動時,并不會影響它離散化后的特征的值。
但是處于區(qū)間連接處的值要小心處理,另外如何劃分區(qū)間也是需要仔細處理。
2.特征離散化簡化了邏輯回歸模型,同時降低模型過擬合的風險。
能夠對抗過擬合的原因:經過特征離散化之后,模型不再擬合特征的具體值,而是擬合特征的某個概念。因此能夠對抗數據的擾動,更具有魯棒性。
另外它使得模型要擬合的值大幅度降低,也降低了模型的復雜度。
小結
特征縮放是非常常用的方法,特別是歸一化處理特征數據,對于利用梯度下降來訓練學習模型參數的算法,有助于提高訓練收斂的速度;而特征編碼,特別是獨熱編碼,也常用于對結構化數據的數據預處理。
參考:
- 《百面機器學習》第一章 特征工程
- https://blog.csdn.net/dream_angel_z/article/details/49388733#commentBox
- https://www.cnblogs.com/sherial/archive/2018/03/07/8522405.html
- https://gofisher.github.io/2018/06/22/數據預處理/
- https://gofisher.github.io/2018/06/20/數據探索/
- https://juejin.im/post/5b6a44f55188251aa8294b8c
- https://www.zhihu.com/question/47716840
- http://www.huaxiaozhuan.com/統(tǒng)計學習/chapters/8_feature_selection.html
歡迎關注我的微信公眾號–機器學習與計算機視覺,或者掃描下方的二維碼,大家一起交流,學習和進步!
往期精彩推薦
機器學習系列
- 機器學習入門系列(1)–機器學習概覽
- 機器學習入門系列(2)–如何構建一個完整的機器學習項目(一)
- 機器學習數據集的獲取和測試集的構建方法
- 特征工程之數據預處理(上)
- 特征工程之數據預處理(下)
數學學習筆記
- 程序員的數學筆記1–進制轉換
- 程序員的數學筆記2–余數
- 程序員的數學筆記3–迭代法
Github項目 & 資源教程推薦
- [Github 項目推薦] 一個更好閱讀和查找論文的網站
- [資源分享] TensorFlow 官方中文版教程來了
- 必讀的AI和深度學習博客
- [教程]一份簡單易懂的 TensorFlow 教程
- [資源]推薦一些Python書籍和教程,入門和進階的都有!
總結
以上是生活随笔為你收集整理的特征工程之特征缩放特征编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub 上100个优质前端项目整理
- 下一篇: idea翻译成中文_IDEA使用有道翻译