决策树-基于信贷数据集,使用sklearn中相关库实现决策树的构造
如下图数据集,住房 (1表示拥有住房,0表示没有住房) ;婚姻 (0表示单身1表示已婚,2表示离异) ;年收入一栏中单位为1000元; (拖欠贷款一栏0表示不拖欠,1表示拖欠)
- 讨论sklearn中tree.DecisionTreeClassifier()重要的参数有哪些,怎么调整;
- 使用tree.DecisionTreeClassifier()、 graphviz函数,选择合适的算法,构造并绘制决策树
在基于信贷数据集的决策树实验中,可知决策树模型的性能和泛化能力受到许多因素的影响,包括决策树的深度、节点划分的准则、样本数量等。并且,注意tree.DecisionTreeClassifier()的重要参数,以及使用graphviz函数将构造出的决策树导出为DOT格式描述,并使用该库将其可视化展示。
(a)sklearn中tree.DecisionTreeClassifier()重要的参数有:
- criterion(划分质量指标):表示衡量划分质量的指标,常用的有基尼系数(gini)和信息熵(entropy)两种,默认为基尼系数。默认值为"gini",也可以选择"entropy"。可以通过设置不同的准则来调整模型的复杂度和性能。
- Splitter(选择节点分裂的策略):用于选择节点分裂的策略。默认值为"best",表示选择最优的分裂点。也可以选择"random",表示随机选择分裂点。通过选择不同的策略,可以调整模型的随机性和性能。
- min_samples_leaf(叶子节点所需最小样本数:表示叶子节点最少需要的样本数,默认为1,表示叶节点至少包含1个样本。如果某个叶子节点的样本量太小,则会和其他叶子节点合并。可以通过设置最小样本数来控制模型的复杂度和防止过拟合。
- min_samples_split(内部节点划分所需最小样本数):表示划分一个内部节点需要的最小样本数,默认为2,表示至少需要2个样本才能进行分裂,如果样本量太小则不适合使用决策树。可以通过增加或减少最小样本数来控制模型的复杂度和防止过拟合。
- max_features(划分时考虑的最大特征数):表示在划分数据集时考虑的最大特征数,默认为 None,即考虑所有特征。可以选择"auto",表示考虑所有特征的平方根;"sqrt",表示考虑所有特征的平方根;"log2",表示考虑所有特征的对数;或者一个整数值,表示考虑固定数量的特征。可以通过调整特征数量来控制模型的复杂度和性能。
- max_depth(最大深度):表示决策树的最大深度,用于防止过拟合,默认为 None,即不限制最大深度。可以通过设置最大深度来控制模型的复杂度和防止过拟合。
运行结果:
打开信贷.pdf出现
如若没有查看是否在终端pip安装了 pydotplus和graphviz
运行代码:
from sklearn import tree
import numpy as np
from io import StringIO
import pydotplus
X = np.array([[1, 0, 125],[0, 1, 100],[0, 0, 70],[1, 1, 120],
[0, 2, 95],[0, 1, 60],[1, 2, 220],[0, 0, 85],
[0, 1, 75],[0, 0, 90]])
y = np.array([[0], [0], [0], [0], [1],
[0], [0], [1], [0], [1]])
tree_model = tree.DecisionTreeClassifier(criterion='gini',
max_depth=None,
min_samples_leaf=1,
ccp_alpha=0.0)
tree_model.fit(X, y)
dot_data = StringIO()
feature_names = ['House', 'Marriage', 'Annual salary']
target_names = ['No default', 'Default']
tree.export_graphviz(tree_model,
out_file=dot_data,
feature_names=feature_names,
class_names=target_names,
filled=True,
rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("信贷.pdf")