數據離散化-分箱


  變量的延申和篩選-連續變量離散化-特征篩選

   WOE編碼(最優分箱) 

   WOE一般在0.1~3之間波動,IV值做得特征篩選的操作 一般保留>0.03的特征 IV值體現的時X和Y之間的顯著性進行篩選

1.逐列分箱並獲得IV值

# 運行自定義函數所在文件    對自定義分箱文件要自己理解
%run smob.py

# y進行0,1互換
train_data['SeriousDlqin2yrs']  = -(train_data.SeriousDlqin2yrs-1) #因為與自定義函數中的標簽0 1設定正好相反

# 定義y的名字
y = 'SeriousDlqin2yrs' #標簽列的名字

# 初始化IV值的對象
# 貸款以及信用卡可用額度占比
RUO = smbin(train_data,y,'RevolvingUtilizationOfUnsecuredLines'); # 越高WOE值越大 # 如果覺得分箱的箱子數太多 可以設置 max_bin= 參數 看看能不能把兩個WOE值較小的合並 #查看結果數據 RUO.IVtable #查看遍歷方式(一般不看) print(RUO.Tree_structure) #查看IV值 RUO.IV # 保存IV值 第一個特征值 iv_all = pd.Series() iv_all = iv_all.append(pd.Series({'RevolvingUtilizationOfUnsecuredLines':RUO.IV})) #age分箱並保存iv值 age = smbin(train_data,y,'age') age.IVtable iv_all = iv_all.append(pd.Series({'age':age.IV})) #除標簽外把所有特征都來一邊
#查看某一變量分享后的基於標簽的箱型圖
train_data.boxplot(column = ['NumberOfTimes90DaysLate'],by=[y])

也可以所有特征,循環分箱

iv_all = pd.Series()
for i in train_data.columns[1:]: # 貸款以及信用卡可用額度占比 # R=i.upper() R= smbin(train_data,y,i); iv_all = iv_all.append(pd.Series({i:R.IV})) iv_all

 

2.查看所有變量的IV值

iv_all.sort_values(ascending=False) #小於0.03的可以考慮篩選掉
#直方圖
iv_all.sort_values().plot(kind='barh')

3.WOE轉換(WOE編碼),通過生成的分箱和WOE數據

# smbin和smbin_cu得到IV值篩選后,放在一個表中
x_list = [RUO,age,NO3059,DebtRatio,MonthlyIncome,NOO,NO90,NRE,NO6089,NOD]

data_woe = smgen(train_data,x_list) data_woe.head()

 4.數據集轉換(確定X Y)--轉換后的數據

  1. 抽取WOE列作為預測數據X
  2. 如果用的是statsmodel的回歸模型,加常數項
  3. 抽取相應列作為y
import statsmodels.api as sm

X = data_woe.iloc[:,-len(x_list):]
X = sm.add_constant(X)          #增加常數列

Y = data_woe[y]   #y是標簽列名稱

接下來是數據集切分了...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM