skiti-learn决策树算法库

skiti-learn内部实现的是调优过的CART决策树。既可以做分类,也可以做回归。分类决策树采用的类是DecisionTreeClassifier,回归则是DecisionTreeRegressor。

  1. DecisionTreeClassifier and DecisionTreeRegressor重要参数调参
    1).特征选择标准criterion:
    DecisionTreeClassifier:可以使用‘gini’(基尼指数),或者‘entropy’(信息增益),一般使用默认的基尼指数‘gini’,(CART算法)。
    DecisionTreeRegressor:可以使用‘mse’(均方差),或者‘mae’(和均值之差的绝对值之和),推荐使用默认的‘mse’。一般来说‘mse’比‘mae’更精确。
    2).特征划分点选择标准splitter:
    可以使用‘best’(在所有划分点中找出最优划分点),或者‘random’(随机部分划分点中找到局部最优划分点)。默认的‘best’适合样本量不大时,样本量非常大时,推荐‘random’
    3).划分时考虑的最大特征数max_features:
    默认的‘None’,意味着划分时考虑所有特征数;‘log2’意味划分最多考虑log2N个特征;‘sqrt’或者‘auto’划分时最多考虑√N个特征;如果是整数,代表考虑特征的绝对数;如果是浮点数,代表考虑特征的百分比,即考虑百分比*N取整后的特征值。特征数不多,比如小于50,可以采用默认的‘None’,如果特征数特别多,可以灵活采用其他参数来控制划分时考虑最大特征数,以控制决策树生成的时间。
    4).决策树最大深max_depth:
    决策树的最大深度,默认可以不输入。数据少或者特征少的情况下,不去管这个值。如果样本和特征数量都多的情况下,推荐限制这个深度,具体取值取决于数据的分布,常用取值10-100之间。
    5).内部结点再划分所需的最小样本数min_simples_split:
    这个值限制了子树继续划分的条件,如果某结点的样本数少于min_simples_split则不会继续选择最优特征进行划分。默认为2,如果样本量不大,不需管这个值。样本数量非常大则推荐增大这个值。
    6).叶子节点最少的样本数min_simples_leaf:
    这个值限制了叶子节点最少的样本数,如果叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
    7).叶子节点最小的样本权重和min_weight_fraction_leaf:
    这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
    8).最大叶子节点数max_leaf_nodes:
    通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
    9).类型权重class_weight:
    DecisionTreeClassifier:指定样本各类别的权重,防止训练集某些样本过多,导致训练的决策树过于偏向于这些类别。我们可以指定类别的权重,或者用‘balance’(自动计算样本的权重,样本少的权重会高),如果样本没有明显的偏倚,可以不管这个参数,选择默认的‘None’。
    DecisionTreeRegressor:不适用于回归树。
    10).节点划分最小不纯度 min_impurity_split:
    这个值限制了决策树的增长,当某节点的不纯度(基尼指数,信息增益,均方差,绝对差)小于某个阈值,则不再生成子节点。
    11).数据是否预排序presort:
    这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,速度本来就不慢。
  2. 调参注意点:
    1)当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
    2)如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
    3)推荐多用决策树的可视化,同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
    4)在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
    5)决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
    6)如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。
  3. 决策树结果的可视化
    skiti-learn决策树的可视化一般需要安装graphviz。
    可视化的三种方法:
    第一种是用graphviz的dot命令生成决策树的可视化文件,敲完这个命令后当前目录就可以看到决策树的可视化文件iris.pdf.打开可以看到决策树的模型图。
from sklearn.datasets import load_iris
from sklearn import tree
import sys
import os
os.environ["PATH"]+=os.pathsep+'C:/Program Files (x86)/Graphviz2.38/bin/'


iris=load_iris()
clf=tree.DecisionTreeClassifier()
clf=clf.fit(iris.data,iris.target)

with open("iris.dot",'w') as f:
	f=tree.export_graphviz(clf,out_file=f)


#注意,这个命令在命令行执行
dot -Tpdf iris.dot -o iris.pdf

第二种方法是用pydotplus生成iris.pdf

import pydotplus
dot_data=tree.export_graphviz(clf,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(clf, out_file=None,
				feature_names=iris.feature_names,
				class_name=iris.target_names,
				filled=True,rounded=True,
				special_characters=True)
graph=pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())

DecisionTreeClassifier实例

from itertools import product

import numpy as np
import matplotlib.pyplot as plt

from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier


# 仍然使用自带的iris数据
iris = datasets.load_iris()
X = iris.data[:, [0, 2]]
y = iris.target

# 训练模型,限制树的最大深度4
clf = DecisionTreeClassifier(max_depth=4)
#拟合模型
clf.fit(X, y)


# 画图
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.show()



#可视化我们的决策树,使用了第三种方法
from IPython.display import Image  
from sklearn import tree
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()) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值