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
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
'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.離散化後的特徵對異常資料有很強的魯棒性 比如...