1、scikit-learn决策树算法类库介绍

    scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归。分类决策树的类对应的是DecisionTreeClassifier,而回归决策树的类对应的是DecisionTreeRegressor。两者的参数定义几乎完全相同,但是意义不全相同。下面就对DecisionTreeClassifier和DecisionTreeRegressor的重要参数做一个总结,重点比较两者参数使用的不同点和调参的注意点。

2、DecisionTreeClassifier和DecisionTreeClassifier 重要参数调参注意点

DecisionTreeClassifier(criterion='gini',splitter='best',max_depth=None,min_samples_split=2,min_samples_leaf=1,min_weight_fraction_leaf=0.0,max_features=None,random_state=None,max_leaf_nodes=None,min_impurity_split=1e-07,class_weight=None,presort=False)

2.1 特征选择标准criterion

    DecisionTreeClassifier:可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。默认的基尼系数"gini"是CART算法。若用ID3, C4.5的"entropy"最优特征选择方法。 DecisionTreeRegressor:可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。

2.2 特征划分点选择标准splitter

    可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random"

2.3 划分时考虑的最大特征数max_features

    可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑sqrt(N)个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

2.4 决策树最大深度max_depth

    决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。(所有叶子都是纯的或直到所有叶子包含少于min_samples_split的样本。)

2.5 内部节点再划分所需最小样本数min_samples_split

    这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。

2.6 叶子节点最少样本数min_samples_leaf

    这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。之前的10万样本项目使用min_samples_leaf的值为5,仅供参考。

2.7 叶子节点最小的样本权重和min_weight_fraction_leaf

    这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

2.8 最大叶子节点数max_leaf_nodes

    通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

2.9 类别权重class_weight

    不适用于回归树。指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None"

2.10 节点划分最小不纯度min_impurity_split

    这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。

2.11 数据是否预排序presort

    这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。

除了这些参数要注意以外,其他在调参时的注意点有:

1)当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型

2)如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。

3)推荐多用决策树的可视化(下节会讲),同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。

4)在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。

5)决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。

6)如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。


实例

  1. 导入数据
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import os,sys
from sklearn import datasets
from sklearn import tree
from sklearn.datasets import load_irisos.chdir('/Users/cc/Documents/') #用于改变当前工作目录到指定的路径
data1=pd.read_csv('cc_repay_fea_0831.csv')X = pd.concat([data1['app_p2p_num_6m'],data1['mth_rate_amt1_amt3'],data1['bad_rate'],data1['cnt_contact_call_6m']],axis=1)
y=data1['dpd7']# 训练模型,限制树的最大深度3,叶子节点最小样本比例10%,划分时考虑的最大特征数为2clf = tree.DecisionTreeClassifier(max_features=3,min_samples_leaf=0.1,max_depth=3)
#拟合模型
clf.fit(X, y)

3 画图

3.1 画图的参数

export_graphviz(decision_tree, out_file="tree.dot", max_depth=None, feature_names=None, class_names=None, label='all', filled=False, leaves_parallel=False, impurity=True, node_ids=False, proportion=False, rotate=False, rounded=False, special_characters=False, precision=3)

3.1.1 decision_tree

decision tree classifierThe decision tree to be exported to GraphViz.

3.1.2 out_file

