【點擊領取】阿里雲代金券 | 阿里雲優惠券 |阿里雲優惠碼|雲服務器|阿里雲|阿里雲代金券 – 限時領取1888元阿里雲代金券
html
【3折購買ECS服務器入口】https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=t9686fzw
bash
【9塊9雲服務 學生計劃】https://promotion.aliyun.com/ntms/act/campus2018.html?userCode=g6nivc1v服務器
RT,尤爲在logistic regression上,須要把一些連續特徵進行離散化處理。離散化除了一些計算方面等等好處,還能夠引入非線性特性,也能夠很方便的作cross-feature。app
連續特徵離散化處理有什麼好的方法, 有時候爲何不直接歸一化?學習
這裏主要說明監督的變換方法;ui
連續性變量轉化成離散型變量大體有兩類方法:阿里雲
(1)卡方檢驗方法;spa
(2)信息增益方法;code
一: 卡方檢驗方法orm
1.1 分裂方法
1.2 合併方法
分裂方法,就是找到一個分裂點看,左右2個區間,在目標值上分佈是否有顯著差別,有顯著差別就分裂,不然就忽略。這個點能夠每次找差別最大的點。合併相似,先劃分若是很小單元區間,按順序合併在目標值上分佈不顯著的相鄰區間,直到收斂。
二:信息增益方法
2.1 分裂方法
2.2 合併方法
這個和決策樹的學習很相似。分裂方法,就是找到一個分裂點看,左右2個區間,看分裂先後信息增益變化閾值,若是差值超過閾值(正值,分列前-分裂後信息熵),則分裂。每次找差值最大的點作分裂點,直到收斂。合併相似,先劃分若是很小單元區間,按順序合併信息增益小於閾值的相鄰區間,直到收斂。
''' Created on 2014/12/12 @author: dylanfan '''
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
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
複製代碼