sklearn学习笔记(菜菜——决策树DT_record)

sklearn学习笔记(菜菜——决策树DT_record)

一、库的安装

(1)Graphviz

直接用pip install graphviz下载后发现无法画出图形

参考:
Graphviz安装配置教程(图文详解)(振华OPPO)

Graphviz 安装并使用 (Python) (乌漆 WhiteMoon)

二、程序DT_record

(1)数据概况

使用红酒数据集


from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

#sklearn自带的数据集
wine=load_wine()

wine

在这里插入图片描述


wine.data

在这里插入图片描述


wine.target

在这里插入图片描述


#178行,13个属性
wine.data.shape

在这里插入图片描述


wine.target.shape

在这里插入图片描述


import pandas as pd
pd.DataFrame(wine.data)

在这里插入图片描述


pd.DataFrame(wine.target)

在这里插入图片描述


import pandas as pd
'''
pd.concat()函数可以沿着指定的轴将多个dataframe或者series拼接到一起。
axis=1 表示水平连接
pd.DataFrame() 函数可以从字典,列表等创建数据框
'''
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)

在这里插入图片描述


wine.feature_names

在这里插入图片描述


wine.target_names

在这里插入图片描述


#注意四个的顺序
#X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size, random_state, shuffle)划分训练集和测试集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)
print(Xtrain.shape)
print(Ytrain.shape)
print(Ytrain.shape)

在这里插入图片描述


(2)建树与参数

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

wine=load_wine()
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)

#实例化(决策树)
'''
random_state用来设置分枝中随机模式的参数,默认None
在高维度时随机性会表现更明显,低维度数据(如鸢尾花数据集),随机性几乎不会显现
'''

'''
对分类树来说,衡量“最佳”的指标叫做“不纯度”。通常来说,不纯度越低,决策树对训练集的拟合越好
criterion这个参数用来决定不纯度的计算方法,有两种选择
输入”entropy“,使用信息熵(Entropy)
输入”gini“,使用基尼系数(Gini Impurity)
'''

'''
splitter也是用来控制决策树的随机选项的,有两种输入值
输入"best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝
(重要性可以通过属性feature_importances_查看)
输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合
(这也是防止过拟合的一种方式)
'''
clf=tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter='random')
clf=clf.fit(Xtrain,Ytrain)
#返回预测的准确度accuracy(准确性是分类器正确分类的样本数量与总样本数量的比例)
score=clf.score(Xtest,Ytest)
print(score)

在这里插入图片描述


import graphviz;
dot_data=tree.export_graphviz(clf
                              ,feature_names=wine.feature_names
                              ,class_names=['0','1','2']
                              ,filled=True
                              ,rounded=True
                              )
graph=graphviz.Source(dot_data)
graph.view()

在这里插入图片描述


#查看拟合程度,使用训练数据集 (Xtrain, Ytrain) 对已经训练好的分类器 (clf) 进行评分
score_train=clf.score(Xtrain,Ytrain)
print(score_train)

在这里插入图片描述


(3)剪枝与参数

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine=load_wine()
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)
clf=tree.DecisionTreeClassifier(criterion="entropy",
                                random_state=30,
                                splitter='random')
clf=clf.fit(Xtrain,Ytrain)
score=clf.score(Xtest,Ytest)
print(score)

在这里插入图片描述


import graphviz;
dot_data=tree.export_graphviz(clf
                              ,feature_names=wine.feature_names
                              ,class_names=['0','1','2']
                              ,filled=True
                              ,rounded=True
                              )
graph=graphviz.Source(dot_data)
graph.view()

在这里插入图片描述


'''
在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止
往往导致过拟合,在训练集上表现很好,在测试集上却表现糟糕
'''

