交互决策树

1、介绍

‘’主要用于增强单个变量的iv值,原来我们得到一个变量分箱之后的iv值,但是效果不是特别好,我们想要通过组合另外一个变量,来使得我们的效果最好,通过二分法去实现‘’

可以简单理解为做组合变量

下面我们看看怎么做

2、先导入数据

本次使用的数据GiveMeSomeCredit,数据地址:https://www.kaggle.com/brycecf/give-me-some-credit-dataset?select=cs-test.csv

import pandas as pd
import numpy as np

data = pd.read_csv('cs-training.csv')

#删除没有用的列
data = data.iloc[:,1:]

3、交互决策树

本次内部模块

cols = ['RevolvingUtilizationOfUnsecuredLines', 'age',
       'NumberOfTime30-59DaysPastDueNotWorse', 'DebtRatio', 'MonthlyIncome',
       'NumberOfOpenCreditLinesAndLoans', 'NumberOfTimes90DaysLate',
       'NumberRealEstateLoansOrLines', 'NumberOfTime60-89DaysPastDueNotWorse',
       'NumberOfDependents']

data = data.rename(columns={'SeriousDlqin2yrs':'y'})

开始代码,前面2个参数分别是特别和target,第三个参数是决策树图片的路径已经图片名字

#help(pc.interact_tree) 查看用法 pc.interact_tree??查看源码,路径不要写错
root1=pc.interact_tree(data[cols],data.y,'tree')  
root1.split_info_

 

 第一列是变量名称,第二列是根据节点分裂后的信息增益,第三列是切点,第四列是空值在二叉树的左边还是右边或者该变量根本没有空值。

由此可看我们可以让树这样生成

root1.grow('NumberOfTimes90DaysLate <= 0')

然后再看看下面的树怎么生长好

root1.split_rank()

 

 这个和前面的图差不多,只不过多了一列在哪个树叶节点生长。

root1.get_node(3).grow('NumberOfTimes90DaysLate <= 1.0')

上面的mode_id=3,因此上面这样表达

下面我们看看经过2次生长后的树的效果,其实就是组合变量的iv

root1.cal_woe_df()

 

上面这个例子有点尴尬,因为2次生长都是同一个变量,但是还是可以参考。

我们还可以导出决策树的表达式,方便后续数据验证

root1.generate_tree_code()

#输出
def tree(row):
    if row["NumberOfTimes90DaysLate"] <= 0: 
        node = "TreeNode_2" 
    else: 
        if row["NumberOfTimes90DaysLate"] <= 1.0: 
            node = "TreeNode_6" 
        else: 
            node = "TreeNode_7" 
    return node

将规则转成成一个组合变量

def tree(row):
    if row["NumberOfTimes90DaysLate"] <= 0: 
        node = "TreeNode_2" 
    else: 
        if row["NumberOfTimes90DaysLate"] <= 1.0: 
            node = "TreeNode_6" 
        else: 
            node = "TreeNode_7" 
    return node
data['tree'] = data.apply(tree,axis=1)
pc.cross_woe(data['tree'],data.y)

 

 

4、与决策树比较

from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion='gini',max_depth=2,random_state=1)
tree.fit(data[cols].fillna(-9999),data.y)

## 决策树可视化
from pydotplus import graph_from_dot_data
from sklearn.tree import export_graphviz
dot_data = export_graphviz(tree,filled=True,class_names=['0','1'],
                          feature_names=cols,out_file=None)
graph = graph_from_dot_data(dot_data)
graph.write_png('DecisionTree.png')

我们看看二者生成的树,第一个树交互决策树,第二个普通的决策树

 

 

 

 

 5、交互决策树的优缺点

优点:方便做组合特征,且可将组合特征可视化,可导出树的生长代码,方便部署

缺点:决策树也可以做,容易被代替。

 

posted on 2022-09-08 15:14  小小喽啰  阅读(363)  评论(1编辑  收藏  举报