特徵工程-數據處理

特徵工程

  • 連續型變量
    • 連續變量無量綱化
    • 連續變量數據變換
    • 連續變量離散化
  • 類別變量
  • 時間型、日期型變量
  • 缺失值處理
  • 特徵組合

連續型變量處理

什麼是連續型變量?

在一定區間內可以任意取值的變量叫連續變量,其數值是連續不斷的,相鄰兩個數值可作無限分割,即可取無限個數值.例如,生產零件的規格尺寸,人體測量的身高,體重,胸圍等爲連續變量,其數值只能用測量或計量的方法取得.

連續變量無量綱化

統一數據單位,消除數據間由於量綱帶來的差異,使數據量級儘量保持在相同範圍內。這樣,表徵不同屬性(單位不同)的各特徵之間纔有可比性.

無量綱化方法:標準化、歸一化、正則化,區間縮放法

標準化

數據的標準化是將數據按比例縮放,使之落入一個小的特定區間。

  1. z-score標準化(零-均值標準化),經過處理後的數據均值爲0,標準差爲1。處理方法是:

x′=(x−μ)/σ
x是原始數據,u是樣本均值,σ是樣本標準差。

均值爲0會使數據以0爲中心左右分,標準差爲1有什麼好處呢?http://www.cnblogs.com/zhaokui/p/5112287.html

  1. 小數定標標準化