'''
为了让决策树有更好的泛化性,我们要对决策树进行剪枝
剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心
参数:
max_depth,限制树的最大深度,超过设定深度的树枝全部剪掉,在高维度低样本量时非常有效,
实际使用时,建议从=3开始尝试

min_samples_leaf,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,
否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生,
一般搭配max_depth使用,
这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。一般来说,建议从=5开始使用

min_samples_split,限定一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,
否则分枝就不会发生

max_features,限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,是用来限制高维度数据的过拟合的剪枝参数,
在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足,
如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法

min_impurity_decrease,限制信息增益的大小,信息增益小于设定数值的分枝不会发生
'''

clf = tree.DecisionTreeClassifier(criterion="entropy",
                                  random_state=30,
                                  splitter="random",
                                  max_depth=3,
                                  min_samples_leaf=10,
                                  min_samples_split=10)
clf = clf.fit(Xtrain, Ytrain)
print(clf.score(Xtest,Ytest))
print(clf.score(Xtrain,Ytrain))
dot_data=tree.export_graphviz(clf
                              ,feature_names=wine.feature_names
                              ,class_names=['0','1','2']
                              ,filled=True
                              ,rounded=True
                              )
graph = graphviz.Source(dot_data)
graph.view()

在这里插入图片描述


'''
确认最优的剪枝参数,使用确定超参数的曲线来进行判断

超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,
它是用来衡量不同超参数取值下模型的表现的线
'''
import matplotlib.pyplot as plt
test = []
for i in range(10):
   clf = tree.DecisionTreeClassifier(max_depth=i+1,
                                     criterion="entropy",
                                     random_state=30,
                                     splitter="random")
   clf = clf.fit(Xtrain, Ytrain)
   score = clf.score(Xtest, Ytest)
   test.append(score)

plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

在这里插入图片描述


三、补充

(1)目标权重参数

class_weight:完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重。

min_weight_fraction_leaf:有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。

(2)重要属性和接口

属性是在模型训练之后,能够调用查看的模型的各种性质。
对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性。

apply中输入测试集返回每个测试样本所在的叶子节点的索引,
predict输入测试集返回每个测试样本的标签。

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

(3)决策树优缺点

优点:

  1. 易于理解和解释,因为树木可以画出来被看见。
  2. 需要很少的数据准备。其他很多算法通常都需要数据规范化,需要创建虚拟变量并删除空值等。但请注意,sklearn中的决策树模块不支持对缺失值的处理。
  3. 使用树的成本(比如说,在预测数据的时候)是用于训练树的数据点的数量的对数,相比于其他算法,这是一个很低的成本。
  4. 能够同时处理数字和分类数据,既可以做回归又可以做分类。其他技术通常专门用于分析仅具有一种变量类型的数据集。
  5. 能够处理多输出问题,即含有多个标签的问题,注意与一个标签中含有多种标签分类的问题区别开。
  6. 是一个白盒模型,结果很容易能够被解释。如果在模型中可以观察到给定的情况,则可以通过布尔逻辑轻松解释条件。相反,在黑盒模型中(例如,在人工神经网络中),结果可能更难以解释。
  7. 可以使用统计测试验证模型,这让我们可以考虑模型的可靠性。
  8. 即使其假设在某种程度上违反了生成数据的真实模型,也能够表现良好。

缺点:

  1. 决策树学习者可能创建过于复杂的树,这些树不能很好地推广数据。这称为过度拟合。修剪,设置叶节点所需的最小样本数或设置树的最大深度等机制是避免此问题所必需的,而这些参数的整合和调整对初学者来说会比较晦涩。
  2. 决策树可能不稳定,数据中微小的变化可能导致生成完全不同的树,这个问题需要通过集成算法来解决。
  3. 决策树的学习是基于贪婪算法,它靠优化局部最优(每个节点的最优)来试图达到整体的最优,但这种做法不能保证返回全局最优决策树。这个问题也可以由集成算法来解决,在随机森林中,特征和样本会在分枝过程中被随机采样。
  4. 有些概念很难学习,因为决策树不容易表达它们,例如XOR,奇偶校验或多路复用器问题。
  5. 如果标签中的某些类占主导地位,决策树学习者会创建偏向主导类的树。因此,建议在拟合决策树之前平衡数据集。
  • 31
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值