构造决策树及决策树的可视化
使用ID3算法画出的决策树
ID3算法在进行特征划分时会优先选择信息增益最大的特征进行划分。一旦按某特征切分后,该特征在之后的算法执行中,将不再起作用(即不再考虑这个特征)。在这个特征划分后的样本中选择信息增益最大的其他特征,这样一步步划分下去。
决策树算法的核心是要解决两个问题:
1)如何从数据表中找出最佳节点和最佳分枝?
2)如何让决策树停止生长,防止过拟合。(预剪枝和后剪枝)
Sklearn中的分类决策树
Sklearn中的分类回归树的调用如下:
from sklearn import tree
#定义模型
model = tree.DecisionTreeClassifier()
#加载训练集、训练模型
model.fit(dataSet,labels)#训练集及训练集的标签(类别)
DecisionTreeClassifier常用参数
criterion,不确定性的计算方式,默认”gini” 可以输入“gini”和“entropy”,“gini”对应CART算法的基尼系数,“entropy”对应(ID3)信息增益。在实际使用中,信息熵和基尼系数的效果基本相同,但信息熵涉及对数计算,模型会慢一些。实际使用时,大多保持默认“gini”设置
max_depth,树的最大深度,默认”None” 该参数用来限制树过拟合的剪枝参数,超过指定深度的树枝全部被剪掉。当为“None”是,决策树将将会自由生长。决策树首要调整的剪枝参数,实际使用时,在没有经验的情况下,可以参考从3开始调整。
Sklearn中的分类决策树:数据二值化
注意点:
model.fit(dataSet,labels)#训练集及训练集的标签(类别)
(1)因为决策树只能分析数据,不能分析字符,即dataset必须为数据,而不能为字符串,如果是字符串形式的要转化为数据。
(2)labels即样本点所属的类别,虽然没有明确要求不能为字符,但是我们也一般转化为数据,而不是采用字符的形式。
(3)因为sklearn中画出的决策树,都是二叉树的形式,所以我们需要将数据二值化,可以更好的表达二叉树
例子:
中间数据
(1)将原先csv表格的数据转化为如下的形式。字典列表
[{'age': 'youth', 'income': 'high', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'youth', 'income': 'high', 'student': 'no', 'credit_rating': 'excellent'}, {'age': 'middle_age', 'income': 'high', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'medium', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'low', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'low', 'student': 'yes', 'credit_rating': 'excellent'}, {'age': 'middle_age', 'income': 'low', 'student': 'yes', 'credit_rating': 'excellent'}, {'age': 'youth', 'income': 'medium', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'youth', 'income': 'low', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'medium', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'youth', 'income': 'medium', 'student': 'yes', 'credit_rating': 'excellent'}, {'age': 'middle_age', 'income': 'medium', 'student': 'no', 'credit_rating': 'excellent'}, {'age': 'middle_age', 'income': 'high', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'medium', 'student': 'no', 'credit_rating': 'excellent'}]
(2)vec = DictVectorizer()#这个类是专门将这种形式的字符转化为数字
vec.fit_transform(字典列表).toarray()
例: vec.fit_transform(featureList).toarray()#将原先的字典列表转化为矩阵
注:使用DictVectorizer对使用字典存储的数据进行特征抽取和向量化
决策树可视化
import graphviz
dot_data = tree.export_graphviz(model,#训练后的模型
out_file=None,#输出文件,none代表没有
feature_names=vec.get_feature_names(),#特征的名称
class_names=lb.classes_,#标签名字
filled=True,#由颜色标识不纯度
rounded=True,#树节点为圆角矩形
special_characters=True)
#在tree.export_graphviz()中,会生成dot文件
graph = graphviz.Source(dot_data)#利用graphviz模块的Source()函数可以将其转化为gv文件
模型可视化
决策树的绘图方法:
sklearn.tree.export_graphviz(… …)
dtModel:决策树模型
out_file:图形数据的输出路径
class_names:目标属性的名称,一般用于中文化
feature_names:特征属性的名称,一般用于种文化
filled= True :是否使用颜色填充
rounded=True:边框是否采用圆角边框
special_characters: 是否有特殊字符