模块 sklearn.tree
tree.DecisionTreeClassifier: 分类树
tree.DecisionTreeRegressor:回归树
tree.export.graphviz:将生成的决策树导出为DOT格式,画图专用,可以可视化展现决策树
tree.ExtraTreeClassifier:高随机版本的分类树
tree.ExtraTreeRegressor
决策树通过分类器集成的方式筛选出最终的决策树:多次随机选择一些特征进行决策树分类,得到多个决策树后选取拟合效果最好(score最高)的一个决策树模型。
每个节点的分类是依靠entropy和gini系数进行节点的划分,计算系数后得到不纯度,不纯度越低说明该节点内分类的数据越具备统一的标签。例如,有苹果、梨子、香蕉,该节点分类被归属于苹果,但其实内部仍然包含少部分的梨子和香蕉。当不纯度为0时,代表所有记录都为一个相同的标签,叶子(leaf)节点的不纯度为0。
clf = tree.DecisionTreeClassifier(criterion='entropy'[默认gini]
,random_state=30[按照一定规则选取特征,不会随机选取特征,输入相同的数值会生成同一棵树】
,splitter='random'【控制随机选择的特征的,分为random和best,best为决策树随机选择特征时会选择更重要的特征进行分枝,random为分枝时会更加随机,对选练级的拟合会降低,当过拟合时经常选用这个方式降低拟合】
,max_depth=3【树最大的层数(不包含root层),如果太大就会过拟合,太小就会underfit
,min_samples_leaf=10【节点的子节点至少包含10各训练样本,太大就会underfit,太小就会过拟合】
,min_samples_split=10【节点至少包含10各节点】)
clf=clf.fit(Xtrain,Ytrain)
score=clf.score(Xtest,Ytest)
import graphviz
feature_name=['a','b','c']
dot_data=tree.export_graphviz(clf, feature_name=feature_name,class_names=['a','b','v'],filled=True,rounded=True)
graph=graphviz.Source(dot_data)
注:feature_name是数据集的特征,class_names是记录的标签,filled是是否上颜色。
#决策树查看特征重要性
clf.feature_importance_
[zip(feature_name,clf.feature_importances_)]
import matplotlib.pyplot as plt
test=[]
for i in range(10):
clf=tree.DecisionTreeClassifier(max_depth=i+1
,criterion = "entropy"
,random_state=30)
clf=clf.fit(Xtrain,Ytrain)
score=clf.score(Xtest,Ytest)
test.append(score)
plt.plot(range(1,11),test,color='red',label='max_depth')
plt.legend()
plt.show()
遍历一下参数,选出最好的参数,不光是max_depth,也可以选择其他参数。
clf.apply(Xtest)#返回每个样本所在的叶子节点索引
clf.predict(Xtest)#返回每个样本的分类回归结果