1. 程式人生 > >連續特徵離散化的方法

連續特徵離散化的方法

在工業界,很少直接將連續值作為邏輯迴歸模型的特徵輸入,而是將連續特徵離散化為一系列0、1特徵交給邏輯迴歸模型,這樣做的優勢有以下幾點:

0. 離散特徵的增加和減少都很容易,易於模型的快速迭代;

1. 稀疏向量內積乘法運算速度快,計算結果方便儲存,容易擴充套件;

2. 離散化後的特徵對異常資料有很強的魯棒性:比如一個特徵是年齡>30是1,否則0。如果特徵沒有離散化,一個異常資料“年齡300歲”會給模型造成很大的干擾;

3. 邏輯迴歸屬於廣義線性模型,表達能力受限;單變數離散化為N個後,每個變數有單獨的權重,相當於為模型引入了非線性,能夠提升模型表達能力,加大擬合;

4. 離散化後可以進行特徵交叉,由M+N個變數變為M*N個變數,進一步引入非線性,提升表達能力;

5. 特徵離散化後,模型會更穩定,比如如果對使用者年齡離散化,20-30作為一個區間,不會因為一個使用者年齡長了一歲就變成一個完全不同的人。當然處於區間相鄰處的樣本會剛好相反,所以怎麼劃分區間是門學問;

6. 特徵離散化以後,起到了簡化了邏輯迴歸模型的作用,降低了模型過擬合的風險。

李沐曾經說過:模型是使用離散特徵還是連續特徵,其實是一個“海量離散特徵+簡單模型” 同 “少量連續特徵+複雜模型”的權衡。既可以離散化用線性模型,也可以用連續特徵加深度學習。就看是喜歡折騰特徵還是折騰模型了。通常來說,前者容易,而且可以n個人一起並行做,有成功經驗;後者目前看很贊,能走多遠還須拭目以待。

查看了一些連續特徵離散化的綜述論文後我選擇了一些方法做說明,連續特徵離散化主要分為有監督方法與無監督方法

1.無監督方法

無監督方法都具有的問題就是都需要認為規定劃分區間這個引數,常用的方法有分箱法和直觀劃分,首先來說一下分箱法:

分箱法又分為等寬分箱法和等頻分箱法,其實從名字就能看出演算法的做法了,前者制定定長的間隔將特徵放入不同箱子內,後者根據頻率劃分箱子,這兩種做法都有一定的缺陷。等寬分箱法對異常點比較敏感,比如資料正常範圍是30-60,現在出現了一個特徵本來是30不小心讀取成了300,那麼寬度會被拉長,例項就主要集中在前面的箱體中,後面的箱體幾乎沒有例項,解決的方法主要是設立閾值移除閾值以外的例項。等頻分箱法的缺陷是完全按照頻率劃分會出現例項特徵相同卻不在同一個箱體內的情況,解決辦法也很簡單,在劃分完成後進行微調就可完成。

直觀劃分法感覺就沒什麼技術了,這個演算法主要是根據經驗和美觀,常用的方法劃分出來肯定都是34267、64537這樣的數,但是人們一般都習慣看到30000、50000這樣的數,然後就是加上個人對資料的瞭解人為劃分。

個人感覺無監督方法的連續特徵離散化並不是很靠譜,原因就是不知道設計的目的單純考慮離散化對結果是更好還是更差這個不確定性太大了。

2.有監督方法

1R方法:這個方法是分箱法的有監督版本,把前6個例項放入箱子中,然後後面例項放入箱子時,對比當前例項標籤與箱子中大部分例項標籤是否相同,如果相同放入,如果不相同,那麼形成下一個6例項的新箱子,等到最後全部放入箱子中,將箱子中大多數例項標籤作為箱子的標籤,再將標籤相同的箱子合併

基於卡方的離散方法:首先將數值特徵的每個不同值看做一個區間對每對相鄰區間計算卡方統計量,如果大於閾值就合併,遞迴進行直到找不到卡方統計大於閾值的時候停止

卡方計算方法 http://www.cnblogs.com/emanlee/archive/2008/10/25/1319569.html

基於熵的離散方法:其實就是照搬了決策樹的思路,使用合成的方法或者分裂的方法根據熵計算和閾值判定來決定合成或分裂,上一段合成的程式碼

