python机器学习库sklearn——决策树

全栈工程师开发手册 (作者:栾鹏)

python数据挖掘系列教程

决策树的相关的知识内容可以参考
http://blog.csdn.net/luanpeng825485697/article/details/78795504

本文只讲述sklearn中如何使用决策树。

其中需要安装numpy 、pandas 、matplotlib、sklearn 、pydotplus库,以及安装Graphviz

点击下载Graphviz

安装好Graphviz软件后,需要进入系统环境变量设置。在系统变量的Path变量中,添加Graphviz的环境变量,比如Graphviz安装在了D盘的根目录,则添加:D:\Graphviz\bin;
设置完环境变量,记得要重启IDE

sklearn使用DecisionTreeClassifier构建决策树,这个函数,一共有12个参数:

参数说明如下:

criterion:特征选择标准,可选参数,默认是gini,可以设置为entropy。gini是基尼不纯度,是将来自集合的某种结果随机应用于某一数据项的预期误差率,是一种基于统计的思想。entropy是香农熵,也就是上篇文章讲过的内容,是一种基于信息论的思想。Sklearn把gini设为默认参数,应该也是做了相应的斟酌的,精度也许更高些?ID3算法使用的是entropy,CART算法使用的则是gini。

splitter:特征划分点选择标准,可选参数,默认是best,可以设置为random。每个结点的选择策略。best参数是根据算法选择最佳的切分特征,例如gini、entropy。random随机的在部分划分点中找局部最优的划分点。默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random”。

max_features:划分时考虑的最大特征数,可选参数,默认是None。寻找最佳切分时考虑的最大特征数(n_features为总共的特征数),有如下6种情况:
如果max_features是整型的数,则考虑max_features个特征;
如果max_features是浮点型的数,则考虑int(max_features * n_features)个特征;
如果max_features设为auto,那么max_features = sqrt(n_features);
如果max_features设为sqrt,那么max_featrues = sqrt(n_features),跟auto一样;
如果max_features设为log2,那么max_features = log2(n_features);
如果max_features设为None,那么max_features = n_features,也就是所有特征都用。
一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

max_depth:决策树最大深,可选参数,默认是None。这个参数是这是树的层数的。层数的概念就是,比如在贷款的例子中,决策树的层数是2层。如果这个参数设置为None,那么决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。或者如果设置了min_samples_slipt参数,那么直到少于min_smaples_split个样本为止。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

min_samples_split:内部节点再划分所需最小样本数,可选参数,默认是2。这个值限制了子树继续划分的条件。如果min_samples_split为整数,那么在切分内部结点的时候,min_samples_split作为最小的样本数,也就是说,如果样本已经少于min_samples_split个样本,则停止继续切分。如果min_samples_split为浮点数,那么min_samples_split就是一个百分比,ceil(min_samples_split * n_samples),数是向上取整的。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

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

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

class_weight:类别权重,可选参数,默认是None,也可以字典、字典列表、balanced。指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。类别的权重可以通过{class_label:weight}这样的格式给出,这里可以自己指定各个样本的权重,或者用balanced,如果使用balanced,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的None。

random_state:可选参数,默认是None。随机数种子。如果是证书,那么random_state会作为随机数生成器的随机数种子。随机数种子,如果没有设置随机数,随机出来的数与当前系统时间有关,每个时刻都是不同的。如果设置了随机数种子,那么相同随机数种子,不同时刻产生的随机数也是相同的。如果是RandomState instance,那么random_state是随机数生成器。如果为None,则随机数生成器使用np.random。

min_impurity_split:节点划分最小不纯度,可选参数,默认是1e-7。这是个阈值,这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。

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

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

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

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

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

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

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

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

下面上代码

# -*- coding: UTF-8 -*-

import numpy as np # 快速操作结构数组的工具
import pandas as pd # 数据分析处理工具
import matplotlib.pyplot as plt # 画图工具
from sklearn import datasets # 机器学习库
from sklearn.preprocessing import LabelEncoder
from sklearn import tree



# 下面的数据分为为每个用户的来源网站、位置、是否阅读FAQ、浏览网页数目、选择的服务类型(目标结果)
attr_arr=[['slashdot','USA','yes',18,'None'],
         ['google','France','yes',23,'Premium'],
         ['digg','USA','yes',24,'Basic'],
         ['kiwitobes','France','yes',23,'Basic'],
         ['google','UK','no',21,'Premium'],
         ['(direct)','New Zealand','no',12,'None'],
         ['(direct)','UK','no',21,'Basic'],
         ['google','USA','no',24,'Premium'],
         ['slashdot','France','yes',19,'None'],
         ['digg','USA','no',18,'None'],
         ['google','UK','no',18,'None'],
         ['kiwitobes','UK','no',19,'None'],
         ['digg','New Zealand','yes',12,'Basic'],
         ['slashdot','UK','no',21,'None'],
         ['google','UK','yes',18,'Basic'],
         ['kiwitobes','France','yes',19,'Basic']]

