機器學習入門系列(2)--如何構建一個完整的機器學習項目,第五篇!

該系列的前四篇文章:

  • 機器學習入門系列(2)--如何構建一個完整的機器學習項目(一)
  • 機器學習數據集的獲取和測試集的構建方法
  • 特徵工程之數據預處理(上)
  • 特徵工程之數據預處理(下)

本篇文章會繼續介紹特徵工程的內容,這次會介紹特徵縮放和特徵編碼,前者主要是歸一化和正則化,用於消除量綱關係的影響,後者包括了序號編碼、獨熱編碼等,主要是處理類別型、文本型以及連續型特徵。


3.2 特徵縮放

特徵縮放主要分為兩種方法,歸一化和正則化。

3.2.1 歸一化

  1. 歸一化(Normalization),也稱為標準化,這裡不僅僅是對特徵,實際上對於原始數據也可以進行歸一化處理,它是將特徵(或者數據)都縮放到一個指定的大致相同的數值區間內
  2. 歸一化的兩個原因
  • 某些演算法要求樣本數據或特徵的數值具有零均值和單位方差
  • 為了消除樣本數據或者特徵之間的量綱影響,即消除數量級的影響。如下圖所示是包含兩個屬性的目標函數的等高線
    • 數量級的差異將導致量級較大的屬性佔據主導地位。從下圖左看到量級較大的屬性會讓橢圓的等高線壓縮為直線,使得目標函數僅依賴於該屬性。
    • 數量級的差異會導致迭代收斂速度減慢。原始的特徵進行梯度下降時,每一步梯度的方向會偏離最小值(等高線中心點)的方向,迭代次數較多,且學習率必須非常小,否則非常容易引起寬幅震蕩。但經過標準化後,每一步梯度的方向都幾乎指向最小值(等高線中心點)的方向,迭代次數較少
    • 所有依賴於樣本距離的演算法對於數據的數量級都非常敏感。比如 KNN 演算法需要計算距離當前樣本最近的 k 個樣本,當屬性的量級不同,選擇的最近的 k 個樣本也會不同。

3.常用的兩種歸一化方法:

  • 線性函數歸一化(Min-Max Scaling)。它對原始數據進行線性變換,使得結果映射到[0,1]的範圍,實現對原始數據的等比縮放,公式如下:

X_{norm}=frac{X-X_{min}}{X_{max}-X_{min}}

其中 X 是原始數據, X_{max}, X_{min} 分別表示數據最大值和最小值。

  • 零均值歸一化(Z-Score Normalization)。它會將原始數據映射到均值為 0,標準差為 1 的分佈上。假設原始特徵的均值是 mu 、方差是 sigma ,則公式如下:

z = frac{x-mu}{sigma}

4.如果數據集分為訓練集、驗證集、測試集,那麼三個數據集都採用相同的歸一化參數,數值都是通過訓練集計算得到,即上述兩種方法中分別需要的數據最大值、最小值,方差和均值都是通過訓練集計算得到(這個做法類似於深度學習中批歸一化,BN的實現做法)。

5.歸一化不是萬能的,實際應用中,通過梯度下降法求解的模型是需要歸一化的,這包括線性回歸、邏輯回歸、支持向量機、神經網路等模型。但決策樹模型不需要,以 C4.5 演算法為例,決策樹在分裂結點時候主要依據數據集 D 關於特徵 x 的信息增益比,而信息增益比和特徵是否經過歸一化是無關的,歸一化不會改變樣本在特徵 x 上的信息增益。

3.2.2 正則化

  1. 正則化是將樣本或者特徵的某個範數(如 L1、L2 範數)縮放到單位 1

假設數據集為:

對樣本首先計算 Lp 範數,得到:

正則化後的結果是:每個屬性值除以其 Lp 範數

2.正則化的過程是針對單個樣本的,對每個樣本將它縮放到單位範數。

歸一化是針對單個屬性的,需要用到所有樣本在該屬性上的值。

3.通常如果使用二次型(如點積)或者其他核方法計算兩個樣本之間的相似性時,該方法會很有用。

3.3 特徵編碼

3.3.1 序號編碼(Ordinal Encoding)

定義:序號編碼一般用於處理類別間具有大小關係的數據。

比如成績,可以分為高、中、低三個檔次,並且存在「高>中>低」的大小關係,那麼序號編碼可以對這三個檔次進行如下編碼:高表示為 3,中表示為 2,低表示為 1,這樣轉換後依然保留了大小關係。

3.3.2 獨熱編碼(One-hot Encoding)

定義:獨熱編碼通常用於處理類別間不具有大小關係的特徵。

