scikit-learn简称为sklearn,它可以看作是Scipy的扩展,自2007年发布以来,已经成为Python重要的机器学习库之一。从它的官网首页(网址为:https://sklearn.org)就可以看出,它不仅支持分类、回归、聚类和降维四大机器学习算法,而且包含模型选择、数据预处理两大模块,如图4.49所示。通过使用scikit-learn可以大大提高使用机器学习的效率,降低机器学习的应用门槛。
图4.49 scikit-learn官网首页
使用scikit-learn需要安装NumPy和matplotlib库。scikit-learn的文档完善,上手容易,在学术界颇受欢迎。scikit-learn不仅封装了大量的机器学习算法,还内置了大量的数据集,能方便地对机器学习算法进行学习和测试。
scikit-learn中使用的决策树采用的是一种优化版本的CART算法。决策树在sklearn包的tree模块中,通过以下语句来引用:
tree模块主要包括5个类和用于输出的一些方法,分别为:基础决策树(tree.BaseDecision Tree(...))、分类决策树(tree.Decision TreeClassifier(...))、回归决策树(tree.Decision TreeRegressor(...))、高随机版本分类树(tree.Extra TreeClassifier(...))、高随机版本回归树(tree.Extra TreeRegressor(...))和可视化工具输出方法(tree.export_graphviz(decision_tree[...]))、文本输出方法(tree.export_text(...))等。其中,基础决策树类的代码中使用了抽象方法@abstractmethod,基础决策树类无法实例化,主要供分类决策树类和回归决策树类继承。其他4个决策树类通过名字就可以知道其主要应用场合。可视化工具输出方法用于生成能在可视化工具Graphviz上显示的dot格式的文件,能更直观地显示决策树。文本输出方法以文本的方式输出决策树结构。
scikit-learn的决策树基本使用过程为:
(1)建立数据集;
(2)实例化所使用的类:
(3)用训练的数据集进行训练:
(4)测试和预测:
具体在使用决策树的时候需要注意其中一些参数。这里以tree模块中的分类决策树类为例,详细看一下文件中参数的定义。在Pycharm开发环境中,按住Ctrl键,点击类或者方法等,会跳转到引用的原始位置,方便阅读和调试代码。打开其定义可以看到它继承了基础决策树类,在构造函数“__init__(...)”中可以获取父类的所有属性。由以下代码可以看到分类决策树的属性及对应的默认值。
参数中主要有控制树生成的参数、剪枝参数、权重参数,下面分别介绍:
(1)决策树生成控制参数。
①criterion:选择特征的方法,不填写则默认为“‘gini’”(以基尼指数作为数据划分依据),还可以是“‘entropy’”(以信息增益作为数据划分依据)。(www.xing528.com)
②random_state:用来设置分支中随机模式的参数,默认为“None”,特征比较多时表现明显,特征较少时表现不明显,此参数设置为不同的整数可能导致生成不同的决策树。
③splitter:用来控制决策树中随机选项的参数,默认为“‘best’”(优先选择更重要的特征),还可以选择“‘random’”,分支时会更加随机。通过该参数,可以防止生成的决策树出现过拟合。决策树生成以后,还可以使用剪枝参数来防止过拟合。
(2)剪枝参数。
剪枝策略对决策树的影响很大,所以正确地选择剪枝策略是优化决策树算法的核心。sklearn中决策树的以下一些参数能对剪枝策略进行调整。要想知道究竟什么样的剪枝参数最好,需要对模型进行度量,也就是采用以下语句,使用数据来测试、打分:
提前设置好剪枝参数,可以减少程序的计算量,但是要想提高模型的性能,还是利用数据本身,使用score来测试。
①max_depth:限制树的最大深度,超过设定深度的树枝全部剪掉,适用于维度高而样本较少的场合。决策树越深,对样本量的需求也越大。实际使用该参数时,可以根据拟合效果来调整。建议先用3对数据有个初步了解后再尝试加大该参数。
②min_samples_leaf:限制一个节点在分支后每个子节点都最少包含的样本数,否则就不往下继续分支。
这个参数一般配合“min_samples_split”使用,设置得太小容易引起过拟合,设置得太大又会阻止模型学习数据。对于该参数,一般建议可以设置为“5”,但是对于类别不多的分类问题,通常设置为“1”,而如果叶子节点的样本量变化很大,还可以输入小数作为样本量的百分比使用。对于回归问题,这个参数还可以避免低方差过拟合的叶子节点出现。
③min_samples_split:限制一个节点至少包含多少个训练样本后,才允许被分支。
④max_features:限制分支时考虑的特征个数,超过限制个数的特征都舍弃。在不知道各个特征的重要性的情况下,使用此参数可能导致模型学习不足。通常特征数不多时,比如小于50个时,选择默认的“None”即可。
如果希望通过降维来防止过拟合,建议使用主成分分析算法、独立成分分析算法或者特征选择模块的专门降维算法,而不是简单地限制最大特征数。
⑤min_impurity_decrease:限制信息增益的大小,当信息增益小于设定值时,不会产生分支。
(3)权重参数。
①class_weight:默认为“None”,表示赋予数据集中所有标签相同的权重。但有时数据是不平衡的,需要进行样本标签的平衡。比如,想根据某班在网络学习中的一些行为数据来判断具有某些行为的学生可能是男生还是女生,完全可以不用做任何分析就将其预测为男生。预测结果的准确率放在该班一定不会太差,因为该班男生比女生多很多。这样的数据集就有可能导致预测的行为和性别之间并没有太大的关联,或者说它会使得预测结果偏向男生。
我们可以用一个字典{class_label:weight}来设置这个参数,或者将这个参数设置为“‘balanced’”,来提高“‘女生’”这个标签的权重。
②min_weight_fraction_leaf:有了权重,剪枝时需要配合这个参数,使结果减少偏向主导部分的数据。比如,min_samples_leaf是不考虑权重的。
其他几种决策树类的参数和分类决策树的参数具有相似的功能和使用方法,除了基本参数以外,决策树还有其他一些重要的属性和常用方法。比如“feature_importances_”属性,它可以用来查看获得的模型的各种性质。常用的方法有fit、score、predict和apply,在sklearn中每个算法基本都有这些方法,而且这些方法在功能和使用方式上都封装成了相同的形式。其中:fit用于模型的训练;score用于评估模型,对模型进行打分,输入测试数据及标签,返回平均正确率;predict用于预测;apply用于对样本数据到预测器上的转换,对于决策树可以对每一个样本输出一个预测向量,指出数据的每一个特征被分到了哪个叶子节点。
sklearn中使用决策树非常简单,这里以鸢尾花数据集和决策树为例来说明(请参考实验部分4.6.1)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。