特徵工程(一)數據預處理

來源:機器學習AI算法工程  公衆號: datayx

 

1、二值化

當某個特徵數據分佈偏態明顯時(如下圖:99%的數據爲24以內,最大值達到9667),將數據做二值化處理,如:將小於1的數據記爲0,將大於1的數據記爲1。

2、固定寬度裝箱

對於固定寬度裝箱, 每個 bin 都包含一個特定的數值範圍。範圍可以是定製設計或自動分割, 它們可以線性縮放或指數縮放。例如, 我們可以將一個人的年齡分組爲十年: 0-9 歲歸納到bin 1, 10-19 年歸納到 bin 2 等。要從計數映射到 bin, 只需除以 bin 的寬度並取整部分。

也經常看到定製設計的年齡範圍更適合於生活的階段:

  • 0-12 歲

  • 12-17 歲

  • 18-24 歲

  • 25-34 歲

  • 35-44 歲

  • 45-54 歲

  • 55-64 歲

  • 65-74 歲

  • 75 歲以上

當數字跨越多個數量級時,最好用10個冪(或任何常數的冪)來分組:0-9、10-99、100-999、100-9999等。容器寬度呈指數增長,從O(10)、O(100)到O(1000)和以上。要從計數映射到bin,取計數的log值。指數寬度的劃分與對數變換非常相關,我們在“對數變換”中討論。

import numpy as np
small_counts = np.random.randint(0,100,20)
small_counts

array([89, 25, 56, 10, 18, 72, 68, 36, 88,  1, 28, 44,  8, 51, 11, 20, 85,
       38,  2, 10])

# 除以10再取整
np.floor_divide(small_counts,10)

array([8, 2, 5, 1, 1, 7, 6, 3, 8, 0, 2, 4, 0, 5, 1, 2, 8, 3, 0, 1],
      dtype=int32)

# 取對數取整
large_counts = [1223,3443,2342,4534,2213,4442,1000,3333]
np.floor(np.log10(large_counts))

採用pd.cut()等間距分箱

cut將根據值本身來選擇箱子均勻間隔,即每個箱子的間距都是相同的

傳入bins參數

>>> pd.cut(factors, 3) #返回每個數對應的分組

[(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]]

Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]]


>>> pd.cut(factors, bins=[-3,-2,-1,0,1,2,3])

[(2, 3], (0, 1], (1, 2], (-1, 0], (-3, -2], (2, 3], (-1, 0], (0, 1], (1, 2]]

Categories (6, interval[int64]): [(-3, -2] < (-2, -1] < (-1, 0] < (0, 1] (1, 2] < (2, 3]]


>>> pd.cut(factors, 3).value_counts() #計算每個分組中含有的數的數量

Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]]

(-2.117, -0.69] 1

(-0.69, 0.732] 4

(0.732, 2.154] 4
  1.  

傳入lable參數

>>> pd.cut(factors, 3,labels=["a","b","c"]) #返回每個數對應的分組,但分組名稱由label指示

[c, b, c, b, a, c, b, b, c]

Categories (3, object): [a < b < c]


>>> pd.cut(factors, 3,labels=False) #返回每個數對應的分組,但僅顯示分組下標

[2 1 2 1 0 2 1 1 2]

 

傳入retbins參數

>>> pd.cut(factors, 3,retbins=True)# 返回每個數對應的分組,且額外返回bins,即每個邊界值

([(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]]

Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]], array([-2.11664951, -0.69018126, 0.7320204 , 2.15422205]))
參數 說明
x array,僅能使用一維數組
bins integer或sequence of scalars,指示劃分的組數或指定組距
labels array或bool,默認爲None。當傳入數組時,分組的名稱由label指示;當傳入Flase時,僅顯示分組下標
retbins bool,是否返回bins,默認爲False。當傳入True時,額外返回bins,即每個邊界值。
precision int,精度,默認爲3

 

3、分位數分箱

固定寬度裝箱很容易計算。但是如果計數有很大的差距, 那麼將會有許多空的垃圾箱沒有數據。該問題可以通過基於數據分佈的垃圾箱自適應定位來解決。這可以使用分發的分位數來完成。

