刚刚使用SKLearn学习机器学习进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~
本文将介绍sklearn的决策树模块
涉及到的理论知识,请转至上篇《决策树和随机森林》:https://blog.csdn.net/weixin_42969619/article/details/98853206
涉及到数据集相关操作,请转至《探索sklearn的数据集》:https://blog.csdn.net/weixin_42969619/article/details/99294615
sklearn中决策树的类都在”tree“这个模块之下。这个模块总共包含五个类:
类名 | 说明 |
---|---|
tree.DecisionTreeClassifier | 分类树 |
tree.DecisionTreeRegressor | 回归树 |
tree.export_graphviz | 将生成的决策树导出为DOT格式,画图专用 |
tree.ExtraTreeClassifier | 高随机版本的分类树 |
tree.ExtraTreeRegressor | 高随机版本的回归树 |
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
说明:
(1)数据集实例化后划分训练集和测试集是“随机的”
!运行一次,随机划分一次,结果可能改变一次
(2)训练集和测试集的划分如果只运行一次,则数据是固定的;但是“建模”的结果仍然是“随机的”
!
问题:如果“criterion”参数是敲定特征重要性的;“splitter”是决定如何选择节点的(无论参数值如何,都是生成很多棵树,返回最优的一颗)那么为什么在只定义了“criterion”时,还会运行结果随机?
注意:sklearn要求数据的特征矩阵必须至少是一个二维矩阵。不接受任何一维矩阵作为特征矩阵被输入。如果你的数据的确只有一个特征,那必须用reshape(-1,1)来给矩阵增维;如果你的数据只有一个特征和一个样本,使用reshape(1,-1)来给你的数据增维。