IV
- 概念:
- IV的全稱是Information Value豌拙,中文意思是信息價(jià)值,或者信息量习柠。
- 作用:
- 構(gòu)建分類模型時(shí)蒜焊,對(duì)特征進(jìn)行篩選倒信,挑選特征時(shí) 用來衡量自變量(特征)的預(yù)測(cè)能力
- ”用IV去衡量變量預(yù)測(cè)能力“的理解
- 我們假設(shè)在一個(gè)分類問題中,目標(biāo)變量的類別有兩類:Y1泳梆,Y2鳖悠。對(duì)于一個(gè)待預(yù)測(cè)的樣本A,要判斷A屬于Y1還是Y2优妙,我們是需要一定的信息乘综,假設(shè)這個(gè)信息總量是I,而這些所需要的信息套硼,就蘊(yùn)含在所有的待預(yù)測(cè)樣本的特征C1卡辰,C2,C3熟菲,……,Cn中朴恳,那么抄罕,對(duì)于其中的一個(gè)特征Ci來說,其蘊(yùn)含的信息越多于颖,那么它對(duì)于判斷A屬于Y1還是Y2的貢獻(xiàn)就越大呆贿,Ci的信息價(jià)值就越大,Ci的IV就越大森渐,它就越應(yīng)該進(jìn)入到入模變量列表中做入。
-
公式:
計(jì)算整個(gè)特征的IV值 :
WOE
- WOE的全稱是“Weight of Evidence”,即證據(jù)權(quán)重同衣。WOE是對(duì)原始特征的一種編碼形式竟块。要對(duì)一個(gè)特征進(jìn)行WOE編碼,需要首先把這個(gè)變量進(jìn)行分組處理(也叫離散化耐齐、分箱等等浪秘,說的都是一個(gè)意思)蒋情。
-
WOE的計(jì)算公式:
公式含義:
pyi是這個(gè)組中正例樣本占整個(gè)樣本中正例樣本的比例
pni是這個(gè)組中負(fù)例樣本占整個(gè)樣本中負(fù)例樣本的比例
(#yi是這個(gè)組中正例樣本的數(shù)量 )
(#ni是這個(gè)組中負(fù)例樣本的數(shù)量 )
(#yT是整個(gè)樣本中所有正例樣本的數(shù)量)
(#nT是整個(gè)樣本中所有負(fù)例樣本的數(shù)量 )
公式表示: “當(dāng)前分組中正例樣本占所有樣本中所有正例樣本的比例”和“當(dāng)前分組中負(fù)例樣本占所有樣本中所有負(fù)例樣本比例”的差異 - 公式變換:
公式表示:當(dāng)前這個(gè)組中響應(yīng)的客戶和未響應(yīng)客戶的比值,和所有樣本中這個(gè)比值的差異
WOE越大耸携,這種差異越大棵癣,這個(gè)分組里的樣本響應(yīng)的可能性就越大(這組數(shù)據(jù)分到正例的概率越大),WOE越小夺衍,差異越小狈谊,這個(gè)分組里的樣本響應(yīng)的可能性就越小
分母是固定的,如果分子中的yi越大沟沙,則WOE返回的數(shù)值越大
用實(shí)例介紹IV的計(jì)算和使用
- 例子
- 假設(shè)現(xiàn)在某個(gè)公司舉行一個(gè)活動(dòng)河劝,在舉行這個(gè)活動(dòng)之前,先在小范圍的客戶中進(jìn)行了一次試點(diǎn)尝胆,收集了一些用戶對(duì)這次活動(dòng)的一些響應(yīng)丧裁,然后希望通過這些數(shù)據(jù),去構(gòu)造一個(gè)模型含衔,預(yù)測(cè)如果舉行這次的活動(dòng)煎娇,是否能夠得到很好的響應(yīng)或者得到客戶的響應(yīng)概率之類。
- 假設(shè)我們已經(jīng)從公司客戶列表中隨機(jī)抽取了100000個(gè)客戶進(jìn)行了營銷活動(dòng)測(cè)試贪染,收集了這些客戶的響應(yīng)結(jié)果缓呛,作為我們的建模數(shù)據(jù)集,其中響應(yīng)的客戶有10000個(gè)杭隙。另外假設(shè)我們也已經(jīng)提取到了這些客戶的一些變量哟绊,作為我們模型的候選變量集,這些變量包括以下這些:
- 最近一個(gè)月是否有購買痰憎;
- 最近一次購買金額票髓;
- 最近一筆購買的商品類別;
- 是否是公司VIP客戶铣耘;
-
假設(shè)洽沟,我們已經(jīng)對(duì)這些變量進(jìn)行了離散化,統(tǒng)計(jì)的結(jié)果如下面幾張表所示
(1) 最近一個(gè)月是否有過購買:
(2) 最近一次購買金額:
(3) 最近一筆購買的商品類別:
(4) 是否是公司VIP客戶:
計(jì)算WOE和IV
-
以其中的一個(gè)變量“最近一次購買金額”變量為例:
-
計(jì)算WOE
WOE的基本特點(diǎn):
- 當(dāng)前分組中蜗细,響應(yīng)的比例越大裆操,WOE值越大;
- 當(dāng)前分組WOE的正負(fù)炉媒,由當(dāng)前分組響應(yīng)和未響應(yīng)的比例踪区,與樣本整體響應(yīng)和未響應(yīng)的比例的大小關(guān)系決定,當(dāng)前分組的比例小于樣本整體比例時(shí)(分子小于分母)吊骤,WOE為負(fù)缎岗,當(dāng)前分組的比例大于整體比例時(shí)(分子大于分母),WOE為正白粉,當(dāng)前分組的比例和整體比例相等時(shí)(分子等于分母)密强,WOE為0茅郎。
WOE描述了某一特征的當(dāng)前這個(gè)分組,對(duì)判斷該特征是否會(huì)響應(yīng)(或者說屬于哪個(gè)類)所起到影響方向和大小或渤,當(dāng)WOE為正時(shí)系冗,特征當(dāng)前取值對(duì)判斷個(gè)體是否會(huì)響應(yīng)起到的正向的影響,當(dāng)WOE為負(fù)時(shí)薪鹦,起到了負(fù)向影響掌敬。而WOE值的大小,則是這個(gè)影響的大小的體現(xiàn)池磁。 -
計(jì)算IV
IV的特點(diǎn):
- 對(duì)于特征的一個(gè)分組奔害,這個(gè)分組的響應(yīng)和未響應(yīng)的比例與樣本整體響應(yīng)和未響應(yīng)的比例(WOE)相差越大,IV值越大地熄,否則华临,IV值越小端考;
- 極端情況下雅潭,當(dāng)前分組的響應(yīng)和未響應(yīng)的比例和樣本整體的響應(yīng)和未響應(yīng)的比例相等時(shí),IV值為0却特;
-
計(jì)算變量總IV值:
IV值的比較和變量預(yù)測(cè)能力的排序
其他三個(gè)特征的iv和woe計(jì)算同上
最近一次購買金額的IV為0.49270645
最近一個(gè)月是否有過購買的IV為0.250224725
最近一筆購買的商品類別的IV為0.615275563
是否為公司VIP客戶的IV為1.56550367
IV排序: 是否是公司VIP客戶 > 最近一筆購買的商品類別 > 最近一次購買金額 > 最近一個(gè)月是否有過購買
“是否是公司VIP客戶”是預(yù)測(cè)能力最高的特征扶供,“最近一個(gè)月是否有過購買”是預(yù)測(cè)能力最低的特征
關(guān)于IV和WOE的進(jìn)一步思考:為什么用IV而不是直接用WOE
從計(jì)算公式來看,對(duì)于特征的一個(gè)分組裂明,IV是WOE乘以這個(gè)分組響應(yīng)占比和未響應(yīng)占比的差椿浓。而一個(gè)特征的IV等于各分組IV的和。WOE構(gòu)造出一個(gè)和闽晦,只需要把特征各個(gè)分組的WOE和取絕對(duì)值再相加扳碍,(取絕對(duì)值是因?yàn)閃OE可正可負(fù),如果不取絕對(duì)值仙蛉,則會(huì)把特征的區(qū)分度通過正負(fù)抵消的方式抵消掉):
用IV而不是直接用WOE的原因:
- 指標(biāo)值不應(yīng)該是負(fù)數(shù) 笋敞,iv中乘以 (py-pn) 這個(gè)系數(shù),保證了特征每個(gè)分組的結(jié)果都是非負(fù)數(shù)
-
主要原因: 乘以(py-pn)后捅儒,體現(xiàn)出了特征當(dāng)前分組中個(gè)體的數(shù)量占整體個(gè)體數(shù)量的比例
從上表可以看到液样,特征取1時(shí)振亮,響應(yīng)比達(dá)到90%巧还,對(duì)應(yīng)的WOE很高,但對(duì)應(yīng)的IV卻很低坊秸,原因就在于IV在WOE的前面乘以了一個(gè)系數(shù)(py-pn)麸祷,而這個(gè)系數(shù)很好的考慮了這個(gè)分組中樣本占整體樣本的比例,比例越低褒搔,這個(gè)分組對(duì)特征整體預(yù)測(cè)能力的貢獻(xiàn)越低阶牍。相反喷面,如果直接用WOE的絕對(duì)值加和,會(huì)得到一個(gè)很高的指標(biāo)走孽,這是不合理的
分箱
-
數(shù)據(jù)分箱(也稱為離散分箱或分段)是一種數(shù)據(jù)預(yù)處理技術(shù)惧辈,用于減少次要觀察誤差的影響,是一種將多個(gè)連續(xù)值分組為較少數(shù)量的“分箱”的方法磕瓷。簡(jiǎn)單說就是將連續(xù)型特征進(jìn)行離散化盒齿。
關(guān)于人年齡的數(shù)據(jù)
對(duì)連續(xù)性特征進(jìn)行離散化
-
注意:
- 分箱的數(shù)據(jù)不一定必須是數(shù)字,它們可以是任何類型的值困食,如“狗”边翁,“貓”,“倉鼠”等硕盹。 分箱也用于圖像處理符匾,通過將相鄰像素組合成單個(gè)像素,它可用于減少數(shù)據(jù)量瘩例。
-
分箱的作用&意義
- 離散特征的增加和減少都很容易啊胶,易于模型的快速迭代,提升計(jì)算速度
- 特征離散化后仰剿,模型會(huì)更穩(wěn)定创淡,比如如果對(duì)用戶年齡離散化,20-30作為一個(gè)區(qū)間南吮,不會(huì)因?yàn)橐粋€(gè)用戶年齡長(zhǎng)了一歲就變成一個(gè)完全不同的人琳彩。
- 特征離散化以后,起到了簡(jiǎn)化了模型的作用部凑,可以適當(dāng)降低了模型過擬合的風(fēng)險(xiǎn)露乏。
-
pandas實(shí)現(xiàn)數(shù)據(jù)的分箱:pd.cut()
import numpy as np import pandas as pd from pandas import Series, DataFrame score_list = np.linspace(0,20,num=11) print(score_list) #[ 0. 2. 4. 6. 8. 10. 12. 14. 16. 18. 20.] #設(shè)置分箱:方式1 bins=[0,4,8,16,20] #指定分箱數(shù)據(jù)的范圍 score_cat=pd.cut(score_list,bins=bins) score_cat.value_counts() #輸出結(jié)果: (0, 4] 2 (4, 8] 2 (8, 16] 4 (16, 20] 2 #設(shè)置分箱:方式2 #指定分箱數(shù)據(jù)的個(gè)數(shù) pd.cut(score_list,bins=4).value_counts() #輸出結(jié)果: (-0.02, 5.0] 3 (5.0, 10.0] 3 (10.0, 15.0] 2 (15.0, 20.0] 3 #設(shè)置分箱:方式3 #label參數(shù)的作用:設(shè)置分箱的每一個(gè)范圍的標(biāo)識(shí) #指定分箱數(shù)據(jù)的個(gè)數(shù) pd.cut(score_list,bins=4,labels=['a','b','c','d']).value_counts() #輸出結(jié)果: a 3 b 3 c 2 d 3 pd.cut(score_list,bins=4,labels=range(4)).value_counts() #輸出結(jié)果: 0 3 1 3 2 2 3 3
pd.qcut() ·qcut根據(jù)值的頻率來選擇箱子的均勻間隔,即每個(gè)箱子含有的數(shù)的數(shù)量相同
factors=np.random.randn(9)
pd.qcut(factors,3).value_counts() #計(jì)算每個(gè)分組中含有數(shù)的數(shù)量
#輸出結(jié)果:
(-1.1289999999999998, -0.124] 3
(-0.124, 0.393] 3
(0.393, 1.496] 3
cut與qcut的區(qū)別:
1.cut:按連續(xù)數(shù)據(jù)的大小分到各個(gè)桶里涂邀,每個(gè)桶里樣本量可能不同瘟仿,但每個(gè)桶相當(dāng)于等長(zhǎng)的區(qū)間
2.qcut:每個(gè)桶的樣本數(shù)量一定(等頻分箱)
特征是連續(xù)性傾向于使用qcut,離散型傾向于使用cut注意:分箱后就可以求解出IV和WOE的值了比勉。如果想對(duì)連續(xù)性特征進(jìn)行離散化劳较,需要對(duì)分箱后的每組(箱)數(shù)據(jù)進(jìn)行woe或者iv編碼,然后才能放進(jìn)模型訓(xùn)練浩聋。
import sklearn.datasets as ds
bc = ds.load_breast_cancer() #加載乳腺癌數(shù)據(jù)
feature = bc.data #特征
target = bc.target #標(biāo)簽
feature.shape #(569, 30)
#查看第1列數(shù)據(jù)范圍观蜗,判定其為連續(xù)性數(shù)據(jù)
feature[:,1].min(),feature[:,1].max()
#(9.71, 39.28)
#對(duì)其進(jìn)行分箱處理,將其離散化
fea_bins = pd.cut(feature[:,1],bins=5)
fea_bins.value_counts()
#輸出結(jié)果:
(9.68, 15.624] 113
(15.624, 21.538] 299
(21.538, 27.452] 129
(27.452, 33.366] 25
(33.366, 39.28] 3
#對(duì)分箱后的特征列進(jìn)行woe編碼 crosstab()交叉表
#每組中正例和反例樣本的數(shù)量
gi = pd.crosstab(fea_bins,target)
gi
#輸出結(jié)果:
col_0 0 1
row_0
(9.68, 15.624] 8 105
(15.624, 21.538] 101 198
(21.538, 27.452] 90 39
(27.452, 33.366] 11 14
(33.366, 39.28] 2 1
#樣本數(shù)據(jù)中正例樣本和反例樣本的數(shù)量
gb = pd.Series(data=target).value_counts()
gb
#輸出結(jié)果:
1 357
0 212
#規(guī)定0類別為正例樣本衣洁,1為反例樣本
gbi = (gi[0]/gi[1]) / (gb[0]/gb[1])
gbi
#輸出結(jié)果:
row_0
(9.68, 15.624] 0.128302
(15.624, 21.538] 0.858991
(21.538, 27.452] 3.886067
(27.452, 33.366] 1.323113
(33.366, 39.28] 3.367925
#WOE的計(jì)算
woe = np.log(gbi)
woe
#輸出結(jié)果:
(9.68, 15.624] -2.053369
(15.624, 21.538] -0.151997
(21.538, 27.452] 1.357398
(27.452, 33.366] 0.279987
(33.366, 39.28] 1.214297
#計(jì)算IV
iv=((gi[0]/gb[0])-(gi[1]/gb[1]))*woe
iv
#輸出結(jié)果:
row_0
(9.68, 15.624] 0.526447
(15.624, 21.538] 0.011887
(21.538, 27.452] 0.427967
(27.452, 33.366] 0.003548
(33.366, 39.28] 0.008054
f_iv=iv.sum()
f_iv #0.977902238264725
#進(jìn)行映射操作
dict = iv.to_dict()
dict
#輸出結(jié)果:
{Interval(9.68, 15.624, closed='right'): 0.5264465134478181,
Interval(15.624, 21.538, closed='right'): 0.011887192576072856,
Interval(21.538, 27.452, closed='right'): 0.4279665436826456,
Interval(27.452, 33.366, closed='right'): 0.0035477507112311505,
Interval(33.366, 39.28, closed='right'): 0.008054237846957362}
ivs_bins = fea_bins.map(dict)
ivs_bins.tolist()