ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(九)机器学习---决策树

2020-12-12 16:57:07  阅读:211  来源: 互联网

标签:剪枝 plt 机器 dataSet --- 增益 节点 决策树


目录

一:方差与偏差:

  • 1:方差:描述的是数据本身的一种分布情况。
  • 2:偏差:实验值与目标值之间的差异程度。
  • 3:如果方差很小,对我们模型来说是没有任何帮助的,我们就会去掉这些值。例如:身高都是1.6米左右,我们就去掉身高这一列。
    在这里插入图片描述

二:决策树的介绍:

  • 1: 决策树天然解决多分类问题。
  • 2:决策树解决回归问题。
  • 3:决策树是非参数学习算法。
    在这里插入图片描述

三:代码实现决策树:

1: 加载原有化数据并打印:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

iris = datasets.load_iris()
print(iris)

数据有一个二维的,和一个一维的。
在这里插入图片描述
2:取出二维下标是2,3的列,然后也取出一维的分别用X,y保存。

X = iris.data[:,2:]
print(X)
y = iris.target
print(y)

在这里插入图片描述
3:我们发现y(真实值)有三种标签,分别是0, 1, 2,所以根据y的不同,将X中的不同的点用plt画出来。

plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.scatter(X[y==2,0],X[y==2,1])
plt.show()

在这里插入图片描述
4:训练决策树模型:
注意决策树既可以做分类,也可以做回归,此时应该导入分类的包。

from sklearn.tree import DecisionTreeClassifier # 构建分类的决策树

tree = DecisionTreeClassifier(max_depth=2,criterion="entropy") # 指定树的深度和熵

tree.fit(X,y) # 进行训练

5:绘制决策树的边界(代码不用纠结,会用就行):

def plot_decision_boundary(model,axis):
    x0,x1 = np.meshgrid(
        np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
        np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
    )
    X_new = np.c_[x0.ravel(),x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)

    from matplotlib.colors import ListedColormap
    custom_map = ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"])

    plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)

plot_decision_boundary(tree,axis=[0.5,7.5,0,3])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.scatter(X[y==2,0],X[y==2,1])
plt.show()

在这里插入图片描述
在这里插入图片描述
决策树可以解决回归问题:落在叶子节点(对应图中的A、B、C三点)的数据的平均值作为回归的结果。

四:熵:

1:特征选择问题:

特征选择在于选取对于训练数据具有分类能力的特征,这样可以提高决策树学习的效率。

2:熵的概念:

  • 1:熵在信息论中代表随机变量不确定度的度量
  • 2:熵越大,数据的不确定性度越高。
  • 3:熵越小,数据的不确定性越低。

在这里插入图片描述
当数据只有两类时,也就是二分类问题,公式可以变成:
在这里插入图片描述

3:代码实现熵:

import numpy as np
import matplotlib.pyplot as plt

def entropy(p):
    return -p*np.log(p)-(1-p)*np.log(1-p)

x = np.linspace(0.01,0.99,200)
plt.plot(x,entropy(x))
plt.show()

在这里插入图片描述

五:信息增益(熵增益):

  • 由于特征A使得数据集合的分类的不确定性减少的程度。

1: 信息增益的描述:

在这里插入图片描述

2: 信息增益算法:

1:定义的变量:
在这里插入图片描述
2:具体的算法:
在这里插入图片描述
此时的条件熵= - 【(1.6人数/总人数)[(1.6的男人数/ 1.6的总人数) * log((1.6的男人数/ 1.6的总人数)) +[(1.6的女人数/ 1.6的总人数) * log((1.6的女人数/ 1.6的总人数)) ] + (1.7人数/总人数)[(1.7的男人数/ 1.7的总人数) * log((1.7的男人数/ 1.7的总人数)) +[(1.7的女人数/ 1.7的总人数) * log((1.7的女人数/ 1.7的总人数)) ] 】

最后信息增益 = 经验熵- 条件熵。

3: 熵增益的计算过程:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4:信息增益比:

  • 使用信息增益比的原因:以信息增益作为划分训练数据集的特征,存在倾向于选择取值较多的特征问题,使用信息增益比可以对这个问题进行矫正。
  • 核心思想就是:如果你的特征值多,我就让你的熵减少的幅度小。如果你的特征少,我就大幅度的减少你的熵值。

理解:比如说上面的贷款案例,我以id作为特征进行划分,则会有15个特征,每个特征计算的条件熵都是0,则熵增益就会最大,就会根据id进行分类。因为以id划分的类最多,所以倾向于使用id划分。我们使用信息增益比就是对这种问题进行修正。
在这里插入图片描述

六:决策树的生成:

1:ID3算法:

  • 1:核心:在决策树的各个节点上应用信息增益准则进行特征选择,递归的构建决策树。
  • 2:从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同哦取值建立子节点;再对子节点递归调用以上方法,构建决策树;直到所有特征的信息增益均很小或者没有特征可以选择为止。最后得到一个决策树。

1: 首先构建一组判断某中生物是否是鱼类的测试数据:
在这里插入图片描述

2:构造创建数据集的函数:

def createDataset():
    dataSet = [[1, 1, 'yes'],
               [1, 1, 'yes'],
               [1, 0, 'no'],
               [0, 1, 'no'],
               [0, 1, 'no']]
    labels = ['no surfacing', 'flippers']
    return dataSet, labels

3:创建能够计算经验熵的函数:

传入一个列表,计算出经验熵的值。

def calcShannonEnt(dataSet):
    numEntries = len(dataSet) # 计算有多少行
    # 为分类创建字典
    labelCounts = {}
    for featVec in dataSet:
        currentLabel = featVec[-1] # 取出标签
        if currentLabel not in labelCounts.keys(): # 如果标签不存在则新增标签,初始化标签数量为0
            labelCounts.setdefault(currentLabel, 0)
        labelCounts[currentLabel] += 1 # 让标签的数量增加

    # 计算香农墒
    shannonEnt = 0.0 # 定义一个熵,初始化0.0
    # labelCounts = {'yes': 2, 'no': 3}
    for key in labelCounts:
        prob = float(labelCounts[key]) / numEntries # 2/5 和 3/5
        shannonEnt -= prob * math.log2(prob) # - 2/5 * log(2/5) - 3/5 * log(3/5)
    return shannonEnt # 返回经验熵

4:计算最大的信息增益:

给我一个列表,我能返回获取最大增益的那一列的下标。

#  定义按照最大信息增益划分数据的函数
def chooseBestFeatureToSplit(dataSet):
    numFeature = len(dataSet[0]) - 1 # 取出第一行来,计算值等于 = 行数 - 1 
    print(numFeature)
    baseEntropy = calcShannonEnt(dataSet)# 计算这个函数的经验熵
    bestInforGain = 0 # 最大曾益熵
    bestFeature = -1 # 最大曾益熵的那一列下标

    for i in range(numFeature): # 遍历数据集的列
        featList = [number[i] for number in dataSet] #得到某个特征下所有值
        uniqualVals = set(featList) #set无重复的属性特征值,拿到能否在水下生存的两个类型:能, 否。
        newEntrogy = 0

        #求和
        for value in uniqualVals:# value 可以取 能/否
            subDataSet = splitDataSet(dataSet, i, value) # 将dataSet拆分, 第一次拆分出能在水下的集合,第二次拆分出不能在水下的集合。
            prob = len(subDataSet) / float(len(dataSet)) #即p(t) 能在水下的数量/总数量
            newEntrogy += prob * calcShannonEnt(subDataSet) #对各子集求香农墒 ; 能在水下的数量/总数量 * 子集的香农墒  再求和 = 条件熵

        infoGain = baseEntropy - newEntrogy #计算信息增益 = 经验熵 - 条件熵

        # 最大信息增益
        if infoGain > bestInforGain:
            bestInforGain = infoGain
            bestFeature = i
    return bestFeature # 返回最大曾益熵的那一列的下标。

5:

七:决策树的剪枝:

1: 剪枝的原因?

  • 1:决策树生成算法递归产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据分类很准确,但是对未知的测试数据分类却没有那么准确,即出现过拟合现象。
  • 2:过拟合的原因在于学习时过多的考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树
  • 3:解决这个问题的办法,就是对生成的决策树进行简化。决策树简化的过程称为剪枝
  • 4:具体来说就是从已生成的树上裁掉一些子树或者叶节点,并将其根节点或父节点作为新的叶节点,从而简化分类树模型。

2:剪枝算法的理解:

1:损失函数的理解:

在这里插入图片描述

3:剪枝算法:

  • 1:预剪枝:边构造边剪枝。
  • 2:后剪枝:构造完再剪枝。

我们在这里采用后剪枝:

思路:从树的叶子节点开始向根节点递归,计算每个根节点的没有剪枝的损失值和减掉之后的损失值,如果减掉之后的损失值小于减掉之前的损失值,则表示减掉之后损失值变小了 ,则进行剪枝,将父节点变成新的叶子节点。反之则不进行剪枝。

在这里插入图片描述

八:基尼指数:

  • 1: 基尼指数和熵的概念差不多。

1:基尼指数的定义:

在这里插入图片描述
在这里插入图片描述

2:基尼指数的计算案例:

在这里插入图片描述

九:CART算法

  • 1:CART分类树使用基尼系数来代替信息增益,基尼系数越小,模型的不纯度越低,特征越好。
  • 2:CART既可以分类,也可以做回归。
  • 3:CART算法是个二叉树。

十:

标签:剪枝,plt,机器,dataSet,---,增益,节点,决策树
来源: https://blog.csdn.net/qq_41341757/article/details/110941061

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有