Python数据挖掘——决策树
sklearn中DecisionTree学习笔记
sklearn中的决策树算法包含 DecissionTreeClassifier 和 DecissionTreeRegression ,二者的的用法基本相同。
不同的是: 回归决策树里面的Y值可以是浮点数;criterrion 参数值不同。
sklearn.tree.DecisionTreeClassifier参数
-
criterion
特征选择标准: ‘gini’ or ‘entropy’ (default=”gini”),前者是基尼系数,后者是信息熵。
一般说使用默认的基尼系数”gini”就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。 -
splitter
特征划分点选择标准: ‘best’ or ‘random’ (default=”best”)
前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。
默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random” 。 -
max_depth
决策树的最大深度: int or None, optional (default=None)
一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。 -
min_samples_split
内部节点再划分所需最小样本数:int, float, optional (default=2)
如果是 int,则取传入值本身作为最小样本数;
如果是 float,则去 ceil(min_samples_split * 样本数量) 的值作为最小样本数,即向上取整。
这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 -
min_samples_leaf
叶子节点最少样本数: int, float, optional (default=1)
如果是 int,则取传入值本身作为最小样本数;
如果是 float,则去 ceil(min_samples_leaf * 样本数量) 的值作为最小样本数,即向上取整。
这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 -
min_weight_fraction_leaf
叶子节点最小的样本权重和:float, optional (default=0.)
这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。
默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。 -
max_features
划分时考虑的最大特征数:int, float, string or None, optional (default=None)
If int, then consider max_features features at each split.
If float, then max_features is a percentage and int(max_features * n_features) features are considered at each split.
If “auto”, then max_features=sqrt(n_features).
If “sqrt”, then max_features=sqrt(n_features).
If “log2”, then max_features=log2(n_features).
If None, then max_features=n_features. -
random_state
随机种子:int, RandomState instance or None, optional (default=None)
-
max_leaf_nodes
最大叶子节点数: int or None, optional (default=None)
通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。 -
class_weight
类别权重:dict, list of dicts, “balanced” or None, default=None
指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的”None”
不适用于回归树 sklearn.tree.DecisionTreeRegressor -
min_impurity_decrease
节点划分最小不纯度:float, optional (default=0.)
这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。
sklearn 0.19.1版本之前叫 min_impurity_split -
presort
数据是否预排序:bool, optional (default=False)
这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。
以上是模型参数的介绍,除此之外,还有些模型调参注意事项:
当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
推荐多用决策树的可视化(下节会讲),同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。
sklearn.tree.DecisionTreeClassifier实例
本实例使用iris数据集,该数据集包含了5个属性:
Sepal_Length(花萼长度),单位是cm;
Sepal_Width(花萼宽度),单位是cm;
Petal_Length(花瓣长度),单位是cm;
Petal_Width(花瓣宽度),单位是cm;
种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。
from sklearn import datasets
from sklearn import tree
# 加载iris数据集
iris = datasets.load_iris()
x = iris.data
y = iris.target
print(iris.feature_names) # 预览属性名称
print(iris.target_names) # 预览分类标签
# 拟合(训练)模型,限制最大深度为 4
cls = tree.DecisionTreeClassifier(max_depth=4)
cls.fit(x, y)
# 随机手写的几个测试数据,非正式样本
test_data = [[ 6.5, 2.3, 4.5, 1.4],
[ 4.9, 3. , 2.4, 0.2],
[ 7.3, 3.4, 5.6, 2.4],
[ 5.1, 3.5, 1.8, 1.3],
[ 7. , 3. , 5.0, 1.8]]
# 预测测试集分类
test_target = cls.predict(test_data)
print(test_target)
>>> array([1, 0, 2, 0, 2])
sklearn.tree.DecisionTreeClassifier模型可视化
决策树模型的可视化,可方便我们能直观的观察模型,以及发现模型中的问题。尤其是在调整、优化参数的时候,能方便的看到不同参数对模型的影响。
决策树可视化依赖环境配置
-
第一步:安装graphviz
linux 环境: 可以用apt-get或者yum的方法安装
windows 环境: 去官网 http://www.graphviz.org/ 下载 msi 文件安装,我下载的是 https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi ,然后双击安装即可
无论是linux还是windows,装完后都要设置环境变量,将graphviz的bin目录加到PATH,比如我是windows,将D:/Graphviz2.38/bin/加入了PATH。
第二步:安装python插件 graphviz: pip install graphviz
第三步:安装python插件pydotplus: pip install pydotplus
环境搭建好之后,在实际的代码中,依然可能会报异常,因此还需要在代码中添加
import os
os.environ["PATH"] += os.pathsep + 'D:/Graphviz2.38/bin/' # 注意后面的路径是你自己的graphviz的bin目录。
决策树可视化的方法
from sklearn import datasets
from sklearn import tree
import os
os.environ["PATH"] += os.pathsep + 'D:/Graphviz2.38/bin/'
# 加载iris数据集
iris = datasets.load_iris()
x = iris.data
y = iris.target
cls = tree.DecisionTreeClassifier(max_depth=4)
cls.fit(x, y)
接下来,我们有四种可视化方法:
- 第一种:
用 graphviz 生成 iris.pdf。与参考博文有所不同,这官网介绍的方法。
import graphviz
# dot_data = tree.export_graphviz(clf, out_file=None) # 未设置参数,输出黑白图
dot_data = tree.export_graphviz(cls, out_file=None, # 设置参数,输出彩色图;后边会输出两个图作为对照。
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("iris") # 参数是目标pdf文件路径,默认扩展名是 .pdf,无需主动添加。
# 没有路径只有名字的话,是保存在当前路径,文件名为 iris.pdf
- 第二种:
用 pydotplus 生成 iris.pdf。这样就不用再命令行去专门生成pdf文件了。
import pydotplus
dot_data = tree.export_graphviz(cls, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")
- 第三种:
第三种办法是原博主比较推荐的做法,因为这样可以直接把图产生在ipython的notebook。代码如下:
# 参考博文的方法
from IPython.display import Image
dot_data = tree.export_graphviz(cls, 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())
# 官网的方法
import graphviz
dot_data = tree.export_graphviz(cls, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph
- 第四种:
用graphviz的dot命令生成决策树的可视化文件,敲完这个命令后当前目录就可以看到决策树的可视化文件iris.pdf.打开可以看到决策树的模型图。
# 首先需要在python下将模型存入dot文件iris.dot
with open("iris.dot", 'w') as f:
f = tree.export_graphviz(cls, out_file=f)
# 接下来在 iris.dot 所在的目录打开命令行窗口,执行下面的命令即可。
# 注意,这个命令在命令行执行
dot -Tpdf iris.dot -o iris.pdf
输出黑白图与彩色图对照
- 黑白图
- 彩色图
结尾声明
以上是本人参考scikit-learn决策树算法类库使用小结以及官方文档所做的个人笔记,更详细的用法请读者参考原文。 如有侵权,请见谅。