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

2021-07-11 01:49:32 字數 3898 閱讀 9888

rt,尤其在logistic regression上,需要把一些連續特徵進行離散化處理。離散化除了一些計算方面等等好處,還可以引入非線性特性,也可以很方便的做cross-feature。

連續特徵離散化處理有什麼好的方法, 有時候為什麼不直接歸一化?

這裡主要說明監督的變換方法;

連續性變數轉化成離散型變數大致有兩類方法:

(1)卡方檢驗方法;

(2)資訊增益方法;

一: 卡方檢驗方法

1.1 **方法

1.2 合併方法

**方法,就是找到乙個**點看,左右2個區間,在目標值上分布是否有顯著差異,有顯著差異就**,否則就忽略。這個點可以每次找差異最大的點。合併類似,先劃分如果很小單元區間,按順序合併在目標值上分布不顯著的相鄰區間,直到收斂。

二:資訊增益方法

2.1 **方法

2.2 合併方法

這個和決策樹的學習很類似。**方法,就是找到乙個**點看,左右2個區間,看**前後資訊增益變化閾值,如果差值超過閾值(正值,分列前-**後資訊熵),則**。每次找差值最大的點做**點,直到收斂。合併類似,先劃分如果很小單元區間,按順序合併資訊增益小於閾值的相鄰區間,直到收斂。

1 : csdn部落格:

採用資訊增益合併方法的連續特徵離散化程式:

[python]view plain

copy

import

numpy as np  

class

feature_discretization(object):  

def__init__(

self

):  

self

.min_interval = 

1self

.min_epos = 

0.05

self

.final_bin =   

deffit(

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 =   

fori 

inrange(len(x)):  

pos = (x[i] - min_val)/min_interval * min_interval  + min_val  

target = y[i]  

bin_dict.setdefault(pos,[0,0

])             

iftarget == 

1:  

bin_dict[pos][0

] += 

1else

:  bin_dict[pos][1

] += 

1for

key ,val 

inbin_dict.iteritems():  

t = [key]  

t.extend(val)  

bin_li.sort(cmp=none

, key=

lambda

x : x[

0], reverse=

false

)  print

bin_li  

l_index = 0

r_index = 1

self

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)  

ifp1 <= 1e-

5orp0 <= 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)  

ifp1 <= 1e-

5orp0 <= 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)  

ifp1 <= 1e-

5orp0 <= 1e-

5:  

allgain = 0

else

:  allgain = -p1*np.log(p1) - p0 * np.log(p0)  

ifnp.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

0])  

ifr_index >= len(bin_li):  

break

print

'feature bin:'

,self

.final_bin  

deftransform(

self

,x):  

res =   

fore 

inx:  

index = self

.get_discretization_index(

self

.final_bin, e)  

res = np.asarray(res)  

return

res  

defget_discretization_index(

self

,discretization_vals, val ):     

index = -1

fori 

inrange(len(discretization_vals)):  

e = discretization_vals[i]  

ifval <= e:  

index = i              

break

return

index 

連續特徵離散化

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

LR連續特徵離散化

1主要目的是獲得指數級的表示能力。假如乙個n維的連續向量,即使採用最簡單的每一維二值化,也會得到2 n種特徵組合。這種表示方法對lr這種線性分類器是十分關鍵的。在超高維的特徵空間中,很多問題就都變為線性可分問題,從而可以極大提高分類器的能力。總之就是增強了特徵的表達能力,或者說更容易線性可分。2離散...

為什麼要將連續特徵離散化

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