目录
实验前准备
本实验是在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)
实现决策树类
实验要求: