連續特徵離散化和歸一化
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
相關文章
- 離散化
- 特徵預處理之歸一化&標準化特徵
- 特徵工程中的「歸一化」有什麼作用特徵工程
- 二維字首和與差分、離散化技巧
- LeetCode 493. 翻轉對(歸併排序 || 離散化+樹狀陣列)LeetCode排序陣列
- 二維座標離散化模板
- 【離散優化】覆蓋問題優化
- Making the Grade POJ - 3666(離散化+dp)
- 一文詳解特徵縮放、標準化、歸一化的定義、區別、特點和作用特徵
- 離散化的一道很經典的題
- 聯合學習離散句法結構和連續詞表徵的無監督方法
- vijos1237-隱形的翅膀【離散化】
- 對比歸一化和標準化 —— 量化分析
- 影像歸一化
- 梯度下降、過擬合和歸一化梯度
- ECNU OJ 3353 塗黑板(線段樹離散化)
- 從傅立葉級數到傅立葉變換(連續、離散)
- Leetcode 327. 區間和的個數 (字首和 + 離散化 + 樹狀陣列)LeetCode陣列
- 運籌優化(十四)--離散優化的啟發式演算法優化演算法
- 資料歸一化
- 批量歸一化BN
- BZOJ 4195 程式自動分析【並查集+離散化】並查集
- 【scikit-learn基礎】--『預處理』之 離散化
- HDU 1542 Atlantis (線段樹+離散化+掃描線)
- LayerNorm層歸一化和bn的區別ORM
- 【並查集】【離散化】[NOI2015] 程式自動分析並查集
- 什麼是機器學習的特徵工程?【資料集特徵抽取(字典,文字TF-Idf)、特徵預處理(標準化,歸一化)、特徵降維(低方差,相關係數,PCA)】機器學習特徵工程PCA
- Python資料預處理:徹底理解標準化和歸一化Python
- 洛谷題單指南-字首和差分與離散化-P1496 火燒赤壁
- HDU 5862 Counting Intersections(樹狀陣列+掃描線+離散化)陣列
- POJ 2528 Mayor's posters (線段樹 區間更新+離散化)
- 資料變換-歸一化與標準化
- Alink漫談(十九) :原始碼解析 之 分位點離散化Quantile原始碼
- 離散數學——4.命題邏輯公式的正規化公式
- 繼續聊聊MVVM和元件化MVVM元件化
- 「GAN優化」詳解SNGAN(頻譜歸一化GAN)優化
- UI(十六)資料持久化和歸檔NSCoding序列化UI持久化
- 洛谷題單指南-字首和差分與離散化-P5937 [CEOI1999] Parity GameGAM
- bzoj4195: [Noi2015]程式自動分析(離散化+並查集)並查集