首页 > 其他分享 >吴恩达机器学习 第二课 week4 决策树

吴恩达机器学习 第二课 week4 决策树

时间:2024-06-18 11:57:42浏览次数:9  
标签:node 吴恩达 right 第二课 feature depth indices week4 left

目录

01 学习目标

02 实现工具

03 问题描述

04 构建决策树

05 总结


01 学习目标

     (1)理解“熵”、“交叉熵(信息增益)”的概念

     (2)掌握决策树的构建步骤与要点

02 实现工具

    (1)代码运行环境

              Python语言,Jupyter notebook平台

    (2)所需模块

              numpy,matplotlib,public_tests

03 问题描述

       假设你是犇犇蘑菇集团的总裁,你现在要亲自抽检10只蘑菇,看下里面有几只是毒蘑菇,程序猿出身的你打算采用决策树进行检测,Let's begin!

04 构建决策树

     (1)导入所需模块

import numpy as np
import matplotlib.pyplot as plt
from public_tests import *

%matplotlib inline

      (public_tests是自定义模块,内部包括compute_entropy_test、split_dataset_test、compute_information_gain_test、get_best_split_test共4个函数,是一个 Jupyter Notebook 的魔法命令(Magic Command),用于在 Notebook 单元格中直接显示 Matplotlib 生成的图形) 

     (2)数据集

       抽检的蘑菇采用3个特征,分别是Brown Cap、Tapering Stalk Shape和Solitary,检测结果为是/否有毒。特征及结果采用独热编码(one-hot),如下表:

        其中,Brown Cap列的1表示“棕色帽”、0表示“红色帽”;Tapering Stalk Shape列的1表示“锥形茎”、0表示“扩口茎”;Solitary列的1表示“单生”、0表示“非单生”;Edible列的1表示“无毒”、0表示“有毒”。

       数据定义如下:

X_train = np.array([[1,1,1],[1,0,1],[1,0,0],[1,0,0],[1,1,1],[0,1,1],[0,0,0],[1,0,1],[0,1,0],[1,0,0]])
y_train = np.array([1,1,0,0,1,0,0,1,1,0])

      (3)决策树步骤

         决策树构建分4步:①选择根节点特征;②计算所有分裂情况的信息增益并选择具有最高信息增益的特征;③根据选择的特征拆分数据集,创建树的左右分支;④继续重复分割过程,直到满足停止条件。

        信息增益(又称“交叉熵”)表示由于分裂导致的熵的变化,熵用来衡量信息混乱程度,熵大则乱,信息增益的一般计算公式如下:

Info \;\; gain=H(P_{root})-[W_{left}H(P_{left})+W_{right}H(P_{right})]

H(P_i)=-Plog_2(P_i)-(1-P_i)log_2(1-P_i)

 其中,Info gain为信息增益,H(P)为概率P的熵,P=k/nk为目标出现次数,n为总数。

      (4)代码实现决策树

         ①定义熵函数

def compute_entropy(y):

    entropy = 0.
    k = 0
    n = len(y)
    if n == 0:
        entropy = 0
    else:
        for i in range(n): 
            k += y[i]       
        p = k / n
        if p == 0 or p == 1:
            entropy = 0
        else:
            entropy = -p * np.log2(p) - (1 - p) * np.log2(1 - p)

    return entropy

       ②定义分裂函数

def split_dataset(X, node_indices, feature):
    
    left_indices = []
    right_indices = []
    for id in node_indices:
        if X[id, feature] == 1:
            left_indices.append(id)
        else:
            right_indices.append(id)
    
    return left_indices, right_indices

       ③定义信息增益函数

def compute_information_gain(X, y, node_indices, feature):
       
    left_indices, right_indices = split_dataset(X, node_indices, feature)
    
    X_node, y_node = X[node_indices], y[node_indices]
    X_left, y_left = X[left_indices], y[left_indices]
    X_right, y_right = X[right_indices], y[right_indices]
    
    num_left = len(X_left)
    num_right = len(X_right)
    num_sum = num_left + num_right
 
    w_left = num_left / num_sum
    w_right = num_right / num_sum
    entropy_w = w_left * compute_entropy(y_left) + w_right * compute_entropy(y_right)                                    
    information_gain = compute_entropy(y_node) - entropy_w  
    
    return information_gain

       ④定义最优分裂函数

def get_best_split(X, y, node_indices):       
    
    num_features = X.shape[1]
    
    best_feature = -1
    max_info_gain = 0
    for feature in range(num_features):
        info_gain = compute_information_gain(X, y, node_indices, feature)
        if info_gain > max_info_gain:
            max_info_gain = info_gain
            best_feature = feature
    
    return best_feature

       ⑤定义决策树函数

tree = []

