决策树之分类树

一、函数定义

1.1定义

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.2重要参数

1.criterion

criterion:表示不纯度的计算方法。

不纯度是衡量找出决策树中最佳节点和最佳分枝的最优方法。通常,不纯度越低,决策树队训练集的拟合越好。

不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定低于父节点。也就是说,在同一颗树中,叶子节点的不纯度一定是树中最低的。

 

不纯度的两个参数

参数区别
entropy 信息熵对不纯度更加敏感,对不纯度惩罚最强。计算稍慢。生长更精细。高维数据或者噪音很多的数据,信息熵很容易过拟合。型拟合程度不足的时候,即当模型在训练集和测试集上都表现不太好的时候,使用信息熵。
gini 基尼系数通常就使用基尼系数
数据维度很大,噪音很大时使用基尼系数

两个参数都试试,不好就换另一个。

 

 

 

2.random_state & splitter

random_state:设置分枝中的随机模式的参数,默认为None,在高维度上随机性会表现的很明显。

splitter:用来控制决策树中的随机选项。参数:"best"(优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看)),"random"(决策树分枝更随机,树会因此变得更深更广,也是防止过拟合的一种方式)

 

Q:高维度数据是什么?

A:一维数组是一维,二维数组是二维,高维度是指多个坐标系。

 

3.剪枝参数

为何要剪枝?因为一棵决策树会根据数据一直涨,直到涨到最优深度为止,或者没有了多余的特征可用。这就可能导致过拟合。也就是说在训练集中表现很好,但在测试集中却表现很差。正确的剪枝,是优化决策树算法的核心。

得到训练集中的拟合程度结果:

score_train = clf.score(Xtrain, Ytrain)
score_train

剪枝相关参数:

max_depth:限制树的最大深度,这很有效,因为树每深一层,就要求样本多一倍,建议从=3开始。
min_samples_leaf:每个子节点都要求至少包括min_samples_leaf个样本,如果小于它,那么该节点会被损失。或者该树会重新排布各节点的样本,让每个节点的样本数都至少有min_samples_leaf个。一般搭配max_depth使用
min_samples_split:一个节点至少要包括min_samples_split个样本,才允许分枝,否则分枝不会发生。

max_features:限制分枝时特征的个数,超过限制的特征都会被抛弃。
min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生。

确定最优的剪枝参数:

从树的第一层开始,每层都拿到score,然后根据score画个折线图,看在第几层score最接近1,找到这个横坐标就,也就是层数即是最优剪枝参数。

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()

(如果数据集有些大,会非常占用内存,那么提前设置好剪枝参数比较好)

Q:什么是信息增益?

A:就是树的深度再增长,但是准确率就只提升了一丁点这样子,增长的幅度就是信息增益。

 

Q:什么是过拟合?

A:指为了得到一致假设,使得假设过于严格。

 

4.目标权重参数

class_weight:这个参数是为了平衡比例,比如信用卡中违约率是1%,如果不设置这个参数,那么这个模型就会更关注于99%的不违约情况,但是我用这个违约数据,肯定是要做违约处理的,所以我要想办法让模型更关注到1%的违约数据中去,如果设置参数的值为None,那么此模式自动的会给违约情况和非违约情况同样的权重。

min_weight_fraction_leaf:这是基于权重的剪枝参数。

1.3 重要属性和接口

属性是用于在模型训练之后,查看模型的各个性质的变量。

feature_importances_:用于查看各个特征对模型的重要性。

 

接口:

apply:输入测试集,返回每个测试样本所在的叶子结点索引。

predict:输入测试集,返回每个测试样本的标签。

clf.apply(Xtest)

clf.predict(Xtest)

二、示例

1.建树

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

wine = load_wine() #数据集是由sklearn提供

#拿到测试集和训练集,随机划分训练集和测试集
Xtrain, Xtest, Ytrain,Ytest = train_test_split(wine.data, wine.target, test_size = 0.3)

#通过分类算法,得到score分数
clf = tree.DecisionTreeClassifier(criterion = "entropy")

#random_state是随机数种子
#clf = tree.DecisionTreeClassifier(criterion = "entropy", random_state = 90
                                 ,splitter = "random")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)


#graph就是树
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf, feature_names = feature_name, class_names=["琴酒","雪莉","贝尔摩德"],
                               filled = True  #树的颜色,不同类,不同树
                               ,rounded = True)  #树的方框的变是圆边
graph = graphviz.Source(dot_data)

Q:标签是指什么呢?

A:表示数据的类别。就是有三个东西。

 

Q:训练集和测试集为什么是两个维度(x,y)呢?

A:规定的。

 

Q:test_size的值是如何设置的?

A:比如是0.3,表示30%是测试集,70%是训练集,但后面又说测试集和训练集是随机划分的,这又是怎么回事呢?

A2:虽然分别是30%和70%,但是内部30%是哪些数据,这个东西是随机的。

 

Q:feature_name在数据集中是干什么的呢,是标题吗,还是数据的属性?

A:是相当于一类东西里面的属性,它的特征。

 

Q:class_names是什么呢,说是对应标签的(0,1,2),为什么要设置这三个字符串?

A:是一类东西,表示有3种东西。

 

Q:random_state (随机数种子)的不同数字分别代表什么呢,是要一个个去试这个种子吗?

A:随机种子是保证实验结果的可重复性,就是用同一个种子保证每次结果一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值