y=x/10^j (j確保max(|y|<1),通過移動x的小數位置進行標準化

  1. 對數Logistic模式

y=1/(1+e^(-x))

歸一化

min-max歸一化,該方法是對原始數據進行線性變換,將其映射到[0,1]之間。變換函數爲
x′=(x−min)/(max−min)
min是樣本的最小值,max是樣本的最大值。由於最大值與最小值可能是動態變化的,同時也非常容易受噪聲(異常點、離羣點)影響,因此一般適合小數據的場景。此外,該方法還有兩點好處:

  1. 如果某屬性/特徵的方差很小,如身高:np.array([[1.70],[1.71],[1.72],[1.70],[1.73]]),實際5條數據在身高這個特徵上是有差異的,但是卻很微弱,這樣不利於模型的學習,進行min-max歸一化後爲:array([[ 0. ], [ 0.33333333], [ 0.66666667], [ 0. ], [ 1. ]]),相當於放大了差異;
  2. 維持稀疏矩陣中爲0的條目。
  • 歸一化的其他方法:
    • 對數轉化
      y=log10(x)
    • 反餘切函數轉換
      y=atan(x)*2/PI

正則化

正則化的過程是將每個樣本縮放到單位範數(每個樣本單位範數爲1),如果後面要使用如二次型(點積)或者其他核方法(核方法是一類模式識別的算法,其目的是找出並學習一組數據中的相互關係)計算兩個樣本之間的相似。
normalization主要思想是對每個樣本計算p-範數,然後對樣本中每個元素除以該範數,這樣處理的結果是使得每個處理後樣本的p-範數等於1。
p-範數的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p
該方法主要應用於文本分類和聚類中。
在sklearn中有三種正則化方法,l1範數、l2範數、max範數

區間縮放法

區間縮放法的思路有多種,常見的一種爲利用兩個最值進行縮放,公式表達爲:
x′=(x−min)/(max−min)

連續變量數據變換

連續變量數據轉換主要是通過函數變換改變原始數據的分佈。

連續變量數據轉換的目的:

  1. 便於置信區間分析或者可視化 (縮放數據, 對稱分佈)
  2. 爲了獲取更容易解釋的特徵 (獲取線性特徵)。
  3. 降低特徵數據的維度或者複雜度
  4. 方便使用簡單的迴歸模型

連續變量數據變換方法:

  • 單變量變換
    • 線性變換
    • 非線性變換
  • 多變量變換

單變量變換-線性變換

執行單變量分析的方法取決於變量類型是分類類型還是連續類型。在連續變量的情況下,我們需要了解變量的中心趨勢和分散,使用各種統計度量可視化方法進行測量。

單變量變換-非線性變換

多變量變換

雙變量分析的主要目的是發現兩個變量之間的關係。可以對分類和連續變量的任何組合執行雙變量分析。在兩個連續變量之間進行雙變量分析時,散點圖( scatter plot)是找出兩個變量之間的關係的一個很好的方式。 散點圖表示變量之間的關係可以是線性或非線性。

連續變量離散化

對連續特徵進行離散化處理,一般經過以下步驟:
(1) 對此特徵進行排序。特別是對於大數據集,排序算法的選擇要有助於節省時間,提高效率,減少離散化的整個過程的時間開支及複雜度。
(2)選擇某個點作爲候選斷點,用所選取的具體的離散化方法的尺度進行衡量此候選斷點是否滿足要求。
(3)若候選斷點滿足離散化的衡量尺度,則對數據集進行分裂或合併,再選擇下一個候選斷點,重複步驟(2)(3)
(4)當離散算法存在停止準則時,如果滿足停止準則,則不再進行離散化過程,從而得到最終的離散結果。

連續變量離散化的目的:

  1. 離散特徵的增加和減少都很容易,易於模型的快速迭代;
  2. 稀疏向量內積乘法運算速度快,計算結果方便存儲,容易擴展;
  3. 離散化後的特徵對異常數據有很強的魯棒性:比如一個特徵是年齡>30是1,否則0。如果特徵沒有離散化,一個異常數據“年齡300歲”會給模型造成很大的干擾;
  4. 邏輯回歸屬於廣義線性模型,表達能力受限,單變量離散化爲N個後,每個變量有單獨的權重,相當於爲模型引入了非線性,能夠提升模型表達能力,加大擬合;
  5. 離散化後可以進行特徵交叉,由M+N個變量變爲M*N個變量,進一步引入非線性,提升表達能力;
  6. 特徵離散化後,模型會更穩定,比如如果對用戶年齡離散化,20-30作爲一個區間,不會因爲一個用戶年齡長了一歲就變成一個完全不同的人。當然處於區間相鄰處的樣本會剛好相反;
  7. 特徵離散化以後,起到了簡化了邏輯迴歸模型的作用,降低了模型過擬合的風險。

連續變量離散化方法:

  • 無監督方法
    • 分箱法
    • 直觀劃分
  • 有監督方法
    • 1R方法
    • 基於卡方的離散方法

無監督方法-分箱法

分箱法包括等寬分箱法和等頻分箱法,它們是基本的離散化算法
分箱的方法是基於箱的指定個數自頂向下的分裂技術,在離散化的過程中不使用類信息,屬於無監督的離散化方法。在等寬或等頻劃分後,可用箱中的中位數或者平均值替換箱中的每個值,實現特徵的離散化。

自頂向下的分裂策略:即先把整個數據集當作一個區間,再逐步選出端點,對大的區間進行分裂得到小的區間

自底向上的合併策略:將數據取值範圍內的所有數據值列爲一個單獨的區間,再遞歸的找出最佳近鄰可合併的區間,然後合併他們,形成較大的區間。在判定最佳鄰近可合併的區間時,會用到卡方統計量來檢測兩個對象間的相關度。

1、等距劃分
從最小值到最大值之間,均分爲 N 等份, 這樣, 如果 A,B 爲最小最大值, 則每個區間的長度爲 W=(B−A)/N , 則區間邊界值爲A+W,A+2W,….A+(N−1)W 。這裏只考慮邊界,每個等份裏面的實例數量可能不等。

2、等頻劃分
區間的邊界值要經過選擇,使得每個區間包含大致相等的實例數量。比如說 N=10 ,每個區間應該包含大約10%的實例。

這兩種方法的弊端;
比如,等寬區間劃分,劃分爲5區間,最高工資爲50000,則所有工資低於10000的人都被劃分到同一區間。等頻區間可能正好相反,所有工資高於50000的人都會被劃分到50000這一區間中。這兩種算法都忽略了實例所屬的類型,落在正確區間裏的偶然性很大。

無監督方法-直觀劃分

根據直觀劃分離散化。爲了使所劃分的區間更加自然,規整(例如不出現大量的小數,整數位除最高位外全部爲0)。

規則:3-4-5規則。根據最高有效位的取值範圍,將區間劃分爲相對等寬的幾個3,4,或5個區間。

如果最高有效位包含3,7(2,3,2),6,9個不同的值,則劃分爲三個區間;如果包含2,4,8個不同的值,則劃分爲4個區間;如果包含1,5,10個不同的值,則劃分爲5個等寬的區間。

步驟:

  1. 根據信息的最大max最小值min確定所需考慮的最低low(第5個百分位數)和最高high值(第95個百分位數)。

  2. 根據low,high確定最高有效位的位(個位,十位,百分位。。。。),則令msd=1,10,100。。。。。然後將low,higi向下和向上取值(使區間能夠包含low,high範圍),得到新的low和high。

  3. 計算最高有效位取值的不同個數=(high-low)/msd.並根據上面的規則確定劃分區間。

  4. 向上向下兼容。如果min>low,則使low=min,否則創建新區間(min,low],在high處同樣使用此方法。

  5. 可以遞歸的使用此方法對每一個結果區間進行劃分操作。

無監督方法-聚類劃分

基於聚類分析的離散化方法也是一種無監督的離散化方法。此種方法包含兩個步驟:

首先是將某特徵的值用聚類算法(如K-means算法)通過考慮特徵值的分佈以及數據的臨近性,劃分成簇或組;然後是將聚類得到的簇進行處理,可分爲自頂向下的分裂策略和自底向上的合併策略。分裂策略是將每一個初始簇進一步分裂爲若干子簇,合併策略是通過反覆地對鄰近簇進行合併,聚類分析的離散化方法也需要用戶指定簇的個數,從而決定離散產生的區間數。

有監督方法-1R方法

1R是一種使用分箱的有監督的方法,他把連續的區間分成小的區間,然後再使用類標籤對小區間的邊界進行調整,每個區間至少包含6個實例,除了最後一個區間外,最後一個區間包含所有未被列入其他區間的實例。如果下一個實例的類標籤與此區間中大多數實例的類標籤相同,則把此實例加入區間中,否則,形成下一個新的區間,反覆操作,直至結束。把區間中大多數實例的共同標籤作爲此區間的類標籤,如果最後有相同的類標籤出現,則合併。

有監督方法-基於卡方的離散方法

卡方的離散化方法採用的是自底向上的合併策略,最常用的基於卡方的離散化方法是ChiMerge方法,是一種自動化的離散化算法。過程如下:

首先將數值特徵的每個不同值看做一個區間,對每個相鄰區間計算卡方統計量,將其與需要人爲設定置信水平參數(由統計學知識算出一個與計算量相比較的閾值)進行比較,高於閾值則把相鄰區間進行合併(高的卡方統計量表示這兩個相鄰的區間有相似的類分佈,相似類分佈的區間應該進行合併形成一個區間),合併的過程遞歸的進行,直到計算得到的卡方統計量不再大於閾值,離散化過程終止,得到最終的離散化結果。

置信水平參數設置過高會導致過分離散化,過低離散化不足。

###有監督方法-基於信息熵的方法

基於熵的離散化。是一種監督的,自頂向下的分裂技術。

該方法原理:選擇屬性A中具有最小熵的值作爲分裂點,並遞歸的劃分結果區間,直到所有候選分類點上的最小信息需求(基於熵的某個公式)小於某個閾值或者結果區間的個數大於某個閾值。其中屬性A爲D的類標號屬性。即:基於熵的離散化使用元祖的類標號信息,類標號屬性提供每個元祖的類信息。

注:這裏的熵指信息熵。是對不確定性的一種度量。信息量越大,不確定性就越小,熵也就越小;信息量越小,不確定性越大,熵也越大。根據熵的特性,我們可以通過計算熵值來判斷一個事件的隨機性及無序程度,也可以用熵值來判斷某個指標的離散程度,指標的離散程度越大,該指標對綜合評價的影響越大。

類別變量

什麼是類別型變量?

分類變量(categorical variable)是說明事物類別的一個名稱,其取值是分類數據。如“性別”就是一個分類變量,其變量值爲“男”或“女”;“行業”也是一個分類變量,其變量值可以爲“零售業”、“旅遊業”、“汽車製造 業”等。簡單來說這類變量通常都是文本類的,但是在進行建模時,python不能像R那樣去直接處理非數值型的變量,因此我們往往需要對這些類別變量進行一系列轉換,如啞變量或是獨熱編碼。例如性別這個特徵:男性人數爲x1,男性中流失人數x11,女性人數x2,女性中流失人數x22。那麼我們以x11/x1作爲男性編碼;x22/x2作爲女性編碼。

其變量值是定性的,表現爲互不相容的類別或屬性。

1. 無序分類變量

無序分類變量(unordered categorical variable)是指所分類別或屬性之間無程度和順序的差別。,它又可分爲①二項分類,如性別(男、女),藥物反應(陰性和陽性)等;②多項分類,如血型(O、A、B、AB),職業(工、農、商、學、兵)等。對於無序分類變量的分析,應先按類別分組,清點各組的觀察單位數,編制分類變量的頻數表,所得資料爲無序分類資料,亦稱計數資料。

2. 有序分類變量

有序分類變量(ordinal categorical variable)各類別之間有程度的差別。如尿糖化驗結果按-、±、+、++、+++分類;療效按治癒、顯效、好轉、無效分類。對於有序分類變量,應先按等級順序分組,清點各組的觀察單位個數,編制有序變量(各等級)的頻數表,所得資料稱爲等級資料。

變量類型不是一成不變的,根據研究目的的需要,各類變量之間可以進行轉化。例如血紅蛋白量(g/L)原屬數值變量,若按血紅蛋白正常與偏低分爲兩類時,可按二項分類資料分析;若按重度貧血、中度貧血、輕度貧血、正常、血紅蛋白增高分爲五個等級時,可按等級資料分析。有時亦可將分類資料數量化,如可將病人的噁心反應以0、1、2、3表示,則可按數值變量資料(定量資料)分析。

對類別型變量一般是進行編碼處理,使其變成數值型變量。

類別型數據編碼處理

類別型數據編碼目的:

  1. 機器學習或者深度學習算法一般無法處理類別型數據
  2. 構造新的特徵,擴充新特徵

類別型數據編碼方法:

  • one-hot encoding 獨熱編碼 ;
  • dummy encoding 啞變量編碼;
  • label-encoding 標籤編碼;
  • count-Encoding 頻數編碼 (可以去量綱化,秩序,歸一化);
  • Target encoding 目標編碼 用目標變量中的某一類的比例來編碼;

one-hot encoding 獨熱編碼

獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候,其中只有一位有效,Pandas中提供get_dummies方法可以方便的將數值轉化爲One-hot向量
例如:
自然狀態碼爲:000,001,010,011,100,101
獨熱編碼爲:000001,000010,000100,001000,010000,100000
可以這樣理解,對於每一個特徵,如果它有m個可能值,那麼經過獨熱編碼後,就變成了m個二元特徵。並且,這些特徵互斥,每次只有一個激活。因此,數據會變成稀疏的

dummy encoding 啞變量編碼

label-encoding 標籤編碼

標籤編碼直接將類別轉換爲數字。pandas.factorize提供了這一功能,或者,pandas中category類型的列提供了cat.codes。使用標籤編碼能夠保持原本的維度

count-Encoding 頻數編碼

頻數編碼使用頻次替換類別,頻次根據訓練集計算。這個方法對離羣值很敏感,所以結果可以歸一化或者轉換一下(例如使用對數變換)。未知類別可以替換爲1。

儘管可能性不是非常大,有些變量的頻次可能是一樣的,這將導致碰撞——兩個類別編碼爲相同的值。沒法說這是否會導致模型退化或者改善,不過原則上我們不希望出現這種情況。

Target encoding 目標編碼

它使用目標變量的均值編碼類別變量。我們爲訓練集中的每個分組計算目標變量的統計量(這裏是均值),之後會合並驗證集、測試集以捕捉分組和目標之間的關係。

使用目標變量時,非常重要的一點是不要泄露任何驗證集的信息。所有基於目標編碼的特徵都應該在訓練集上計算,接着僅僅合併或連接驗證集和測試集。即使驗證集中有目標變量,它不能用於任何編碼計算,否則會給出過於樂觀的驗證誤差估計。

如果使用K折交叉驗證,基於目標的特徵應該在折內計算。如果僅僅進行單次分割,那麼目標編碼應該在分開訓練集和驗證集之後進行。

此外,我們可以通過平滑避免將特定類別編碼爲0. 另一種方法是通過增加隨機噪聲避免可能的過擬合。處置妥當的情況下,無論是線性模型,還是非線性模型,目標編碼都是最佳的編碼方式

時間型、日期型變量

時間型、日期型變量處理目的:

  1. 將無法直接參與訓練的日期類型轉化爲可以參與訓練的數據
  2. 提取時間日期中的關鍵數據特徵,比如上午、下午、周幾、上旬、下旬等等

時間型、日期型變量處理方法:

  • 直接使用python的datetime庫進行日期轉換
  • 使用pandas自帶的時間處理功能提取日期型和時間型的特徵變量
  • 其他

缺失值處理

常見的數據缺失處理方法:

  • 刪除缺失值記錄
  • 缺失值替換:
    • 用0替換
    • 平均數替換
    • 衆數替換
    • 用插值法填充
    • 預測缺失值替換
    • 構造NaN encoding編碼(構造一個新的字段來標識是否有缺失(1/0),該方法在任何時候都可使用)
  • 忽略缺失值(有一些模型,如隨機森林,自身能夠處理數據缺失的情況,在這種情況下不需要對缺失數據做任何的處理,這種做法的缺點是在模型的選擇上有侷限。)

特徵組合

使用多個特徵生成一個之前不存在的新特徵。

特徵組合目的:

  1. 生成新的特徵,擴充特徵維度
  2. 通過將單獨的特徵進行組合(相乘或求笛卡爾積)而形成的合成特徵。特徵組合有助於表示非線性關係。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章