机器学习笔记:决策树

本文深入探讨决策树模型,包括模型建立、重要参数如criterion、splitter、max_depth等的解释,以及如何防止过拟合。通过参数调优提升模型性能,介绍了Graphviz用于决策树可视化,并分享了使用GridSearchCV优化参数后的结果,准确率提升至0.944。

模型建立

决策树是一种常见的机器学习算法,既可以做分类也可以做回归。决策树的执行过程是将数据从根节点一步一步的划分到各个叶子节点(决策的过程)。
通过对特定标签进行不断提问,总结出决策规则,以树状形式呈现这些决策规则。
决策树包括以下组成成分:

根节点
非叶子节点与分支
叶子节点(最终的决策结果)

核心:(怎样找到最佳树)
如何在表中找到最佳节点和最佳分支
如何让决策树停止生长 防止过拟合
在这里插入图片描述

模块 sklearn.tree
tree.DecisionTreeClassifier 分类树
tree.DecisionTreeRegressor 回归树
tree.export_graphviz 将决策树导出为DOT格式 画图用
tree.ExtraTreeClassifier 高随机版本分类树
tree.ExtraTreeRegressor 高随机版本回归树
要先进行数据的划分

数据划分
X_train,X_test,Y_train,Y_test=train_test_split(wine.data,wine.target,test_size=0.3)

代码示例(分类树)

from sklearn import tree
from sklearn.model_selection import train_test_split
clf=tree.DecisionTreeClassifier()
clf=clf.fit(X_train,Y_train)
score=clf.score(X_test,Y_test) #导入测试集使用fit接口填入数据 score接口给模型打分

重要参数

1.criterion 不纯度 (分支质量指标)
子节点小于父节点 叶子节点最低
输入‘entropy’ 使用信息熵 (拟合度不够的时候)
输入’gini’ 使用基尼系数(高维度,噪声很多的数据)(默认)
确定不纯度的计算方法,帮忙找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越好

在这里插入图片描述
2.随机模式参数
random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显。
splitter也是用来控制决策树中的随机选项的,有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式。当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能性。

clf=tree.DecisionTreeClassifier(
criterion="entropy",random_state=30)
clf=tree.DecisionTreeClassifier(
criterion="entropy",random_state=30,
splitter="random")

防止过拟合,splitter默认best 使用random增加随机性,深度增加

3.剪枝参数
max_depth
min_samples_leaf &min_samples_split
min_samples_leaf 这个值限制了叶子节点最少的样本数,如果某叶子节点样本数目小于min_samples_leaf,则会和兄弟节点一起被剪枝
min_samples_split 如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

max_features & min_impurity_decrease
强行将超过限制个数的特征舍弃(不建议,pca,ica降维比较好)
min_impurity_decrease限制信息增益,限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。

4.权重参数
class_weight & min_weight_fraction_leaf
完成样本标签平衡 向少数方向建模
主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。

画图

import graphviz
dot_data=treee.export_graphviz(clf,
feature_names=f_name,class_names=[],
filled=true,rounded=true)
graph=graphviz.Source(dot_data)

graphviz下载地址是:https://graphviz.gitlab.io/_pages/Download/Download_windows.html

画决策树的代码还要加上Graphviz绝对路径的一段代码

import os
os.environ["PATH"] += os.pathsep + 'C:/Program Files/Graphviz/bin/'

才能画出决策树,不然会出现报错
在这里插入图片描述

参数调优

对于参数的选择,采用GridSearchCV选出最优的参数
(在对参数范围的寻找时可以利用学习曲线来确定)

from sklearn.model_selection import GridSearchCV

parameters={
            'criterion':['gini','entropy'],
            'max_depth':[1,2,3,4,5,6,7,8],
            'min_samples_leaf':[3,6,9],
            'min_samples_split':[3,5,6,9],
            'splitter':['best','random']
            }
dtree=tree.DecisionTreeClassifier()
grid_search=GridSearchCV(dtree,parameters,scoring='accuracy',cv=5)
grid_search.fit(x,y) 

grid_search.best_estimator_   #查看grid_search方法 
grid_search.best_score_       #正确率 
grid_search.best_params_  

结果
在这里插入图片描述
在采用以上值进行训练

clf=tree.DecisionTreeClassifier(criterion='entropy',
 max_depth=6,
 min_samples_leaf=3,
 min_samples_split=6,
 splitter='random',random_state=50)
clf=clf.fit(X_train,Y_train)
score=clf.score(X_test,Y_test)

结果为0.944,比之前有所提高
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值