import numpy as np  
  
  
class Feature_Discretization(object):  
      
    def __init__(self):  
          
        self.min_interval = 1   #最小間隔
        self.min_epos = 0.05    #資訊增益閾值
        self.final_bin = []     #最終邊界
          
      
    def fit(self, x, y, min_interval = 1):  
        self.min_interval = min_interval  
        x = np.floor(x)  
        x = np.int32(x)  
        min_val = np.min(x)  
        bin_dict = {}  
        bin_li = []  
        for i in range(len(x)):  
            pos = (x[i] - min_val)/min_interval * min_interval  + min_val  
            target = y[i]  
            bin_dict.setdefault(pos,[0,0])             
            if target == 1:  
                bin_dict[pos][0] += 1                  
            else:  
                bin_dict[pos][1] += 1      #標籤one-hot的操作
          
        for key ,val in bin_dict.iteritems():  
            t = [key]  
            t.extend(val)  
            bin_li.append(t)  
          
        bin_li.sort(cmp=None, key=lambda x : x[0], reverse=False)  
        print bin_li  
              
       
        L_index = 0   
        R_index = 1  
        self.final_bin.append(bin_li[L_index][0])  
        while True:             
            L = bin_li[L_index]              
            R = bin_li[R_index]  
            # using infomation gain;  
            p1 =  L[1]/ (L[1] + L[2] + 0.0)  
            p0 =  L[2]/ (L[1] + L[2] + 0.0)  
              
            if p1 <= 1e-5 or p0 <= 1e-5:  
                LGain = 0   
            else:  
                LGain = -p1*np.log(p1) - p0 * np.log(p0)  
              
            p1 =  R[1]/ (R[1] + R[2] + 0.0)  
            p0 =  R[2]/ (R[1] + R[2] + 0.0)  
            if p1 <= 1e-5 or p0 <= 1e-5:  
                RGain = 0   
            else:  
                RGain = -p1*np.log(p1) - p0 * np.log(p0)  
              
            p1 = (L[1] + R[1])/ (L[1] + L[2] + R[1] + R[2] + 0.0)  
            p0 = (L[2] + R[2])/ (L[1] + L[2] + R[1] + R[2] + 0.0)  
              
            if p1 <= 1e-5 or p0 <= 1e-5:  
                ALLGain = 0   
            else:  
                ALLGain = -p1*np.log(p1) - p0 * np.log(p0)  
              
            if np.absolute(ALLGain - LGain - RGain) <= self.min_epos:  #根據資訊增益判定是否合成
                # concat the interval;  
                bin_li[L_index][1] += R[1]  
                bin_li[L_index][2] += R[2]  
                R_index += 1  
              
            else:                  
                L_index = R_index  
                R_index = L_index + 1  
                self.final_bin.append(bin_li[L_index][0])  
              
            if R_index >= len(bin_li):  
                break  
          
        print 'feature bin:',self.final_bin  
          
      
    def transform(self,x):  
        res = []  
        for e in x:  
            index = self.get_Discretization_index(self.final_bin, e)  
            res.append(index)  
          
        res = np.asarray(res)  
        return res  
      
    def get_Discretization_index(self ,Discretization_vals, val ):     
        index = -1  
        for i in range(len(Discretization_vals)):  
            e = Discretization_vals[i]  
            if val <= e:  
                index = i              
                break  
                      
        return index  


相關推薦

連續特徵離散方法介紹

1. 離散化技術分類 連續屬性的離散化方法也可以被稱為分箱法,即將一組連續的值根據一定的規則分別放到其術語的集合中。  離散化技術可以根據如何對資料進行離散化加以分類,可以根據是否使用類資訊或根據進行方向(即自頂向下或自底向上)分類。  如果離散化過程使用類

連續特徵離散方法

在工業界,很少直接將連續值作為邏輯迴歸模型的特徵輸入,而是將連續特徵離散化為一系列0、1特徵交給邏輯迴歸模型,這樣做的優勢有以下幾點: 0. 離散特徵的增加和減少都很容易,易於模型的快速迭代; 1. 稀疏向量內積乘法運算速度快,計算結果方便儲存,容易擴充套件; 2. 離散化後的特徵對異常資料有很強的魯棒性:

#####好好好#####特徵離散方法綜述

特徵離散化系列一方法綜述 數值離散化在資料探勘和發現知識(data mining and knowledge discovery)方面扮演者重要的角色。許多研究表明歸納任務(induction tasks)能從離散化(discretization)中獲益:有離散值的規則通

常用特徵離散方法

1規定劃分區間的引數,取定長的間隔將特徵放入不同的箱子中,這種方法對異常點比較敏感。,2 根據頻率劃分箱子,會出現特徵相同卻不在一個箱子中的情況,需要在劃分完成後進行微調。先對特徵值進行sort,然後評估分割點,劃分或者合併3 1R方法:將前面的m個例項放入箱子中如果後面例項

連續特徵離散和歸一

RT,尤其在logistic regression上,需要把一些連續特徵進行離散化處理。離散化除了一些計算方面等等好處,還可以引入非線性特性,也可以很方便的做cross-feature。 連續特徵離散化處理有什麼好的方法, 有時候為什麼不直接歸一化? 這裡主要說明監督的變換