file object or string, optional (default='tree.dot') Handle or name of the output file. If ``None``, the result is returned as a string. This will the default from version 0.20
 : out_file : file object or string, optional (default='tree.dot')Handle or name of the output file. If ``None``, the result isreturned as a string. This will the default from version 0.20.max_depth : int, optional (default=None)The maximum depth of the representation. If None, the tree is fullygenerated.feature_names : list of strings, optional (default=None)Names of each of the features.class_names : list of strings, bool or None, optional (default=None)Names of each of the target classes in ascending numerical order.Only relevant for classification and not supported for multi-output.If ``True``, shows a symbolic representation of the class name.label : {'all', 'root', 'none'}, optional (default='all')Whether to show informative labels for impurity, etc.Options include 'all' to show at every node, 'root' to show only atthe top root node, or 'none' to not show at any node.filled : bool, optional (default=False)When set to ``True``, paint nodes to indicate majority class forclassification, extremity of values for regression, or purity of nodefor multi-output.leaves_parallel : bool, optional (default=False)When set to ``True``, draw all leaf nodes at the bottom of the tree.impurity : bool, optional (default=True)When set to ``True``, show the impurity at each node.node_ids : bool, optional (default=False)When set to ``True``, show the ID number on each node.proportion : bool, optional (default=False)When set to ``True``, change the display of 'values' and/or 'samples'to be proportions and percentages respectively.rotate : bool, optional (default=False)When set to ``True``, orient tree left to right rather than top-down.rounded : bool, optional (default=False)When set to ``True``, draw node boxes with rounded corners and useHelvetica fonts instead of Times-Roman.special_characters : bool, optional (default=False)When set to ``False``, ignore special characters for PostScriptcompatibility.precision : int, optional (default=3)Number of digits of precision for floating point in the values ofimpurity, threshold and value attributes of each node.
#####画图:
import pydotplus
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")

参考:
https://www.jianshu.com/p/0724dde480f0

scikit-learn决策树相关推荐

  1. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  2. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  3. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  4. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

    之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址] 这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别. 数据说明: 数据共有785列,第一列 ...

  5. 【scikit-learn】如何用Python和SciKit Learn 0.18实现神经网络

    本教程的代码和数据来自于 Springboard 的博客教程.本文的作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:https://g ...

  6. python scikit learn 关闭开源_scikit learn 里没有神经网络?

    本教程的代码和数据来自于 Springboard 的博客教程,希望能为你提供帮助.作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:ht ...

  7. scikit - learn 做文本分类

    文章来源: https://my.oschina.net/u/175377/blog/84420 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的句子,我以自 ...

  8. python scikit learn 封装_python的scikit-learn的主要模块和基本使用

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

  9. Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

    所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的 ...

  10. 的使用两个数据集拼接_使用Scikit Learn的分类器探索Iris数据集

    暂时,想象一下你不是一个花卉专家(如果你是专家,那对你很好!).你能区分三种不同的鸢尾属植物吗?刚毛鸢尾属,花色鸢尾属和维吉尼亚鸢尾属(setosa, versicolor, virginica)? ...

最新文章

  1. 显示intent的使用讲解
  2. 自定义ToolBar
  3. PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题)
  4. 深度解析Java可变参数类型以及与数组的区别
  5. Linux没有安装gcc如何在线安装(直接在Linux终端安装)
  6. SAP S/4HANA使用ABAP获得生产订单的状态
  7. 洛谷 1057——传球游戏(递推与递归二分)
  8. java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用
  9. 智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波
  10. 多线程之Thread类
  11. spring cloud gateway 拦截request Body
  12. 计算机知识怎么记忆,计算器记忆加怎么用
  13. 基于STM32F103将采集的温度-湿度值通过串口输出,用OLED屏显示自己的学号和姓名以及显示AHT20的温度和湿度,滑动显示长字符
  14. 游戏设计模式阅读笔记3——重访设计模式(观察者模式)
  15. DCOS到底是啥?看完这篇你就懂了
  16. JDBC学习笔记(SQL语句的执行)
  17. 华为服务器自检信息怎么开,hp服务器开机自检报错提示
  18. python将mp4转mp3
  19. haxm intel庐_如何开启Intel HAXM功能
  20. ecmall支持php5.3,ecmall 兼容 php5.5以上版本

热门文章

  1. List集合删除指定对象,使用removeIf
  2. pycharm 数据库工具
  3. 图解NebulaGraph-开源国产分布式图数据库!
  4. win7 批处理自动 修改本地IP地址、无线IP地址
  5. 电机控制从入门到进阶
  6. KNN(临近算法k-NearestNeighbo) L1 和 L2距离计算
  7. 爬取豆瓣app上的口碑综艺排行榜
  8. linux下播放蓝光iso,用群晖video station播放蓝光源盘(ISO)的方法
  9. PCF85063 RTC 芯片的使用
  10. 服务器查看硬盘状态在哪里看,hpacucli查看HP服务器硬盘状态