【信用评分预测模型(五)】python决策树


前言

决策树算法本质上是通过一系列规则对数据进行分类的过程。有监督学习。

常见的决策树算法有ID3,C4.5,CART。

ID3:采取信息增益来作为纯度的度量。选取使得信息增益最大的特征进行分裂。
信息熵是代表随机变量的复杂度(不确定度),条件熵代表在某一个条件下,随机变量的复杂度(不确定度)。
而信息增益则是:信息熵-条件熵。
因此在计算过程中先算限制的复杂度,再减去某种条件分裂下的复杂度,选择增益最大的那种条件。信息熵和条件熵可以通过各类样本占样本集合的比例来计算出。
如果选择一个特征后,信息增益最大(信息不确定性减少的程度最大),那么我们就选取这个特征。
但缺点是信息增益准则其实是对可取值数目较多的属性有所偏好,比如按照编号分类的话信息增益一定是很大的,只要知道编号,其它特征就没有用了,但是这样生成的决策树显然不具有泛化能力。
为了解决这个问题,引入了信息增益率来选择最优划分属性。
C4.5:用信息增益率来选择属性。
信息增益率=信息增益/IV(a)
这里的IV(a)衡量了以a属性划分时分成的类别数量,分成的类别数越大,IV(a)就越大。
可以看出增益率准则其实对可取类别数目较少的特征有所偏好。
因此实际上的C4.5算法不直接选择增益率最大的候选划分属性,而是在候选划分属性中找出信息增益高于平均水平的属性(保证特征效果较好),再从中选择增益率最高的(保证了不会出现如通过编号特征分类这种极端的情况)。
CART:CART既能是分类树,又能是回归树。当CART是分类树时,采用GINI值作为分裂依据;当CART是回归树时,采用样本的最小方差作为分裂依据;
分类树通过对象特征预测对象所属的类别,而回归树根据对象信息预测该对象的属性(并以数值表示)。


提示:以下是本篇文章正文内容,下面案例可供参考

一、训练集测试集划分

x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.4,random_state=i1+1)
        x_test2,x_check,y_test2,y_check=train_test_split(x_test,y_test,train_size=0.25,random_state=i1+2)
        # x_train,x_check,y_train,y_check=train_test_split(x,y,random_state=i1+1)

在这里将数据进行测试集和训练集的拆分

二、模型训练

        for i in depth:
            # max_depth=4
            # 限制决策树深度可以降低算法复杂度,获取更精确值
            tree = DecisionTreeClassifier(max_depth=i,random_state=38) #可删除后面的random_state以实现随机
            # 开始训练
            tree.fit(x_train,y_train.astype('int'))
            # 训练集score
            accuracy_training=tree.score(x_train,y_train.astype('int'))
            # 测试集score
            accuracy_test=tree.score(x_check,y_check)
            # 平均score
            # average_accuracy=(accuracy_training+accuracy_test)/2.0
            print("depth %d accuracy on the check subset:" % (i),accuracy_training,'   ',accuracy_test)
            list_average_accuracy.append(accuracy_test)

在这里是定义一个函数进行模型的深度训练,设置迭代次数为50,这里的迭代次数可以自由选择,根据数据来选择。

三、选择最大深度索引

 max_value=max(list_average_accuracy)
        # 获得score最大深度对应的索引,索引是0开头,结果要加1,即深度best_depth
        best_depth=list_average_accuracy.index(max_value)+1
        print("best_depth:",best_depth)
        # 这里得到的是random=47时,
        index_of_best[best_depth]+=1
    print(index_of_best)

四、最优决策树构造

 把之前对应的for循环中的最优深度单独拿出来构造最优的树,并且输出
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.4,random_state=47)
x_test2,x_check,y_test2,y_check=train_test_split(x_test,y_test,train_size=0.25,random_state=48)
best_tree = DecisionTreeClassifier(max_depth=4,random_state=38)
best_tree = best_tree.fit(x_train,y_train)
accuracy_training=best_tree.score(x_train,y_train)
accuracy_test=best_tree.score(x_test,y_test)
print("decision tree:")
print("accuracy on the training subset:{:.3f}".format(best_tree.score(x_train,y_train)))
print("accuracy on the test subset:{:.3f}".format(best_tree.score(x_check,y_check)))
print(best_tree.predict(x_check))

# 作图
plt.figure(figsize=(14,8))
treeee.plot_tree(best_tree,fontsize=6)
# 这里可能会出现报错module 'sklearn.tree' has no attribute 'plot_tree',
# 原因是版本较低,要0.21以上才有,而一般的可能只是0.19版本
# 更新方式可以参考网上资料,此处不再赘述
plt.show()

在这里将结合前面所选择的最优深度进行组合。

总结

决策树的构造可以帮助我们更好的选取决策,迭代次数不是越大越好,也不是越简单越好,需要结合数据和根据经验来进行决策。

猜你喜欢

转载自blog.csdn.net/m0_65157892/article/details/129760554