特徵離散特徵交叉,連續特徵離散

一.網際網路廣告特徵工程 可以看到,其中的logistic regression模型是比較簡單而且實用的,其訓練方法雖然有多種,但目標是一致的,訓練結果對效果的影響是比較大,但是訓練方法本身,對效果的影響卻不是決定性的,因為訓練的是每個特徵的權重,權重細微的差別不會引起ctr的巨大變化。 在訓練方法

為什麼要將連續特徵離散

在工業界,很少直接將連續值作為邏輯迴歸模型的特徵輸入,而是將連續特徵離散化為一系列0、1特徵交給邏輯迴歸模型,這樣做的優勢有以下幾點: 0. 離散特徵的增加和減少都很容易,易於模型的快速迭代; 1. 稀疏向量內積乘法運算速度快,計算結果方便儲存,容易擴充套件; 2. 離散化後的特徵對異常資料有很強的魯棒性:比

連續系統的離散方法

  一、數值積分演算法     1.前向差分(顯式尤拉法)     使用前向差分代替導數

特徵離散系列(一)方法綜述

特徵離散化系列一方法綜述 數值離散化在資料探勘和發現知識(data mining and knowledge discovery)方面扮演者重要的角色。許多研究表明歸納任務(induction tasks)能從離散化(discretization)中獲益:

連續系統離散方法

http://www.docin.com/DocinViewer-1404447028-144.swf 5.2.1  連續系統離散化方法 1、反向差分變換法 對於給定的                                                (5.

python大資料分析——連續屬性離散

1.過程 連續屬性的離散化就是在數值的取值範圍內設定若干點離散的劃分點,劃分區間,然後用不同的符號去表示落在每個子區間的資料值。 離散化涉及兩個任務,確定分類數以及將連續屬性值對映到這些分類值。 2.方法 (1)等寬法 將屬性的值域分成具有相同寬度的區間; (2)等頻法

Weka中的有監督的離散方法

對應分析Weka中weka.filters.supervised.attribute.Discretize 涉及的其他類包括weka.filters.Filter 分析的巨集觀程式碼 Disc

機器學習 特徵工程 特徵離散

如果想深入研究特徵離散化,請直接閱讀博文最後的英文文獻,以免浪費您的時間! 一、什麼是特徵離散化 簡單的說,就是把連續特徵分段,每一段內的原始連續特徵無差別的看成同一個新特徵 二、為什麼進行離散化 1、離散化的特徵更易於理解 2、離散化的特徵能夠提高模

基於資訊增益的離散方法

class Feature_Discretization(object): def __init__(self): self.min_interval = 1 # 最小間隔 self.min_epos = 0.05 # 資訊增益

特徵工程--特徵離散的意義

連續特徵的離散化:在什麼情況下將連續的特徵離散化之後可以獲得更好的效果? Q:CTR預估,發現CTR預估一般都是用LR,而且特徵都是離散的。為什麼一定要用離散特徵呢?這樣做的好處在哪裡? A: 在工業界,很少直接將連續值作為邏輯迴歸模型的特徵輸入,而是將連續特徵離散化為一系列0、1特徵交給邏輯迴歸模

Python連續資料離散處理和pandas.cut函式用法

連續資料離散化場景: 資料分析和統計的預處理階段,經常的會碰到年齡、消費等連續型數值,我們希望將數值進行離散化分段統計,提高資料區分度,那麼下面介紹一個簡單使用的pandas中的 cut() 方法 函式用法: **cut(series, bins, right=True, lab

連續資料離散

#資料規範化 import pandas as pd datafile = 'eeeee/chapter4/demo/data/discretization_data.xls' #引數初始化 data

資料預處理-資料變換-連續屬性離散實現:pandas(0.23)+sklearn(0.19.1)+matplotlib(2.2.2)

程式碼來源:Python資料分析與挖掘實戰 原始碼有如下錯誤: line22: 原: data.reshape      修改後:  data.values.reshape line23: 原: s

連續特徵進行離散方法介紹與應用例子

RT,尤其在logistic regression上,需要把一些連續特徵進行離散化處理。離散化除了一些計算方面等等好處,還可以引入非線性特性,也可以很方便的做cross-feature。 連續特徵離散化處理有什麼好的方法, 有時候為什麼不直接歸一化? 這裡主要說明監督

面經之連續特徵離散的好處

在特徵工程中,我們常常需要對連續型特徵進行離散化處理,那麼這麼做有什麼好處呢?下面做簡單的總結: 1.離散特徵的增加和減少都很容易,易於模型的快速迭代; 2.係數矩陣內機乘法運算速度更快,計算結果方便儲存,易於擴充套件; 3.離散化後的特徵對異常資料有很強的魯棒性。比如