獨熱編碼是採用 N 位狀態位來對 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)

獨熱編碼的優點有以下幾個:

  • 能夠處理非數值屬性。比如血型、性別等
  • 一定程度上擴充了特徵。
  • 編碼後的向量是稀疏向量,只有一位是 1,其他都是 0,可以利用向量的稀疏來節省存儲空間
  • 能夠處理缺失值。當所有位都是 0,表示發生了缺失。此時可以採用處理缺失值提到的高維映射方法,用第 N+1 位來表示缺失值。

當然,獨熱編碼也存在一些缺點:

1.高維度特徵會帶來以下幾個方面問題:

  • KNN 演算法中,高維空間下兩點之間的距離很難得到有效的衡量
  • 邏輯回歸模型中,參數的數量會隨著維度的增高而增加,導致模型複雜,出現過擬合問題
  • 通常只有部分維度是對分類、預測有幫助,需要藉助特徵選擇來降低維度

2.決策樹模型不推薦對離散特徵進行獨熱編碼,有以下兩個主要原因:

  • 產生樣本切分不平衡問題,此時切分增益會非常小。比如對血型做獨熱編碼操作,那麼對每個特徵是否 A 型、是否 B 型、是否 AB 型、是否 O 型,會有少量樣本是 1 ,大量樣本是 0。這種劃分的增益非常小,因為拆分之後:
    • 較小的那個拆分樣本集,它佔總樣本的比例太小。無論增益多大,乘以該比例之後幾乎可以忽略。
    • 較大的那個拆分樣本集,它幾乎就是原始的樣本集,增益幾乎為零。

  • 影響決策樹的學習。決策樹依賴的是數據的統計信息。而獨熱碼編碼會把數據切分到零散的小空間上。在這些零散的小空間上,統計信息是不準確的,學習效果變差。

    本質是因為獨熱編碼之後的特徵的表達能力較差。該特徵的預測能力被人為的拆分成多份,每一份與其他特徵競爭最優劃分點都失敗。最終該特徵得到的重要性會比實際值低。

3.3.3 二進位編碼(Binary Encoding)

二進位編碼主要分為兩步:

  1. 先採用序號編碼給每個類別賦予一個類別 ID;
  2. 接著將類別 ID 對應的二進位編碼作為結果。

繼續以血型為例子,如下表所示:

從上表可以知道,二進位編碼本質上是利用二進位對類別 ID 進行哈希映射,最終得到 0/1 特徵向量,並且特徵維度小於獨熱編碼,更加節省存儲空間

3.3.4 二元化

定義:特徵二元化就是將數值型的屬性轉換為布爾型的屬性。通常用於假設屬性取值分佈是伯努利分佈的情形。

特徵二元化的演算法比較簡單。對屬性 j 指定一個閾值 m

  • 如果樣本在屬性 j 上的值大於等於 m, 則二元化後為 1;
  • 如果樣本在屬性 j 上的值小於 m,則二元化為 0

根據上述定義,m 是一個關鍵的超參數,它的取值需要結合模型和具體的任務來選擇。

3.3.5 離散化

定義:顧名思義,離散化就是將連續的數值屬性轉換為離散的數值屬性。

那麼什麼時候需要採用特徵離散化呢?

這背後就是需要採用「海量離散特徵+簡單模型」,還是「少量連續特徵+複雜模型」的做法了。

  • 對於線性模型,通常使用「海量離散特徵+簡單模型」。
  • 優點:模型簡單
  • 缺點:特徵工程比較困難,但一旦有成功的經驗就可以推廣,並且可以很多人並行研究。
  • 對於非線性模型(比如深度學習),通常使用「少量連續特徵+複雜模型」。
  • 優點:不需要複雜的特徵工程
  • 缺點:模型複雜

分桶

1.離散化的常用方法是分桶

  • 將所有樣本在連續的數值屬性 j 的取值從小到大排列 {a_0, a_1, ..., a_N}
  • 然後從小到大依次選擇分桶邊界 b_1, b_2, ..., b_M 。其中:
  • M 為分桶的數量,它是一個超參數,需要人工指定。
  • 每個桶的大小 b_{k+1}-b_k 也是一個超參數,需要人工指定。
  • 給定屬性 j 的取值 a_i ,對其進行分桶:
  • 如果 a_i < b_1 ,則分桶編號是 0。分桶後的屬性的取值為 0;
  • 如果 b_k le a_i le b_{k+1} ,則分桶編號是 k。分桶後的屬性取值是 k
  • 如果 a_i ge b_M , 則分桶編號是 M。分桶後的屬性取值是 M

