决策树


算法原理

  在已知条件中,选取一个条件作为树根,然后再看是否还需要其他判断条件,如果需要的话,继续构建一个分支来判断第二个条件,以此类推。最终形成的这棵树上,所有叶子节点都是要输出的类别信息,所有非叶子节点都是特征信息

   决策树算法使用信息增益的方法来衡量一个特征和特征之间的重要性

  理想状态下,决策树上的每一个叶子节点都是一个纯粹的分类;实际上,决策树实现的时候采用贪心算法,来寻找一个最近的最优解

优点

1.非常直观,可解释极强

2.预测速度比较快

3.既可以处理离散值,也可以处理连续值,还可以处理缺失值

缺点

 1.容易过拟合

2.需要处理样本不均衡的问题

3.样本的变化会引发树结构的巨变

由于容易过拟合,所以会剪枝,一般用后剪枝

预剪枝:在决策树构建之初就设定一个阈值,当分裂节点的熵阈值小于设定值的时候就不再进行分裂

后剪枝:在决策树已经构建完成以后,再根据设定的条件来判断是否要合并一些中间节点,使用叶子节点来代替

#决策树
from sklearn import datasets #sklearn的数据集
from sklearn.tree import DecisionTreeClassifier #引入决策树算法包
import numpy as np #矩形运算库numpy

np.random.seed(0)
#设置随机种子,不设置的话默认是按系统时间作为参数,设置后可以保证我们每次产生的随机数是一样的

iris = datasets.load_iris() #获取鸢尾花数据集
iris_x = iris.data #数据部分
iris_y = iris.target #类别部分

#从150条数据中选取140条作为训练集,10条作为测试集。permutation接收一个数作为参数(这里为数据集长度150),
#产生一个0-149乱序一维数组
indices = np.random.permutation(len(iris_x))
iris_x_train = iris_x[indices[:-10]]  #训练集数据
iris_y_train = iris_y[indices[:-10]]  #训练集标签
iris_x_test = iris_x[indices[-10:]]   #测试集数据
iris_y_test = iris_y[indices[-10:]]   #测试集数据

#设置树的最大深度为4
clf = DecisionTreeClassifier(max_depth=4)

#调用该对象的训练方法,主要接收两个参数:训练数据集及其类别标签
clf.fit(iris_x_train,iris_y_train)

#引入图画相关的包
from IPython.display import Image
from sklearn import tree

#dot是一个程式化生成流程图的简单语言
import pydotplus
dot_data = tree.export_graphviz(clf,out_file=None,
                                feature_names=iris.feature_names,
                                class_names=iris.target_names,
                                filled=True,rounded=True,
                                special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
#对测试结果进行预测

iris_y_predict = clf.predict(iris_x_test)

#调用该对象的打分方法,计算出准确率
score = clf.score(iris_x_test,iris_y_test,sample_weight=None)

#输出测试结果
print('iris_y_predict=')
print(iris_y_predict)

#输出原始测试数据集的正确标签,以方便对比
print('iris_y_test=')
print(iris_y_test)

#输出准确率计算结果
print('Accuracy:',score)