【问题标题】:How to get the Weight of Evidence (WOE) and Information Value (IV) in Python/pandas?如何在 Python/pandas 中获取证据权重(WOE)和信息价值(IV)?
【发布时间】:2020-07-08 14:07:29
【问题描述】:

我想知道如何在 python 中计算 WOE 和 IV。 numpy/scipy/pandas/sklearn中是否有奉献功能?

这是我的示例数据框:

import numpy as np
import pandas as pd
np.random.seed(100)


df = pd.DataFrame({'grade': np.random.choice(list('ABCD'),size=(20)),
                   'pass': np.random.choice([0,1],size=(20))
})
df

【问题讨论】:

    标签: python pandas machine-learning


    【解决方案1】:

    woe 和 iv 的公式:

    实现这一点的代码:

    import numpy as np
    import pandas as pd
    np.random.seed(100)
    
    
    df = pd.DataFrame({'grade': np.random.choice(list('ABCD'),size=(20)),
                       'pass': np.random.choice([0,1],size=(20))
    })
    
    feature,target = 'grade','pass'
    df_woe_iv = (pd.crosstab(df[feature],df[target],
                          normalize='columns')
                 .assign(woe=lambda dfx: np.log(dfx[1] / dfx[0]))
                 .assign(iv=lambda dfx: np.sum(dfx['woe']*
                                               (dfx[1]-dfx[0]))))
    
    df_woe_iv
    

    输出

    pass     0    1       woe        iv
    grade                              
    A      0.3  0.3  0.000000  0.690776
    B      0.1  0.1  0.000000  0.690776
    C      0.2  0.5  0.916291  0.690776
    D      0.4  0.1 -1.386294  0.690776
    
    

    【讨论】:

    • 看来iv的值会在python3第二次运行后计算出来。我必须写两次 assign(..) 来解决这个问题:df_woe_iv = (pd.crosstab(df[feature],df[target], normalize='columns') .assign(woe=lambda dfx: np.log(dfx[1] / dfx[0])) df_woe_iv = df_woe_iv.assign(iv=lambda dfx: np.sum(dfx['woe']* (dfx[1]-dfx[0]))))。无论如何,这是一个很好的解决方案
    • 嗨@Bhishan - 我得到infinitywoeiv。可能是因为我没有负面类的记录吗? woeiv 是否应该在两个类中都存在实例以生成
    • woe value is negative,我也得到inf。在使用 woeiv 之前我应该​​注意什么标准
    【解决方案2】:

    Weight of Evidence (WOE)

    证据权重表示自变量相对于因变量的预测能力。由于它是从信用评分世界演变而来的,因此通常被描述为区分好客户和坏客户的衡量标准。 “不良客户”是指拖欠贷款的客户。而“好客户”是指还清贷款的客户。

    许多人不理解商品/坏品这两个术语,因为他们的背景与信用风险不同。从事件和非事件的角度来理解 WOE 的概念是很好的。它的计算方法是取非事件百分比和事件百分比除以自然对数(以 e 为底的对数)。

    Information value

    信息价值是在预测模型中选择重要变量的最有用的技术之一。它有助于根据变量的重要性对变量进行排名。 IV 使用以下公式计算:

    模式详解WEIGHT OF EVIDENCE (WOE) AND INFORMATION VALUE (IV) EXPLAINED

    Python 实现

    def iv_woe(data, target, bins=10, show_woe=False):
        
        #Empty Dataframe
        newDF,woeDF = pd.DataFrame(), pd.DataFrame()
        
        #Extract Column Names
        cols = data.columns
        
        #Run WOE and IV on all the independent variables
        for ivars in cols[~cols.isin([target])]:
            if (data[ivars].dtype.kind in 'bifc') and (len(np.unique(data[ivars]))>10):
                binned_x = pd.qcut(data[ivars], bins,  duplicates='drop')
                d0 = pd.DataFrame({'x': binned_x, 'y': data[target]})
            else:
                d0 = pd.DataFrame({'x': data[ivars], 'y': data[target]})
    
            
            # Calculate the number of events in each group (bin)
            d = d0.groupby("x", as_index=False).agg({"y": ["count", "sum"]})
            d.columns = ['Cutoff', 'N', 'Events']
            
            # Calculate % of events in each group.
            d['% of Events'] = np.maximum(d['Events'], 0.5) / d['Events'].sum()
    
            # Calculate the non events in each group.
            d['Non-Events'] = d['N'] - d['Events']
            # Calculate % of non events in each group.
            d['% of Non-Events'] = np.maximum(d['Non-Events'], 0.5) / d['Non-Events'].sum()
    
            # Calculate WOE by taking natural log of division of % of non-events and % of events
            d['WoE'] = np.log(d['% of Events']/d['% of Non-Events'])
            d['IV'] = d['WoE'] * (d['% of Events'] - d['% of Non-Events'])
            d.insert(loc=0, column='Variable', value=ivars)
            print("Information value of " + ivars + " is " + str(round(d['IV'].sum(),6)))
            temp =pd.DataFrame({"Variable" : [ivars], "IV" : [d['IV'].sum()]}, columns = ["Variable", "IV"])
            newDF=pd.concat([newDF,temp], axis=0)
            woeDF=pd.concat([woeDF,d], axis=0)
    
            #Show WOE Table
            if show_woe == True:
                print(d)
        return newDF, woeDF
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2015-06-13
      • 2021-12-31
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多