2.分桶的數量和邊界通常需要人工指定。一般有兩種方法:

  • 根據業務領域的經驗來指定。如:對年收入進行分桶時,根據 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 。

  • 根據模型指定。根據具體任務來訓練分桶之後的數據集,通過超參數搜索來確定最優的分桶數量和分桶邊界。

3.選擇分桶大小時,有一些經驗指導:

  • 分桶大小必須足夠小,使得桶內的屬性取值變化對樣本標記的影響基本在一個不大的範圍。即不能出現這樣的情況:單個分桶的內部,樣本標記輸出變化很大。
  • 分桶大小必須足夠大,使每個桶內都有足夠的樣本。如果桶內樣本太少,則隨機性太大,不具有統計意義上的說服力。
  • 每個桶內的樣本盡量分佈均勻

特性

1.在工業界很少直接將連續值作為邏輯回歸模型的特徵輸入,而是將連續特徵離散化為一系列 0/1 的離散特徵

其優勢有:

  • 離散化之後得到的稀疏向量,內積乘法運算速度更快,計算結果方便存儲
  • 離散化之後的特徵對於異常數據具有很強的魯棒性。如:銷售額作為特徵,當銷售額在 [30,100) 之間時,為1,否則為 0。如果未離散化,則一個異常值 10000 會給模型造成很大的幹擾。由於其數值較大,它對權重的學習影響較大。
  • 邏輯回歸屬於廣義線性模型,表達能力受限,只能描述線性關係。特徵離散化之後,相當於引入了非線性,提升模型的表達能力,增強擬合能力。假設某個連續特徵 j ,它離散化為 M 個 0/1 特徵 j_1, j_2, ..., j_M 。則: w_j * x_j -> w_{j1} * x_{j1}^` + w_{j2} * x_{j2}^` + ...+w_{jM} * x_{jM}^` 是離散化之後的新的特徵,它們的取值空間都是 {0, 1}。上式右側是一個分段線性映射,其表達能力更強。
  • 離散化之後可以進行特徵交叉。假設有連續特徵j ,離散化為 N個 0/1 特徵;連續特徵 k,離散化為 M 個 0/1 特徵,則分別進行離散化之後引入了 N+M 個特徵。假設離散化時,並不是獨立進行離散化,而是特徵 j,k 聯合進行離散化,則可以得到 N*M 個組合特徵。這會進一步引入非線性,提高模型表達能力
  • 離散化之後,模型會更穩定。如對銷售額進行離散化,[30,100) 作為一個區間。當銷售額在40左右浮動時,並不會影響它離散化後的特徵的值。但是處於區間連接處的值要小心處理,另外如何劃分區間也是需要仔細處理

2.特徵離散化簡化了邏輯回歸模型,同時降低模型過擬合的風險

能夠對抗過擬合的原因:經過特徵離散化之後,模型不再擬合特徵的具體值,而是擬合特徵的某個概念。因此能夠對抗數據的擾動,更具有魯棒性

另外它使得模型要擬合的值大幅度降低,也降低了模型的複雜度


小結

特徵縮放是非常常用的方法,特別是歸一化處理特徵數據,對於利用梯度下降來訓練學習模型參數的演算法,有助於提高訓練收斂的速度;而特徵編碼,特別是獨熱編碼,也常用於對結構化數據的數據預處理。


參考:

  • 《百面機器學習》第一章 特徵工程
  • blog.csdn.net/dream_ang
  • cnblogs.com/sherial/arc
  • gofisher.github.io/2018
  • gofisher.github.io/2018
  • juejin.im/post/5b6a44f5
  • zhihu.com/question/4771
  • huaxiaozhuan.com/%E7%BB

歡迎關注我的微信公眾號--機器學習與計算機視覺,或者掃描下方的二維碼,大家一起交流,學習和進步!

往期精彩推薦

機器學習系列

  • 機器學習入門系列(1)--機器學習概覽
  • 機器學習入門系列(2)--如何構建一個完整的機器學習項目(一)
  • 機器學習數據集的獲取和測試集的構建方法
  • 特徵工程之數據預處理(上)
  • 特徵工程之數據預處理(下)

數學學習筆記

  • 程序員的數學筆記1--進位轉換
  • 程序員的數學筆記2--餘數
  • 程序員的數學筆記3--迭代法

Github項目 & 資源教程推薦

  • [Github 項目推薦] 一個更好閱讀和查找論文的網站
  • [資源分享] TensorFlow 官方中文版教程來了
  • 必讀的AI和深度學習博客
  • [教程]一份簡單易懂的 TensorFlow 教程
  • [資源]推薦一些Python書籍和教程,入門和進階的都有!

推薦閱讀:

相關文章