1.概述
非参数监督学习方法,用以解决分类和回归问题。
2.内容
关键概念:根节点、中间节点、叶子节点、子节点和父节点
算法核心:寻找最佳节点和分支;让决策树停止生长防止过拟合
类型:tree.DecisionTreeClassifier
tree.DecisionTreeRegressor
3.建模流程
导库--实例化--训练集训练模型--导入测试集,从接口调用信息
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(x_train,y_tain) #fit方法
result = clf.score(x_test,y_test) #score方法
4,重要参数
criterion:决定决策树的计算不纯度方法:
信息熵(entropy) | 基于信息熵的信息增益,子夫节点信息熵之差,对不纯度更加敏感,但容易过拟合。 |
基尼系数(gini) | 不涉及对数运算,快一点(默认) |
splitter:选择用什么特征进行分支
best | 优先选择更重要的分支 |
random | 更加随机,树会因为不必要的信息更深更大,可以用来防止树过拟合 |
5.划分训练集和测试集
xtrain,xtest,ytrain,ytest = train_test_split(win.data,win.target,test_size = 0.3)
6.画出一棵树
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf #导入模型
,out_file=None
,feature_names=feature_name
,class_names=["琴酒","雪梨","贝尔摩德"]
,filled = True
,rounded = True
)
import graphviz #绘图工具
graph = graphviz.Source(dot_data)
graph
7.为何每次的树不同
我们之前提到过,无论决策树模型如何进化,在分枝上的本质都还是追求某个不纯度相关的指标的优化,而正如我 们提到的,不纯度是基于节点来计算的,也就是说,决策树在建树时,是靠优化节点来追求一棵优化的树,但最优 的节点能够保证最优的树吗?集成算法被用来解决这个问题:sklearn表示,既然一棵树不能保证最优,那就建更 多的不同的树,然后从中取最好的。怎样从一组数据集中建不同的树?在每次分枝时,不从使用全部特征,而是随 机选取一部分特征,从中选取不纯度相关指标最优的作为分枝用的节点。这样,每次生成的树也就不同了。
8.决策树的剪枝
max_depth | 限制树的最大深度,有限限制过拟合 |
min_samples_leaf&min_samples_split | 一个节点最少包含多少个训练样本 |
max_features | 限制分支时考虑的特征个数 |
用学习曲线去剪枝参数:
import matplotlib.pyplot as plt
test = []
for i in range(10):
clf=tree.DecsionTreeClassifier(max_depth = i+1
,criterion = "entropy"
,random_state=30
,splitter="random"
)
clf = clf.fit(xtrain.ytrain)
score = clf.score(xtest,ytest)
plt.plot(range(1,11),test,color="red",lable="max_depth")
9.目标权重参数
class_weight | min_weight_fraction_leaf |
10.其他参数和接口
决策树最常用的接口还有apply和predict。apply中输入测试集返回每个测试样本所在的叶子节 点的索引,predict输入测试集返回每个测试样本的标签,返回的内容一目了然。
#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
#predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)