為了挑出優(yōu)質(zhì)變量荚恶,我們可能會考慮:
變量的預測能力
變量之間的相關(guān)性
變量的簡單性(容易生成和使用)
變量的健壯性(適用于各種情形)
變量在業(yè)務(wù)上的可解釋性(被挑戰(zhàn)時可以解釋的通)
其中隆嗅,預測能力是最主要的影響因素棚潦。
如何衡量變量的預測能力呢倘待,可以采用通用方法:計算IV疮跑、信息增益或基尼系數(shù)等等;也可以為特定模型設(shè)計特定的計算方法凸舵,本文針對線性模型和隨機森林模型祖娘,解釋了變量重要性是如何計算的。
一啊奄、通用計算方法
Information Value(IV)渐苏,信息值,可以用來衡量自變量的預測能力菇夸。類似的指標還有信息增益琼富、基尼系數(shù)等,它們的原理類似庄新。
計算這類指標時鞠眉,并不需要考慮具體使用的模型算法是什么薯鼠。
IV的原理是什么?如何計算械蹋?
①首先出皇,只有類別變量才能計算IV,因此朝蜘,連續(xù)變量需要先分箱(分區(qū)間)
②對于類別變量恶迈,需要計算該變量中每一個類別的WOE(weight of evidence)
計算公式為:
WOE表示的含義即是"當前分組中響應(yīng)客戶占所有響應(yīng)客戶的比例"和"當前分組中沒有響應(yīng)的客戶占所有沒有響應(yīng)客戶的比例"的差異。
③計算變量中每個類別對應(yīng)的IV
計算公式為:
④計算整個變量的IV
很簡單谱醇,加總所有類別的IV值暇仲。
計算公式為:
python實現(xiàn)IV計算
Python中沒有現(xiàn)成的功能模塊,本人寫了一個函數(shù)副渴,有興趣可以參考一下:
def woe_iv(data, feature, label):
'''
:param data: DataFrame,
data files contain feature and label
:param feature: String
a predict variable
:param label: String
the object variable
:return: information value of given feature
'''
data = data[[feature, label]]
cato_num = data.groupby(feature).count().reset_index()
default_num = data.groupby(feature).sum().reset_index()
all_number = data.shape[0]
default_number = data[label].sum()
normal_number = all_number - default_number
iv = 0
for i in np.arange(cato_num.shape[0]):
p_default = default_num[label][i]/default_number
p_normal = (cato_num[label][i] - default_num[label][i])/normal_number
if p_default == 0 or p_normal == 0:
print('woe_{}_{} is not avalible'.format(feature, cato_num[feature][i]))
else:
locals()['woe_{}'.format(cato_num[feature][i])] = \
np.log(p_normal / p_default)
print('woe_{}: {}'.format(cato_num[feature][i],
locals()['woe_{}'.format(cato_num[feature][i])]))
iv = iv + (p_normal - p_default) * locals()['woe_{}'.format(cato_num[feature][i])]
print('iv of {}: '.format(feature), iv)
return iv
測試一波~
import numpy as np
# 生成data奈附,包括x1,x2,x3三個自變量
x1 = np.random.randint(-3, 3, (1000))
x2 = 1.5*np.random.randint(-3, 3, (1000))
x3 = 0.5*np.random.randint(-3, 3, (1000))
y = (1 + x1 + x2 + x3 + np.random.randn()) > 0
X = np.column_stack([x1, x2, x3])
data = pd.DataFrame(X, columns=['x1', 'x2', 'x3'])
data['y'] = y
woe_iv(data, 'x1', 'y')
woe_iv函數(shù)能輸出變量的每個類別的woe值,并返回iv值煮剧。
二斥滤、在模型中計算變量重要性
1.線性模型及邏輯回歸
線性模型及邏輯回歸中,給定一個變量勉盅,衡量它的影響力的最簡單的量化方法就是佑颇,將變量的系數(shù)乘以該變量的標準差。
import numpy as np
from sklearn.linear_model import LogisticRegression
x1 = np.random.randn(100)
x2 = 4*np.random.randn(100)
x3 = 0.5*np.random.randn(100)
y = (3 + x1 + x2 + x3 + 0.2*np.random.randn()) > 0
X = np.column_stack([x1, x2, x3])
m = LogisticRegression()
m.fit(X, y)
# 邏輯回歸估計的參數(shù)都接近1:
print(m.coef_)
# 以下輸出說明了X2有更強的預測能力草娜,符合預期
print(np.std(X, 0)*m.coef_)
乘以變量標準差是為了消除變量量綱帶來的影響挑胸。
另一種更常見的做法是,在建模之前將變量標準化宰闰,這種情況下茬贵,變量的系數(shù)即可以直接作為變量重要性的判斷指標。
2.隨機森林
先簡單介紹一下隨機森林算法移袍,它是基于決策樹的集成算法解藻,以下是構(gòu)建一個隨機森林模型的具體過程:
隨機森林算法步驟:
①用有抽樣放回的方法(bootstrap)從樣本集中選取n個樣本作為一個訓練集
②用抽樣得到的樣本集生成一棵決策樹。在生成的每一個結(jié)點: 隨機不重復地選擇d個特征 利用這d個特征分別對樣本集進行劃分葡盗,找到最佳的劃分特征(可用基尼系數(shù)螟左、增益率或者信息增益判別)
③重復步驟1到步驟2共k次,k即為隨機森林中決策樹的個數(shù)觅够。
④用訓練得到的隨機森林對測試樣本進行預測路狮,并用票選法決定預測的結(jié)果。
簡單示意圖:
回到正題蔚约,講述計算隨機森林變量重要性的兩種方法:
1.Gini指數(shù)法
①第i棵樹中奄妨,節(jié)點m的Gini指數(shù)是:
其中,K表示m節(jié)點中有K個類別苹祟,Pmk表示節(jié)點m中類別k所占的比例砸抛。
②節(jié)點m分枝前后的Gini指數(shù)變化量為:
其中评雌, 后兩項分別表示分枝后兩個新節(jié)點的Gini指數(shù)。
Gini指數(shù)變化量還不能直接使用直焙,考慮到節(jié)點的樣本數(shù)量景东,需要進行加權(quán)處理,權(quán)重就是節(jié)點的樣本數(shù)量(n)除以總樣本數(shù)量(N):
③特征X??在節(jié)點m的重要性為:
④如果特征X??在決策樹i中出現(xiàn)的節(jié)點在集合M中奔誓,那么X??在第i棵樹的重要性為:
⑤假設(shè)RF中共有n棵樹斤吐,那么:
⑥最后,把所有求得的重要性評分做一個歸一化處理即可:
Python中厨喂,隨機森林模型中變量重要性計算和措,采用的就是這種方法,有現(xiàn)成的函數(shù)可以直接調(diào)用蜕煌。
2.精度下降法(Mean Decrease in Accuracy)
①.對每一顆決策樹派阱,選擇相應(yīng)的袋外數(shù)據(jù)(out of bag,OOB)?計算袋外數(shù)據(jù)誤差斜纪,記為errOOB1
②.隨機對袋外數(shù)據(jù)OOB所有樣本的特征X加入噪聲干擾(可以隨機改變樣本在特征X處的值)贫母,再次計算袋外數(shù)據(jù)誤差,記為errOOB2
③. ?假設(shè)森林中有N棵樹盒刚,則特征X的重要性=∑(errOOB2-errOOB1)/N腺劣。這個數(shù)值之所以能夠說明特征的重要性是因為,如果加入隨機噪聲后因块,袋外數(shù)據(jù)準確率大幅度下降(即errOOB2上升)誓酒,說明這個特征對于樣本的預測結(jié)果有很大影響,進而說明重要程度比較高贮聂。
PS:所謂袋外數(shù)據(jù)是指,每次建立決策樹時寨辩,通過重復抽樣得到一個數(shù)據(jù)用于訓練?決策樹吓懈,這時還有大約1/3的數(shù)據(jù)沒有被利用,沒有參與決策樹的建立靡狞。這部分數(shù)據(jù)可以用于對決策樹的性能進行評估耻警,計算模型的預測錯誤率,稱為袋外數(shù)據(jù)誤差甸怕。
三甘穿、總結(jié)
1.幾乎任何情況下,都可以通過計算IV值來衡量變量重要性(只要可以轉(zhuǎn)化為類別變量)梢杭,但是在某些情況下温兼,把所有變量都轉(zhuǎn)化為類別變量并不是一件容易的事,而且轉(zhuǎn)化方法的差異也會影響計算結(jié)果武契。
2.針對特定模型募判,采用特定的變量重要性算法荡含,在計算效率上顯然更高了。但這種方法下得出的結(jié)果届垫,是變量在“大環(huán)境”下對結(jié)果的貢獻度释液,而非單獨進行觀測(除非事先保證變量的獨立性),因此難以排除變量間的相關(guān)性影響装处。
上文中用線性模型和隨機森林模型為例误债,概括了變量重要性的主要計算方法和原理,其它可以計算變量重要性的還有神經(jīng)網(wǎng)絡(luò)模型妄迁、決策樹寝蹈、貝葉斯網(wǎng)絡(luò)模型、判別分析模型判族、SVM以及最近相鄰元素(KNN) 模型等等躺盛。
PS:一些特征選擇/縮減方法,如主成分分析形帮、L1正則化槽惫,逐步回歸等等,并不能量化變量的重要程度辩撑,但能達到選擇重要變量的目的界斜。