DecisionTreeClassifier的参数criterion 与 splitter/使用红酒数据集创建一个树

刚刚使用SKLearn学习机器学习进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~

本文将介绍sklearn的决策树模块
涉及到的理论知识,请转至上篇《决策树和随机森林》:https://blog.csdn.net/weixin_42969619/article/details/98853206
涉及到数据集相关操作,请转至《探索sklearn的数据集》:https://blog.csdn.net/weixin_42969619/article/details/99294615


  • 模块sklearn.tree

sklearn中决策树的类都在”tree“这个模块之下。这个模块总共包含五个类:

类名 说明
tree.DecisionTreeClassifier 分类树
tree.DecisionTreeRegressor 回归树
tree.export_graphviz 将生成的决策树导出为DOT格式,画图专用
tree.ExtraTreeClassifier 高随机版本的分类树
tree.ExtraTreeRegressor 高随机版本的回归树
  • DecisionTreeClassifier及重要参数:

class sklearn.tree.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_decrease=0.0, min_impurity_split=None,
class_weight=None, presort=False)

1. criterion参数

用来决定使用哪种计算方式评估节点的“重要性”。
不填默认为基尼不纯度;填写"gini"使用基尼系数; 填写“entropy”使用信息增益
如何选取参数:
(1)通常就使用基尼系数
(2)数据维度很大,噪音很大时使用基尼系数
(3)维度低,数据比较清晰的时候,信息熵和基尼系数没区别
(4)当决策树的拟合程度不够的时候,使用信息熵

2. splitter 参数

用来控制决策树生成时,“节点”选择方式的参数,有两种取值:
(1)splitter=“best”:分枝时虽然随机,但是还是会优先选择更“重要”的特征进行分枝
(2)splitter=“random”:一种“放弃治疗”感觉的随机(可能产生“过拟合”,因为模型会因为含有更多的不必要信息而更深更大)

  • 创建一棵树
# 导入需要的算法库和模块
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz

# 数据集实例化,并划分训练集和测试集
# test_size 参数表示:测试集在数据集中的比例
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

# 建立模型
clf = tree.DecisionTreeClassifier(criterion="entropy",splitter="random")
clf = clf.fit(Xtrain,Ytrain)

#  画出一棵树
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
                               ,out_file = None
                               ,feature_names= feature_name			# 这个参数是将特征变量名“可视化”,否则会返回“数据集中key="feature_names"对应值列表的索引”
                               ,class_names=["琴酒","雪莉","贝尔摩德"]			# 这个参数可以定义的个数,取决于数据集中key=“target_names”的个数,红酒数据集的标签有三个
                               ,filled=True		# 生成的树展示出来是否填充颜色
                               ,rounded=True		# 展示出来的树的“框框”是都有棱角~
                               )
graph = graphviz.Source(dot_data)
graph

DecisionTreeClassifier的参数criterion 与 splitter/使用红酒数据集创建一个树_第1张图片
说明:
(1)数据集实例化后划分训练集和测试集是“随机的”!运行一次,随机划分一次,结果可能改变一次
(2)训练集和测试集的划分如果只运行一次,则数据是固定的;但是“建模”的结果仍然是“随机的”

问题:如果“criterion”参数是敲定特征重要性的;“splitter”是决定如何选择节点的(无论参数值如何,都是生成很多棵树,返回最优的一颗)那么为什么在只定义了“criterion”时,还会运行结果随机?

注意:sklearn要求数据的特征矩阵必须至少是一个二维矩阵。不接受任何一维矩阵作为特征矩阵被输入。如果你的数据的确只有一个特征,那必须用reshape(-1,1)来给矩阵增维;如果你的数据只有一个特征和一个样本,使用reshape(1,-1)来给你的数据增维。

你可能感兴趣的:(机器学习,sklearn)