手把手教你用scikit-learn决策树算法库画出决策树

原创 2018年04月16日 13:50:10

想了解决策树的原理,可以看我关于决策树理论的介绍

参数的介绍

共同参数 含义
max_depth 决策树最大深度:默认可以不输入,决策树在生成的时候不会限制树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
max_features 划分时考虑的最大特征数:默认是”None”,意味着划分时考虑所有的特征数。可以使用很多种类型的值,如果是”log2”意味着划分时最多考虑log2N个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
max_leaf_nodes 最大叶子节点数:默认是”None”,即不限制最大的叶子节点。通过限制最大叶子节点数,可以防止过拟合,数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
min_samples_split 内部节点再划分所需最小样本数:默认是2,适合样本量不大的情况。这个参数限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。如果样本量数量级非常大,则推荐增大这个值。
min_samples_leaf 叶子节点最少样本数:默认为1,这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
min_weight_fraction_leaf 叶子节点最小的样本权重和:默认为0.0,就是不考虑权重问题。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
min_impurity_split 节点划分最小不纯度:默认为None。这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点,即为叶子节点 。
presort 数据是否预排序:默认是False,不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。
splitter 特征划分点选择标准:默认的”best”,适合样本量不大的时候。可以使用”best”或者”random”。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。而如果样本数据量非常大,此时决策树构建推荐”random”
不同参数 含义 分类 回归
criterion 特征选择标准 可以使用”gini”或者”entropy”,前者代表基尼系数,后者代表信息增益。一般说使用默认的基尼系数”gini”就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。 可以使用”mse”或者”mae”,前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的”mse”。一般来说”mse”比”mae”更加精确。除非你想比较二个参数的效果的不同之处。
class_weight 类别权重 指定样本各类别的的权重,默认是None。为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别,可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。如果你的样本类别分布没有明显的偏倚,使用默认即可

小试牛刀

分类树:DecisionTreeClassifier

DecisionTreeClassifier 是能够在数据集上执行多分类的类。采用输入两个数组:数组X,用 [n_samples, n_features] 的方式来存放训练样本。整数值数组Y,用 [n_samples] 来保存训练样本的类标签:

Step1:安装Graphviz,graphviz和pydotplus包(如果已经安装Graphviz,请跳过第一步)

brew install Graphviz 
pip3 install graphviz
pip3 install pydotplus

Step2:

from sklearn import tree
from sklearn.datasets import load_iris
from IPython.display import Image
import pydotplus

# 使用iris数据
iris=load_iris()
# 生成决策分类树实例
clf = tree.DecisionTreeClassifier()
# 拟合iris数据
clf = clf.fit(iris.data, iris.target)
# 预测类别
clf.predict(iris.data[:1, :])
# 分别预测属于所有类别的可能性
clf.predict_proba(iris.data[:1, :])
# 可视化决策树
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())

画出来的决策树

回归树:DecisionTreeRegressor

from sklearn.tree import DecisionTreeRegressor
import numpy as np 

# 生成一个随机数据集
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(16))

# 训练模型
tree1 = DecisionTreeRegressor(max_depth=2)
tree2 = DecisionTreeRegressor(max_depth=5)
tree1.fit(X, y)
tree2.fit(X, y)

# 预测
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y1 = tree1.predict(X_test)
y2 = tree2.predict(X_test)

# 画出结果
plt.figure()
plt.scatter(X, y, s=20, edgecolors='black',
           c='darkorange', label='data')
plt.plot(X_test, y1, color="cornflowerblue",
         label="max_depth=2", linewidth=2)
plt.plot(X_test, y2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

一些trick

  1. 样本数少而特征很多的数据生成的决策树容易过拟合,降维算法( PCA , ICA)可以更好地找到具有分辨性的特征,减少过拟合。
  2. 通过可视化决策树,可以直观的了解特征对结果的影响
  3. 从 max_depth=3 开始,观察决策树拟合情况,慢慢增加深度
  4. 通过使用 min_samples_split 和 min_samples_leaf 来控制叶节点上的样本数量。过小的值生成的决策树容易过拟合,过大的值生成的决策树容易欠拟合。可以从 min_samples_leaf=5 开始慢慢增加。
  5. 在训练模型前,注意观察样本的类别情况,如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
  6. 所有的决策树内部使用 np.float32 数组 ,如果训练数据不是这种格式,将会复制数据集。如果输入的矩阵X为稀疏矩阵,建议在调用fit之前将矩阵X转换为稀疏的’csc_matrix’ ,在调用predict之前将 csr_matrix 稀疏。当特征在大多数样本中具有零值时,与密集矩阵相比,稀疏矩阵输入的训练时间可以快几个数量级。

手把手教你用Project管理项目

-
  • 1970年01月01日 08:00

Python机器学习算法库——决策树(scikit-learn学习 - 决策树)

决策树决策树(DTs)是一种用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过从数据特性中推导出简单的决策规则来预测目标变量的值。 例如,在下面的例子中,决策树通过一组if-then-el...
  • Yeoman92
  • Yeoman92
  • 2017-06-18 20:24:20
  • 2156

决策树ID3、C4.5、C5.0以及CART算法之间的比较-并用scikit-learn决策树拟合Iris数据集

引言在这篇文章中,我主要介绍一下关于信息增益,并比较ID3、C4.5、C5.0以及CART算法之间的不同,并给出一些细节的实现。最后,我用scikit-learn的决策树拟合了Iris数据集,并生成了...
  • xlinsist
  • xlinsist
  • 2016-05-21 20:57:55
  • 12954

scikit-learn学习之决策树算法

决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。...
  • Gamer_gyt
  • Gamer_gyt
  • 2016-04-23 20:44:38
  • 13899

第6节--决策树算法实现(scikit-learn)

1、python本课程的机器学习的算法都是基于python语言实现的,所以你需要有一定的python语言基础,可以参考彭亮在麦子学院讲授的“Python语言编程基础”。2、python机器学习的库:s...
  • youyuyixiu
  • youyuyixiu
  • 2016-10-22 21:36:45
  • 1589

用Python和scikit-learn来介绍机器学习

用Python和scikit-learn来介绍机器学习用Python和scikit-learn来介绍机器学习 数据加载 数据正则化 特征选择 算法开发 LR 朴素贝叶斯 K最近邻 决策树 支持向量机 ...
  • u010046690
  • u010046690
  • 2016-05-17 15:31:05
  • 778

Matlab实现决策树算法进行数字识别

决策树是一个与流程图相似的树状结构;其中,每一个内部结点都是对一个属性的测试,每一个分枝代表一个结果输出,而每个树叶结点代表一个特定的类或者类的分布。决策树最顶层结点称作根结点。一棵典型的决策树如图1...
  • geyalu
  • geyalu
  • 2015-11-20 19:46:56
  • 2932

手把手教你用Vensim建模

  • 2015年05月31日 20:11
  • 8.55MB
  • 下载

java写的决策树算法(数据挖掘算法)

import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.u...
  • yue1183283159
  • yue1183283159
  • 2013-05-07 22:45:39
  • 8537
收藏助手
不良信息举报
您举报文章:手把手教你用scikit-learn决策树算法库画出决策树
举报原因:
原因补充:

(最多只允许输入30个字)