实验六:随机森林

目录

实验前准备

实现随机特征选择

实现决策树类

采用Bootstrap自助采样法进行采样

训练决策树

采用相对多数投票法进行结果预测

实验总结


实验前准备

本实验是在Anaconda下的jupyter notebook上进行的,使用的代码语言为python。在开始实验前,我们首先需要导入所需要的库与包或者模块。本实验是一个使用决策树生成随机森林的实验,需要处理大量的实验数据,需要处理多维数组对象,以及可能需要画图进行可视化处理,还有一些数学公式的运用,所以我们需要导入的包为numpy、pandas、math以及matplotlib.pyplot。同时我们还需要使用Counter类来统计标签数组的所有可能取值,以及使用random函数来随机选取样本,所以我们还需要导入Counter以及random

代码实现:

from collections import Counter
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
import random

实现随机特征选择

实验要求:

代码实现:

# 计算信息熵
def entropy(label):
    # 首先使用Counter类进行遍历,统计出标签数组中有多少个非重复的值k
    counter=Counter(label)
    k=len(counter)
    
    # 获取标签数组中一共有多少个数据
    total_length=len(label)
    
    #通过for循环遍历出每一个值对应的出现次数,然后利用公式进行叠加
    temp=0
    for value,count in counter.items():
        pk=count/total_length
        temp+=(pk*math.log2(pk))
    
    # 将累加的结果进行取反即可得到信息熵
    ent=-temp
    return ent

# 计算指定维度的信息增益
def Calculate_Dimension_Gain(D, dimension):
    D_array=np.array(D)
    # 提取标签列
    labels = D_array[:, -1] 
    # 提取特征列的值
    values = D_array[:, dimension]  
    
    # 获取特征列的唯一值
    unique_values = np.unique(values)  
    # 计算数据集D的信息熵
    entropy_D = entropy(labels)  
    
    # 初始化定义加权平均的信息熵
    weighted_entropy = 0
    for value in unique_values:
        # 提取特征值为该值的子集
        D_v = D_array[values == value]  
        # 计算子集的熵
        entropy_D_v = entropy(D_v[:, -1])  
        # 累加求和
        weighted_entropy += (len(D_v) / len(D)) * entropy_D_v
        
    # 计算得到该属性的信息增益
    Gain = entropy_D - weighted_entropy
    return Gain

# 获取剩下的维度中最佳的划分维度
def best_split(D, A):
    # 首先确定d的取值
    d=len(A)
    # 确定k的取值
    k=int(max(math.log2(d),1))
    # 然后随机选取k个特征构成A'
    A_array=np.array(list(A))
    # 样本的选择是无序的,就是会出现4,2,5这种情况
    A_prime=np.random.choice(A_array, replace=False, size=k)
    
    # 初始化信息增益为负无穷
    best_gain = -float('inf')
    # 初始化最佳的划分维度为None
    best_dimension = None
    
    # 遍历在A_prime维度中的所有维度
    for dimension in A_prime:
        # 调用前面的函数计算在该维度下的信息增益值
        gain = Calculate_Dimension_Gain(D, dimension)
        
        # 如果信息增益值大于最佳的信息增益best_gain,
        # 就更新best_gain为当前的信息增益值
        # 同时更新最佳的划分维度
        if gain > best_gain:
            best_gain = gain
            best_dimension = dimension
    
    return best_dimension

# 测试用例
D = [[1, 2, 0, 0, 0],
                  [4, 2, 1, 0, 0],
                  [1, 5, 0, 1, 1],
                  [4, 2, 1, 1, 0],
                  [1, 2, 0, 1, 1]]
A = [0,1,2,3,4]

best_split(D,A)

实现决策树类

实验要求:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值