交互决策树
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、交互决策树的优缺点
优点:方便做组合特征,且可将组合特征可视化,可导出树的生长代码,方便部署
缺点:决策树也可以做,容易被代替。