連續特徵離散化和歸一化

【點擊領取】阿里雲代金券 | 阿里雲優惠券 |阿里雲優惠碼|雲服務器|阿里雲|阿里雲代金券 – 限時領取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     

複製代碼
相關文章
相關標籤/搜索