随笔 - 384  文章 - 0  评论 - 35  阅读 - 142万

交互决策树

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   小小喽啰  阅读(393)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-09-08 sklearn.model_selection.RandomizedSearchCV随机搜索超参数
2020-09-08 网格搜索的两个用法
2020-09-08 sklearn.model_selection.validation_curve 验证曲线
2020-09-08 sklearn.model_selection.learning_curve学习曲线
2020-09-08 sklearn.pipeline.Pipeline管道简化工作流
2020-09-08 什么时候需要做数据标准化
2020-09-08 决策树_信息熵
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示