#生成属性数据集和结果数据集
dataMat = np.mat(attr_arr)
arrMat = dataMat[:,0:4]
resultMat = dataMat[:,4]

# 构造数据集成pandas结构
attr_names = ['src', 'address', 'FAQ', 'num']   #特征属性的名称
attr_pd = pd.DataFrame(data=arrMat,columns=attr_names)    #每行为一个对象,每列为一种属性,最后一个为结果值
print(attr_pd)

#将数据集中的字符串转化为代表类别的数字。因为sklearn的决策树只识别数字
le = LabelEncoder()
for col in attr_pd.columns:                                            #为每一列序列化,就是将每种字符串转化为对应的数字。用数字代表类别
    attr_pd[col] = le.fit_transform(attr_pd[col])
print(attr_pd)

# 构建决策树
clf = tree.DecisionTreeClassifier()
clf.fit(attr_pd, resultMat)
print(clf)



# 使用决策树进行预测
result = clf.predict([[1,1,1,0]])    # 输入也必须是数字的。分别代表了每个数字所代表的属性的字符串值
print(result)

# 将决策树保存成图片
from sklearn.externals.six import StringIO
import pydotplus

dot_data = StringIO()
target_name=['None','Basic','Premium']
tree.export_graphviz(clf, out_file=dot_data,feature_names=attr_names,
                     class_names=target_name,filled=True,rounded=True,
                     special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('tree.png')

这里写图片描述

  • 16
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: python机器学习sklearn是一个功能强大的机器学习工具包,提供了许多机器学习算法和工具,包括分类、回归、聚类、降维、模型选择、预处理等等。它的目的是使机器学习简单和可重复,以便更多的人可以轻松地使用它。 sklearn的代码风格简洁明了,易于理解和使用。它也提供了许多评估指标和工具,帮助用户评估模型的性能。此外,它还支持许多常见的数据集,方便用户进行试验和研究。 总的来说,sklearn是一个非常实用的机器学习工具包,适用于各种机器学习任务。如果你是一个初学者,或者是一个经验丰富的机器学习工程师,都可以从sklearn中受益。 ### 回答2: Python机器学习sklearn是一个功能强大的开源工具,可实现各种常见和先进的机器学习任务。它通过提供简洁易用的API,使得机器学习的各个方面更容易上手。 sklearn包含了众多的工具,包括预处理、特征提取、监督和无监督学习算法等等。其中,监督学习算法包括分类、回归和聚类。预处理工具包括缺失数据处理、数据标准化等等。而特征提取方面,sklearn支持所有流行的提取技术,如HOG、LBP和Sift等。无论从哪个角度看,sklearn都是一款强大的工具。 sklearn的优点在于它广泛的支持性。它提供了许多内置的数据集,使得机器学习工作更容易上手。此外,sklearn还提供了许多功能强大的可视化工具,辅助开发者理解机器学习结果。 sklearn做得不足之处在于其内置算法并没有涵盖所有机器学习任务。例如,它并未支持深度学习,限制了其使用范围。另外,由于sklearn提供的是封装的算法,一定程度上降低了自定义的空间。 总而言之,sklearn是一款非常实用的机器学习工具,它在广泛的支持性、API易用性、可视化工具和算法效果上均有表现。但是,虽然它不是完美的,但它仍然是大多数机器学习项目的首选之一。 ### 回答3: Python机器学习sklearn是一个强大的工具,它提供了多种机器学习算法和工具,包括分类、回归、聚类、降维、模型选择和预处理等功能。sklearn是对其他Python数据处理,如NumPy和Pandas的补充,使得用户可以快速轻松地对数据进行一些复杂的操作。在许多数据科学和机器学习项目中,sklearn成为了一个不可或缺的工具。 sklearn主要被开发用于数据挖掘和数据分析,并被广泛应用于分类、聚类、回归和推荐系统等领域。该提供了许多流行的机器学习算法实现,如支持向量机(SVM)、K近邻(KNN)、决策树、随机森林、朴素贝叶斯等。这些算法可以应用于不同类型的数据,如数值、分类、文本、图像和语音等数据。 sklearn的另一个重要特点是它提供了许多有用的数据预处理和数据转换方法,如标准化、归一化、降维、数据合并等方法,这些方法可以使数据更适合于机器学习算法的应用。sklearn还提供了模型选择和评估的工具,如交叉验证、网格搜索和性能度量等方法,这些方法可以帮助用户有效地选择合适的算法和调整其参数。 sklearn的优点不仅在于它的功能和性能,而且在于它在Python社区的支持和贡献。由于python机器学习的社区非常活跃,因此sklearn能够获得广泛的应用和支持。此外,sklearn详细的文档和示例使得学习和使用该变得更轻松和容易。 总之,Python机器学习sklearn是一个功能强大、易于使用和广泛应用于数据科学和机器学习项目的工具,它的优点在于其提供了众多有用的机器学习算法和工具,清晰的文档和示例以及强大的Python社区的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯数据架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值