决策树(Decision Tree)
决策树利用特征的值将数据分解成具有相似类的较小的子集,这种递归划分的探索法称之为分而治之。
Decision Tree
如果一个节点停止,它可能有以下几种情况:
1.节点上所有(几乎所有)的案例都属于同一类
2.没有剩余的特征来分辨案例之间的区别
3.决策树已经到达预先定义的大小限制
划分选择
希望决策树的分支结点所包含的样本尽可能属于同一类别
1.信息熵(Information Entropy)
信息熵是度量样本集合纯度最常用的指标 / 可用于量化数字信息的价值。熵的值越小,则样本集合纯度越高。
某随机事件结果的种类越多,则该事件的熵越大。某随机事件的各种可能发生的结果概率越均匀,则该事件的熵越大。
2.信息增益(Information Gain) ID3决策树学习算法
一般而言,信息增益越大,则意味着使用属性α来进行划分所获得的“纯度提升”越大。
3.增益率(Gain Ratio) C4.5决策树学习算法
C4.5先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率高的。
4..基尼指数(Gini Index) CART决策树学习算法
基尼指数值越小,数据集纯度越高。
剪枝处理
如果决策树增长过大,将会使许多决策树过于具体,模型将会过度拟合训练数据。
解决方法:剪枝
1.预剪枝
当决策树达到一定数量的决策,或者决策节点仅含有少量的案例,我们就停止树的增长。
(在决策树的生成过程中,对每个结点在划分前先进行估计,如果当前结点的划分不能带来决策树泛华性能提升,则停止划分并将当前结点标记为叶结点。)
2.后剪枝
如果一颗决策树生长得过大,就根据节点处的错误率使用修剪准则将决策树减小到合适的大小
(先从训练集生成一颗完整的决策树,然后自底而上地对非叶结点进行考察,如果将该结点对应的子树替换为叶结点能决策树泛华性能提升,则将该子树替换为叶结点)
C5.0算法优点之一就是它可以自动剪枝,即它关注许多决策,能自动使用相对合理的默认值。
max_depth:树的最大深度
min_samples_split:继续分裂一个结点最少需要的训练样本数min_samples_leaf:叶子结点最少含有的训练样本数max_leaf_nodes:叶子结点的最大总数
min_impurity_decrease:用于计算叶子结点的最小纯度
这些参数可如何控制分裂结点特征的选取和防止过度拟合的训练后剪枝。
例子
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier(criterion="entropy")#初始化用熵模型
clf = clf.fit(X, Y) #训练
print(clf.predict([[2, 2]])) #预测
print(clf.feature_importances_) #查看特征重要性
#用决策树对鸢尾花分类
from sklearn.datasets import load_iris
iris=load_iris()
iris_feature=iris.data #特征数据
iris_target=iris.target #分类数据
print(iris.target) #被分为了3类,前50位0,中间50为1,后面为2
print(iris.data.shape) #150个样本,每个样本4个特征
from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier() #所有参数为默认
dtc.fit(iris.data,iris.target) #对训练集训练数据
predict=dtc.predict(iris.data) #对测试集进行预测
print(predict)
#把分类好的数据集绘制散点图
X=iris.data
C1=[x[0] for x in X]
C2=[x[1] for x in X]
import matplotlib.pyplot as plt
plt.scatter(C1,C2,c=predict,marker='x')
plt.title("Decision Tree Classifier")
plt.show()
树的可视化
需下载graphviz
网友评论