Python数据挖掘——决策树

时间:2021-04-19 21:55:21

sklearn中DecisionTree学习笔记

参考博文:scikit-learn决策树算法类库使用小结


sklearn中的决策树算法包含 DecissionTreeClassifierDecissionTreeRegression ,二者的的用法基本相同。
不同的是: 回归决策树里面的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

  • 第二步:安装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

输出黑白图与彩色图对照

  • 黑白图

Python数据挖掘——决策树

  • 彩色图

Python数据挖掘——决策树

结尾声明

以上是本人参考scikit-learn决策树算法类库使用小结以及官方文档所做的个人笔记,更详细的用法请读者参考原文。 如有侵权,请见谅。