python 基于卡方值分箱算法的實現(xiàn)示例
原理很簡單,初始分20箱或更多,先確保每箱中都含有0,1標(biāo)簽,對不包含0,1標(biāo)簽的箱向前合并,計算各箱卡方值,對卡方值最小的箱向后合并,代碼如下
import pandas as pd
import numpy as np
import scipy
from scipy import stats
def chi_bin(DF,var,target,binnum=5,maxcut=20):
'''
DF:data
var:variable
target:target / label
binnum: the number of bins output
maxcut: initial bins number
'''
data=DF[[var,target]]
#equifrequent cut the var into maxcut bins
data["cut"],breaks=pd.qcut(data[var],q=maxcut,duplicates="drop",retbins=True)
#count 1,0 in each bin
count_1=data.loc[data[target]==1].groupby("cut")[target].count()
count_0=data.loc[data[target]==0].groupby("cut")[target].count()
#get bins value: min,max,count 0,count 1
bins_value=[*zip(breaks[:maxcut-1],breaks[1:],count_0,count_1)]
#define woe
def woe_value(bins_value):
df_woe=pd.DataFrame(bins_value)
df_woe.columns=["min","max","count_0","count_1"]
df_woe["total"]=df_woe.count_1+df_woe.count_0
df_woe["bad_rate"]=df_woe.count_1/df_woe.total
df_woe["woe"]=np.log((df_woe.count_0/df_woe.count_0.sum())/(df_woe.count_1/df_woe.count_1.sum()))
return df_woe
#define iv
def iv_value(df_woe):
rate=(df_woe.count_0/df_woe.count_0.sum())-(df_woe.count_1/df_woe.count_1.sum())
iv=np.sum(rate * df_woe.woe)
return iv
#make sure every bin contain 1 and 0
##first bin merge backwards
for i in range(len(bins_value)):
if 0 in bins_value[0][2:]:
bins_value[0:2]=[(
bins_value[0][0],
bins_value[1][1],
bins_value[0][2]+bins_value[1][2],
bins_value[0][3]+bins_value[1][3])]
continue
##bins merge forwards
if 0 in bins_value[i][2:]:
bins_value[i-1:i+1]=[(
bins_value[i-1][0],
bins_value[i][1],
bins_value[i-1][2]+bins_value[i][2],
bins_value[i-1][3]+bins_value[i][3])]
break
else:
break
#calculate chi-square merge the minimum chisquare
while len(bins_value)>binnum:
chi_squares=[]
for i in range(len(bins_value)-1):
a=bins_value[i][2:]
b=bins_value[i+1][2:]
chi_square=scipy.stats.chi2_contingency([a,b])[0]
chi_squares.append(chi_square)
#merge the minimum chisquare backwards
i = chi_squares.index(min(chi_squares))
bins_value[i:i+2]=[(
bins_value[i][0],
bins_value[i+1][1],
bins_value[i][2]+bins_value[i+1][2],
bins_value[i][3]+bins_value[i+1][3])]
df_woe=woe_value(bins_value)
#print bin number and iv
print("箱數(shù):{},iv:{:.6f}".format(len(bins_value),iv_value(df_woe)))
#return bins and woe information
return woe_value(bins_value)
以下是效果:
初始分成10箱,目標(biāo)為3箱
chi_bin(data,"age","SeriousDlqin2yrs",binnum=3,maxcut=10)
箱數(shù):8,iv:0.184862
箱數(shù):7,iv:0.184128
箱數(shù):6,iv:0.179518
箱數(shù):5,iv:0.176980
箱數(shù):4,iv:0.172406
箱數(shù):3,iv:0.160015
min max count_0 count_1 total bad_rate woe
0 0.0 52.0 70293 7077 77370 0.091470 -0.266233
1 52.0 61.0 29318 1774 31092 0.057056 0.242909
2 61.0 72.0 26332 865 27197 0.031805 0.853755
到此這篇關(guān)于python 基于卡方值分箱算法的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)python 卡方值分箱算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于vscode?默認(rèn)添加python項目的源目錄路徑到執(zhí)行環(huán)境的問題
這篇文章主要介紹了vscode?默認(rèn)添加python項目的源目錄路徑到執(zhí)行環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
python標(biāo)準(zhǔn)庫模塊之json庫的基礎(chǔ)用法
json庫是處理JSON格式的Python標(biāo)準(zhǔn)庫,json庫主要包括兩類函數(shù),操作函數(shù)和解析函數(shù),下面這篇文章主要給大家介紹了關(guān)于python標(biāo)準(zhǔn)庫模塊之json庫的基礎(chǔ)用法,需要的朋友可以參考下2022-06-06
Python實現(xiàn)一個轉(zhuǎn)存純真IP數(shù)據(jù)庫的腳本分享
工作中我們常需要使用純真IP數(shù)據(jù)庫內(nèi)的數(shù)據(jù)做分析,下面這篇文章主要給大家介紹了利用Python如何實現(xiàn)一個轉(zhuǎn)存純真IP數(shù)據(jù)庫的相關(guān)資料,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05
python中tkinter的應(yīng)用:修改字體的實例講解
今天小編就為大家分享一篇python中tkinter的應(yīng)用:修改字體的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