分位數是將數據劃分爲相等部分的值。例如, 中位數將數據分成一半;一半的數據是較小的, 一半大於中位數。分位數把數據分成幾個部分, 十分位數把數據劃分成十份。

爲了計算分位數和映射數據到分位數箱,我們可以使用 Pandas 庫。 pandas.DataFrame.quantile 和 pandas.Series.quantile 用於計算分位數。pandas.qcut將數據映射到所需數量的分位數。

>>> factors = np.random.randn(9)

[ 2.12046097 0.24486218 1.64494175 -0.27307614 -2.11238291 2.15422205 -0.46832859 0.16444572 1.52536248]

pd.qcut()

qcut是根據這些值的頻率來選擇箱子的均勻間隔,即每個箱子中含有的數的數量是相同的

傳入q參數


>>> pd.qcut(factors, 3) #返回每個數對應的分組

[(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]]

Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154]]


>>> pd.qcut(factors, 3).value_counts() #計算每個分組中含有的數的數量

(-2.113, -0.158] 3

(-0.158, 1.525] 3

(1.525, 2.154] 3

傳入lable參數

>>> pd.qcut(factors, 3,labels=["a","b","c"]) #返回每個數對應的分組,但分組名稱由label指示

[c, b, c, a, a, c, a, b, b]

Categories (3, object): [a < b < c]


>>> pd.qcut(factors, 3,labels=False) #返回每個數對應的分組,但僅顯示分組下標

[2 1 2 0 0 2 0 1 1]

傳入retbins參數

>>> pd.qcut(factors, 3,retbins=True)# 返回每個數對應的分組,且額外返回bins,即每個邊界值

[(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]]

Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154],array([-2.113, -0.158 , 1.525, 2.154]))

 

參數 說明
x ndarray或Series
q integer,指示劃分的組數
labels array或bool,默認爲None。當傳入數組時,分組的名稱由label指示;當傳入Flase時,僅顯示分組下標
retbins bool,是否返回bins,默認爲False。當傳入True時,額外返回bins,即每個邊界值。
precision int,精度,默認爲3

4、對數轉換 

例子2-8。使用對數轉換 YELP 評論數預測平均商戶評級

 

從實驗的結果來看, 兩個簡單的模型 (有對數變換和沒有對數變換) 在預測目標時同樣不好, 而有對數變換的特徵表現略差。真令人失望!這並不奇怪, 他們都不是很好, 因爲他們都只使用一個功能。但是, 人們本來希望日誌轉換的功能執行得更好。

讓我們看看對數轉換在線新聞流行數據集上如何表現。

例子2-9。利用經過對數轉換在線新聞數據中的詞數量預測文章流行度

 

置信區間仍然重疊,但具有對數變換特徵的模型比沒有對數變換的表現更好。爲什麼對數轉換在這個數據集上更成功?我們可以通過觀察輸入特徵和目標值的散點圖來得到線索。如圖2-9的底部面板所示,對數變換重塑了X軸,將目標值(大於200000個份額)中的大離羣值進一步拉向軸的右手側。這給線性模型在輸入特徵空間的低端更多的“呼吸空間”。沒有對數轉換(上部面板),在輸入值變化下非常小的情況下,模型有更大的壓力下適應非常不同的目標值。

示例2-10。可視化新聞流程度預測問題中輸入輸出相關性。

 

 

Scatter plot of number of words (input) vs. number of shares (target) in the Online News dataset. The top plot visualizes the original feature, and the bottom plot shows the scatter plot after log transformation.

將此與應用於YELP評論數據集的相同散點圖進行比較。圖2-10看起來與圖2-9非常不同。在1到5,步長0.5的區間,平均星級是離散的。高評論計數(大致>2500評論)與較高的平均星級評級相關。但這種關係遠不是線性的。沒有一種清晰的方法可以根據輸入來預測平均星級。從本質上講,該圖表明,評論數及其對數都是平均星級的不良線性預測因子。

例2-11。可視化 Yelp 商戶評論預測中輸入與輸出的相關性。

5、Box-cox變換

功率變換:對數變換的推廣

 

A rough illustration of the Poisson distribution. λ represents the mean of the distribution. As λ increases, not only does the mode of of the distribution shift to the right, but the mass spreads out and the variance becomes larger. The Poisson distribution is an example distribution where the variance increases along with the mean.

 

 

Box-Cox transforms for different values of λ.

只有當數據爲正值時, Box-Cox 公式才能工作。對於非正數據, 可以通過加上固定常量來移動數值。當應用 Box-Cox 變換或更一般的功率變換時, 我們必須確定參數 λ 的值。這可能是通過最大似然(找到的λ,使產生的變換信號的高斯似然最大) 或貝葉斯方法。完全介紹 Box-Cox 和一般功率變換的使用超出了本書的範圍。感興趣的讀者可以通過 Jack Johnston 和John DiNardo (McGraw Hill) 編寫的Econometric Methods 找到更多關於冪轉換的信息。幸運的是, Scipy 的數據包包含了一個 Box-Cox 轉換的實現, 其中包括查找最佳變換參數。

例子2-12。Yelp商戶評論數的 Box-Cox 變換。

提供了原始和轉換評論數分佈的可視化比較。

 

例2-13。可視化評論數的原始、對數轉換和 Box-Cox 轉換的直方圖。

 

 

 

Box-Cox transformation of Yelp business review counts.

概率圖是一種直觀地比較數據分佈與理論分佈的簡單方法。這本質上是觀察到散點圖的與理論分位數。圖2-14顯示YELP評論數的原始數據和轉換後數據相對正態分佈的概率圖。由於觀測數據是嚴格正的,高斯可以是負的,所以分位數在負端上永遠不會匹配。所以我們關注的是正數這的一邊。在這方面,原始評論數明顯比正常分佈更重尾。(有序值上升到4000,而理論位數僅延伸到4)。簡單的對數變換和最優的 Box-Cox 變換都使正尾部接近正態分佈。最優的 Box-Cox 變換比對數變換更縮小尾部,由於尾部在紅色對角線等值線下平展可以明顯看出。

例子 2-14。原始和變換後的數據相對正態分佈的概率圖。

 

Comparing the distribution of raw and transformed review counts against the Normal distribution.

 

 

6、特徵縮放與歸一化

某些特徵的值有界的,如緯度或經度。其他數值特徵 (如數量) 可能會在無界的情況下增加。那些關於輸入是平滑函數的模型, 如線性迴歸、邏輯迴歸或任何涉及矩陣的東西, 都受輸入的數值範圍影響。另一方面, 基於樹的模型不太在意這個。如果你的模型對輸入特徵的數值範圍敏感, 則特徵縮放可能會有所幫助。顧名思義, 特徵縮放會更改特徵值的數值範圍。有時人們也稱它爲特徵規範化。功能縮放通常分別針對單個特徵進行。有幾種常見的縮放操作, 每個類型都產生不同的特徵值分佈。

Min-max縮放

設X是一個單獨的特徵值(即,在某些數據點中的一個特徵值),以及 min(x) 和 max(x) ,分別是整個數據集上該特徵的最小值和最大值。Min-max縮放壓縮(或拉伸)所有特徵值到[0, 1 ]的範圍內。圖2-15演示了這個概念。最小最大尺度的公式是

 

減去特徵 (所有數據點) 的平均值併除以方差。因此, 它也可以稱爲方差縮放。縮放後的特徵的平均值爲0, 方差爲1。如果原始特徵具有高斯分佈, 則縮放特徵爲標準高斯。圖2-16 包含了標準化的說明。

 

 

Illustration of feature standardization

不要中心化稀疏數據

