决策树分类

决策树

先构造树形结构,再进行一系列决策,决策树是分类算法,也能做回归。
比如有五个人(样本数据),打算分类谁愿意打篮球,根据年龄和性别进行决策分类。
第一次先通过其中特征进行部分选择,再在子类中根据另一个特征再分类。最后一个叶子节点就是最终分类结果。
决策树分类_第1张图片
决策树算法以树状结构表示数据分类的结果。每个决策点实现一个具有离散点输出的测试函数,记为分支。
决策树分类_第2张图片

  1. 训练阶段
    从给定的训练数据集DB,构造出一棵决策树。
    Class = DecisionTree(DB)
  2. 分类阶段
    从根开始,按照决策树的分类属性逐层往下划分,直到叶节点,获得概念(决策、分类)结果。
    y = DecisionTree(x)

衡量模型的标准


越大分类效果不好(等概的时候信息熵最大,为了尽可能分类,那么需要一方的概率尽可能大,另一方尽可能小,这样信息熵和也会更小)
在这里插入图片描述

Gini系数

在这里插入图片描述
越大分类效果不好

构造决策树的基本思想

构造树的基本思想就是随着树深度的增加,节点的熵迅速降低,熵降低速度越快越好,这样有望得到最矮的决策树。
假设有如下样本,如何决定哪个节点开始划分,这个时候就需要看熵了。
决策树分类_第3张图片
什么都没做的时候统计熵值,从play这个label来看
在这里插入图片描述
基于属性划分之后,计算熵值之和
决策树分类_第4张图片
决策树分类_第5张图片
决策树分类_第6张图片
决策树分类_第7张图片
根节点选取使得信息增益最大的。现在把1当成根节点,那么接下来的选择就是选择2,3,4使得信息增益最大。
决策树分类_第8张图片

ID3(信息增益)

决策树存在的问题:如果有ID属性,最终分类结果每个ID编号都只有一个,所以分类后的熵达到最小,这样信息增益就达到最大了,但是选择ID属性作为划分显然是无效的。
所以提出了一个新的值。

C4.5:信息增益率

让算法的信息增益除以自身的熵值(以ID举例,它的自身熵值很大,所以除法之后得到的信息增益率就会变小)

如何衡量最终的决策树分类效果如何

评价函数:(希望它越小越好,作用类似于损失函数)
在这里插入图片描述
Nt属于叶子节点样本总数,用H(t)表示当前叶子节点熵值。
如果是连续型的属性。首先将连续型属性离散化,把每个连续型属性的值分成不同的区间,依据是比较各个分裂点Gian值(信息增益)的大小。比如如下的年龄用区间划分
决策树分类_第9张图片
下面数字序列,如果进行“二分”,那么有9个可能的分界点
在这里插入图片描述
在构建决策树时,可以简单地忽略缺失数据,在计算增益时,仅考虑具有属性值的记录。
决策树分类_第10张图片
X[2]表示特征,特征分类按照小于等于2.45和大于2.45来划分。
Gain表示它的信息增益,samples表示它有多少个样本,value[49,50,50],表示样本分成三类,第一类是49个样本,第二类有50个样本,第三类有50个样本。决策树分类_第11张图片
决策树高度太高,说明有很多分支,最终所有叶子节点熵为0,每一个样本都分对,在训练集上分类效果100%。切得太碎,被异常点影响,造成过拟合的问题。

所以要剪枝!!!防止过拟合

剪枝

预剪枝

在构建决策树的过程时,提前停止,边构建边剪枝
例如指定决策树深度为3,或者构建过程中,手动停止;或者样本数小于五十就提前停止。
决策树分类_第12张图片

后剪枝

决策树建好后,然后才开始裁剪。
构造新的损失函数,加入叶子节点个数作为约束项。
在这里插入图片描述
Tleaf表示叶子节点的个数,C(T)是前面讲述的评价函数。
α大,叶子节点就约束要更少一点,α小,叶子节点数量可以相对大一点。比较不分叶子节点之前和之后的损失值。就是比较剪枝和不剪枝的损失。

随机森林

构建多棵决策树,用这一片决策树去共同进行最终决策。
双重随机性:1.样本选择随机,决策树的构建从原始训练集随机选择(可能就只随机选择样本中的60%的数据,有放回采样);2.特征选择随机,也可能有异常特征,特征选择不是有放回的。决策树均选择部分特征。
决策树分类_第13张图片
Bootstraping:有放回采样
Bagging:有放回采样n个样本一共建立分类器

通过花萼和花瓣的长度和宽度对鸢尾花分类

from sklearn import datasets
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
# 1. criterion gini or entropy
# 2.spliter best or random 前者是在所有特征中找最好的切分点,后者是部分特征中(数据量大的时候)
# 3.max_feaures None(所有),log2,sqrt,N 特征小于50 的时候一般使用所有的特征
# 4.max_depth 数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况,可以尝试限制
# 5.min_samples_split 如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分
#                     如果样本量不大,不需要管这个值,如果样本量数量级非常大,则推荐增大这个值
# 6.min_samples_leaf 这个值限制了叶子节点最少的样本数,如果某叶子节点数目少于样本数,则会和兄弟节点一起被剪枝
#                    如果样本量不大,不需要管这个值,大些如10w可以尝试5
# 7.min_weight_fraction_leaf 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝
#                            默认为0,就是不考虑权重问题。一般来说,如果有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这是时再注意这个值
# 8.max_leaf_nodes  通过限制最大叶子节点数,可以防止过拟合,默认是”None“ -表示不限制最大的叶子节点数
#                   如果加了限制,算法会建立再最大叶子节点数内的最优决策树
#                   如果特征不多,不用考虑这个值,如果特征过多,可以加以限制
# 9.class_weight    指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多
#                   导致训练的决策树过于偏向这些类别,这里可以自己指定各个样本的数量
#                   如果使用”balanced“,则算法会自己计算权重,样本量少的类别所对应的样本权重会高
# 10.min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)
#                       小于这个阈值,则该节点不再生成子节点,即为最终叶子节点

from sklearn.model_selection import train_test_split

# 用决策树做鸢尾花分类
iris = datasets.load_iris()
X = iris.data
y = iris.target
#用train_test_split函数划分出训练集和测试集,测试集占比0.33
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.75, random_state=1)

iris_data = pd.read_csv("iris.xls",error_bad_lines=False)

decision_tree_classifier = DecisionTreeClassifier()
# Train the classfier on the training set
decision_tree_classifier.fit(X_train,y_train)
m = decision_tree_classifier.score(X_test,y_test)# 0.9203539823008849

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