def build_tree_recursive(X, y, node_indices, branch_name, max_depth, current_depth): 

    # 停止分裂的条件
    if current_depth == max_depth:
        formatting = " "*current_depth + "-"*current_depth
        print(formatting, "%s leaf node with indices" % branch_name, node_indices)
        return

    best_feature = get_best_split(X, y, node_indices) 
    tree.append((current_depth, branch_name, best_feature, node_indices))
    
    formatting = "-"*current_depth
    print("%s Depth %d, %s: Split on feature: %d" % (formatting, current_depth, branch_name, best_feature))
    
    # 在最优特征处分裂
    left_indices, right_indices = split_dataset(X, node_indices, best_feature)
    
    # 继续分裂
    build_tree_recursive(X, y, left_indices, "Left", max_depth, current_depth+1)
    build_tree_recursive(X, y, right_indices, "Right", max_depth, current_depth+1)

      (分支名称branch_name:'Root', 'Left', 'Right';formatting = "-"*current_depth用于生成与“current_depth”数量相等的“-”,用于缩进)

       ⑥开始构建决策树

build_tree_recursive(X_train, y_train, root_indices, "Root", max_depth=2, current_depth=0)

       运行以上代码,结果如下:

    

       决策树的分类结果如下图所示(自己用PPT绘的):

05 总结

      (1)决策树的构建包括:计算熵、信息增益、寻找最优分裂方式3个核心要点。

      (2) 决策树要解决的是多特征分类识别问题。

标签:node,吴恩达,right,第二课,feature,depth,indices,week4,left
From: https://blog.csdn.net/weixin_43490087/article/details/139724609

相关文章

  • 吴恩达机器学习 第二课 week3 学习算法(模型)进阶
    目录01学习目标02导入计算所需模块03多项式回归模型进阶3.1数据集划分3.2 寻找最优解3.3 正则优化3.4增大数据量04神经网络模型进阶4.1数据准备4.2模型复杂度4.3正则优化05总结01学习目标   (1)掌握多项式回归模型的求解和优化   (2)掌握神......
  • AI大佬吴恩达+OpenAI团队编写:面向大模型入门者的 LLM CookBook 汉化版
    粉丝们久等了!!!我又来更LLM大模型的必备读物啦!这次给大家推荐的是AI圈无人不知的吴恩达大佬+OpenAI团队一起编写的大模型入门文档,也就是这本:大型语言模型(LLM)的权威文档<面向开发者的LLM入门PDF>在Github上已经高达56.8kstar了,这含金量啧啧啧朋友们如果有需要这份《LLMC......
  • AI大佬吴恩达+OpenAI团队编写:面向大模型入门者的 LLM CookBook 汉化版
    粉丝们久等了!!!我又来更LLM大模型的必备读物啦!这次给大家推荐的是AI圈无人不知的吴恩达大佬+OpenAI团队一起编写的大模型入门文档,也就是这本:大型语言模型(LLM)的权威文档<面向开发者的LLM入门PDF>在Github上已经高达56.8kstar了,这含金量啧啧啧朋友们如果有需要这份《LLMC......
  • 吴恩达机器学习第二课 Advanced Learning Algorithms
    AdvancedLearningAlgorithmsweek11.1神经元和大脑1.2需求预测构建自己神经网络的时候:需要决定隐藏层的个数和每个隐藏层的神经元个数1.3图像感知像素的亮度值从0~255变化人脸识别:训练一个神经网络,以一个特征向量作为输入,输出图片中人的身份2.1神经网络中的网......
  • 吴恩达机器学习第一课 Supervised Machine Learning Regression and Classification
    SupervisedMachineLearningRegressionandClassification第一周1.1机器学习定义1.2监督学习1.2.1回归在输入输出学习后,然后输入一个没有见过的x输出相应的y1.2.2classification有多个输出1.3无监督学习数据仅仅带有输入x,但不输出标签y,算法需要找到数据中的......
  • 吴恩达 机械学习笔记1
    机械学习的两个主要模型:笔记右下角有页码1.监督学习......
  • 算法金 | 吴恩达:机器学习的六个核心算法!
    大侠幸会,在下全网同名「算法金」0基础转AI上岸,多个算法赛Top「日更万日,让更多人享受智能乐趣」人工智能领域的权威吴恩达教授,在其创立的《TheBatch》周报中发表了一篇博文,概述了机器学习领域六种基础算法的历史和重要性。他强调了在这一领域不断学习和更新知识的必要......
  • 吴恩达机器学习 week1 一元回归模型的成本函数
    01学习目标    学习建立一元线性回归模型的成本函数02实现工具  (1)代码运行环境       Python语言,Jupyternotebook平台  (2)所需模块       NumPy,Matplotlib,lab_utils_uni      (lab_utils_uni是课程中用于绘制复......
  • 深度学习吴恩达学习记录 141-150
    人脸验证问题:对于进行人脸验证我们在数据库中可能只有每位员工的一张照片而已,然而要通过这一张照片验证出是否是库中的员工,同时如果在库中增加成员是否能验证出来,这种数据集实在太小,可以使用learningasimilarityfunction这个函数进行计算验证,其作用就是设置一个阈值,如果说对人......
  • 深度学习吴恩达学习记录 133-140
    目标定位:对于图像上的目标,如果进行识别后还需要将其在图上进行框出,我们就要多训练几个数据,一个就是识别目标的中心点,另外一个就是我设置圈出的长与宽可以记为bx,by,bh,bw;根据训练出的模型在图像检测上预测出这四个点的位置,当物体出现的时候就可以根据这个数据进行定位。当然要做......