最小最大縮放和標準化都從原始特徵值中減去一個數量。對於最小最大縮放, 移動量是當前特徵的所有值中最小的。對於標準化, 移動的量是平均值。如果移動量不是零, 則這兩種轉換可以將稀疏特徵(大部分值爲零)的向量轉換爲一個稠密的向量。這反過來會給分類器帶來巨大的計算負擔, 取決於它是如何實現的。詞袋是一種稀疏表示, 大多數分類庫都對稀疏輸入進行優化。如果現在的表示形式包含了文檔中沒有出現的每個單詞, 那就太可怕了。請謹慎對稀疏特徵執行最小最大縮放和標準化操作。

L2 normalization

這項技術通過所謂的 L2 範數 (也稱爲歐幾里德範數) 正常化 (劃分) 原始特徵值。

Illustration of L2 feature normalization

 

數據空間與特徵空間

請注意,圖2-17中的說明是在數據空間中,而不是特徵空間。還可以對數據點進行L2歸一化,而不是特徵,這將導致具有單位範數(範數爲1)的數據向量。不管縮放方法如何,特徵縮放總是將特徵除以常數(也稱爲歸一化常數)。因此,它不會改變單特徵分佈的形狀。我們將用在線新聞文章標記計數來說明這一點。

例子 2-15。特徵縮放示例。

 

我們也可以可視化用不同的特徵縮放方法後的數據的分佈。如圖2-18所示,與對數變換不同,特徵縮放不會改變分佈的形狀;只有數據的規模發生變化。

例2-16。繪製原始數據和縮放數據的直方圖。

 

 

Original and scaled news article word counts. Note that only the scale of the x-axis changes; the shape of the distribution stays the same with feature scaling.

在一組輸入特徵在比例上差異很大的情況下,特徵縮放非常有用。例如,一個流行的電子商務網站的每日訪問者數量可能是十萬,而實際銷售額可能是幾千。如果這兩種功能都投入到模型中,那麼該模型需要在確定要做什麼的同時平衡它們的規模。輸入特徵的極大變化會導致模型訓練算法的數值穩定性問題。在這些情況下,標準化功能是個好主意。第4章將詳細介紹處理自然文本時的特徵縮放,包括使用示例。

交互特徵

簡單的成對交互特徵是兩個特徵的積。類似邏輯與。它以成對條件表示結果:“購買來自郵政編碼98121”和“用戶的年齡在18到35之間”。這一點對基於決策樹的模型沒有影響,但發交互特徵對廣義線性模型通常很有幫助。

這使我們能夠捕獲特徵之間的相互影響,因此它們被稱爲交互特徵。如果x1和x2是二元的,那麼它們的積 x1x2 是邏輯函數 x1 AND x2 假設問題是根據他或她的個人資料信息預測客戶的偏好。在這種情況下,交互特徵不是僅基於用戶的年齡或位置進行預測,而交互特徵允許模型基於具有特定年齡和特定位置的用戶進行預測。

在例2-17中,我們使用 UCI 在線新聞數據集中的成對交互特徵來預測每篇新聞文章的分享數量。交互特徵導致精度超過單身特徵。兩者都比例2-9表現得更好,它使用文章正文中單詞數的單個預測器(有或沒有經過對數變換)。

例子 2--17。用於預測的交互特徵示例。

 

構造交互特徵非常簡單,但它們使用起來很昂貴。使用成對交互特徵的線性模型的訓練和得分時間將從O(n)到O(n2),其中n是單身特徵的數量。

圍繞高階交互特徵的計算成本有幾種方法。可以在所有交互特徵之上執行特徵選擇,選擇前幾個。或者,可以更仔細地製作更少數量的複雜特徵。兩種策略都有其優點和缺點。特徵選擇採用計算手段來選擇問題的最佳特徵。(這種技術不限於交互特徵。)一些特徵選擇技術仍然需要訓練多個具有大量特徵的模型。

手工製作的複雜特徵可以具有足夠的表現力,所以只需要少量這些特徵,這可以縮短模型的訓練時間。但是特徵本身的計算可能很昂貴,這增加了模型評分階段的計算成本。手工製作(或機器學習)的複雜特徵的好例子可以在第8章有關圖像特徵中找到。現在讓我們看看一些特徵選擇技巧。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章