連續特徵離散化和歸一化
RT,尤其在logistic regression上,需要把一些連續特徵進行離散化處理。離散化除了一些計算方面等等好處,還可以引入非線性特性,也可以很方便的做cross-feature。
連續特徵離散化處理有什麼好的方法, 有時候為什麼不直接歸一化?
這裡主要說明監督的變換方法;
連續性變數轉化成離散型變數大致有兩類方法:
(1)卡方檢驗方法;
(2)資訊增益方法;
一: 卡方檢驗方法
1.1 分裂方法
1.2 合併方法
分裂方法,就是找到一個分裂點看,左右2個區間,在目標值上分佈是否有顯著差異,有顯著差異就分裂,否則就忽略。這個點可以每次找差異最大的點。合併類似,先劃分如果很小單元區間,按順序合併在目標值上分佈不顯著的相鄰區間,直到收斂。
二:資訊增益方法
2.1 分裂方法
2.2 合併方法
這個和決策樹的學習很類似。分裂方法,就是找到一個分裂點看,左右2個區間,看分裂前後資訊增益變化閾值,如果差值超過閾值(正值,分列前-分裂後資訊熵),則分裂。每次找差值最大的點做分裂點,直到收斂。合併類似,先劃分如果很小單元區間,按順序合併資訊增益小於閾值的相鄰區間,直到收斂。參考文獻:
1 : csdn部落格:
x2檢驗(chi-square test)或稱卡方檢驗
http://www.cnblogs.com/emanlee/archive/2008/10/25/1319569.html2. 論文:連續值的離散化. 許文烈. 成均館大學。http://stat.skku.ac.kr/myhuh/homepage/specialLectures/SDULecture(Chinese).pdf
附件:採用資訊增益合併方法的連續特徵離散化程式:
'''
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
相關文章
- 特徵預處理之歸一化&標準化特徵
- 【dp+離散化+線段樹優化】Paint優化AI
- 【離散優化】覆蓋問題優化
- 二維座標離散化模板
- LeetCode 493. 翻轉對(歸併排序 || 離散化+樹狀陣列)LeetCode排序陣列
- 一文詳解特徵縮放、標準化、歸一化的定義、區別、特點和作用特徵
- hdu4325 樹狀陣列+離散化陣列
- 聯合學習離散句法結構和連續詞表徵的無監督方法
- 對比歸一化和標準化 —— 量化分析
- 運籌優化(十四)--離散優化的啟發式演算法優化演算法
- 【scikit-learn基礎】--『預處理』之 離散化
- 梯度下降、過擬合和歸一化梯度
- BZOJ 4195 程式自動分析【並查集+離散化】並查集
- 批量歸一化BN
- 資料歸一化
- Leetcode 327. 區間和的個數 (字首和 + 離散化 + 樹狀陣列)LeetCode陣列
- 什麼是機器學習的特徵工程?【資料集特徵抽取(字典,文字TF-Idf)、特徵預處理(標準化,歸一化)、特徵降維(低方差,相關係數,PCA)】機器學習特徵工程PCA
- POJ 2528 Mayor's posters (線段樹 區間更新+離散化)
- POJ 2582 Mayor's posters 線段樹入門題+離散化
- POJ 2528 Mayor's posters (線段樹區間更新 + 離散化)
- POJ 1418 圓的基本操作以及 圓弧離散化
- HDU 5862 Counting Intersections(樹狀陣列+掃描線+離散化)陣列
- HDU4991 Ordered Subsequence (dp+樹狀陣列+離散化)陣列
- 離散請求
- 資料變換-歸一化與標準化
- 統計資料歸一化與標準化
- 機器學習-資料歸一化方法機器學習
- Python資料預處理:徹底理解標準化和歸一化Python
- 繼續聊聊MVVM和元件化MVVM元件化
- Alink漫談(十九) :原始碼解析 之 分位點離散化Quantile原始碼
- 資料處理 | pandas入門專題——離散化與one-hot
- POJ 3368-Frequent values(RMQ+離散化-最頻繁的元素)MQ
- TensorFlow 訓練單特徵和多特徵的線性迴歸特徵
- R語言歸一化處理R語言
- 歸一化(softmax)、資訊熵、交叉熵熵
- 離散傅立葉變換
- 強化深度學習task06連續動作空間和DDPG深度學習
- 「GAN優化」詳解SNGAN(頻譜歸一化GAN)優化