西瓜书决策树实现(基于ID3)——采用字典数据结构

一、前言
这段时间疫情不那么严重,回公司上班了。平时工作比较忙,而且重点在学习数学。很久没有更新,最近实现《西瓜书》决策树,贴出来给大家共享。西瓜数据集2.0如下:在这里插入代码片
[‘青绿’, ‘蜷缩’, ‘浊响’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘乌黑’, ‘蜷缩’, ‘沉闷’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘乌黑’, ‘蜷缩’, ‘浊响’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘青绿’, ‘蜷缩’, ‘沉闷’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘浅白’, ‘蜷缩’, ‘浊响’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘青绿’, ‘稍蜷’, ‘浊响’, ‘清晰’, ‘稍凹’, ‘软粘’, ‘好瓜’],
[‘乌黑’, ‘稍蜷’, ‘浊响’, ‘稍糊’, ‘稍凹’, ‘软粘’, ‘好瓜’],
[‘乌黑’, ‘稍蜷’, ‘浊响’, ‘清晰’, ‘稍凹’, ‘硬滑’, ‘好瓜’],
[‘乌黑’, ‘稍蜷’, ‘沉闷’, ‘稍糊’, ‘稍凹’, ‘硬滑’, ‘坏瓜’],
[‘青绿’, ‘硬挺’, ‘清脆’, ‘清晰’, ‘平坦’, ‘软粘’, ‘坏瓜’],
[‘浅白’, ‘硬挺’, ‘清脆’, ‘模糊’, ‘平坦’, ‘硬滑’, ‘坏瓜’],
[‘浅白’, ‘蜷缩’, ‘浊响’, ‘模糊’, ‘平坦’, ‘软粘’, ‘坏瓜’],
[‘青绿’, ‘稍蜷’, ‘浊响’, ‘稍糊’, ‘凹陷’, ‘硬滑’, ‘坏瓜’],
[‘浅白’, ‘稍蜷’, ‘沉闷’, ‘稍糊’, ‘凹陷’, ‘硬滑’, ‘坏瓜’],
[‘乌黑’, ‘稍蜷’, ‘浊响’, ‘清晰’, ‘稍凹’, ‘软粘’, ‘坏瓜’],
[‘浅白’, ‘蜷缩’, ‘浊响’, ‘模糊’, ‘平坦’, ‘硬滑’, ‘坏瓜’],
[‘青绿’, ‘蜷缩’, ‘沉闷’, ‘稍糊’, ‘稍凹’, ‘硬滑’, ‘坏瓜’]
二、样本数据读取及存储
为了便于数据操作,每个数据样本存储为字典,字典key为样本各个特征,比如纹理,敲声等,字典value对应特征标签值,比如清晰、沉闷。

def read_data(filename):
    
    """
    Function : 读取西瓜数据集
    
    Input: filename: 数据集文件名
          
    Output: data:西瓜数据集列表,列表元素为字典,每个字典保存西瓜属性
           
    """
    
    text_list = []
    with open(filename,"r") as f:
        #当读到最后一行的下一行时,line 为空集,停止读取
        while True:
            line = f.readline()
            if not line:
                break
            #删除每行尾换行符
            line = line.strip("\n")
            #s删除每行头尾空格
            line = line.strip(" ")
            #删除每行头尾的[ ,]
            line = line.strip("[")
            line = line.strip(",")
            line = line.strip("]")
            if line != "":
                text_list.append(line)
    
    #创建数据列表,每个西瓜数据为一个字典,字典形成列表
    dataset = []
    
   
    for i,text_line in enumerate(text_list):
        
        #把每行字符串分割为列表
        split_data_text = text_line.split( ",")
        
        #每个西瓜数据初始化一个字典对象并保存该西瓜的数据
        dic_example = {
   }
        dic_example["编号"] = i + 1
        #删除每个特征标签的引号和空格
        dic_example["色泽"] = split_data_text[0].replace("'","").strip()
        dic_example["根蒂"] = split_data_text[1].replace("'","").strip()
        dic_example["敲声"] = split_data_text[2].replace("'","").strip()
        dic_example["纹理"] = split_data_text[3].replace("'","").strip()
        dic_example["脐眼"] = split_data_text[4].replace("'","").strip()
        dic_example["触感"] = split_data_text[5].replace("'","").strip()
        dic_example["标签"] = split_data_text[6].replace("'","").strip()
        
        #将西瓜数据字典加入列表
        dataset.append(dic_example)
                
    return dataset
    #建立数据集

数据读取结果如下:

filename = "西瓜数据集2.0.txt"
dataset = read_data(filename)
[{
   '编号': 1,
  '色泽': '青绿',
  '根蒂': '蜷缩',
  '敲声': '浊响',
  '纹理': '清晰',
  '脐眼': '凹陷',
  '触感': '硬滑',
  '标签': '好瓜'},
 {
   '编号': 2,
  '色泽': '乌黑',
  '根蒂': '蜷缩',
  '敲声': '沉闷',
  '纹理
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于ID3算法的决策树分类器实现步骤如下: 1. 收集数据集,包括特征和分类标签。 2. 计算数据集的熵,用于衡量数据集的无序程度。 3. 针对每个特征,计算信息增益,选择信息增益最大的特征作为节点。 4. 将数据集按照选择的特征分成不同的子集,递归地构建决策树。 5. 当所有特征都被使用或者数据集已经完全分类时,停止递归。 6. 对新数据进行分类,根据决策树的规则进行分类。 需要注意的是,ID3算法有可能会出现过拟合的情况,因此可以采用剪枝等方法来提高决策树的泛化能力。 ### 回答2: ID3算法是一种经典的分类算法,可以通过计算经验熵来构建决策树。在实现基于ID3算法的决策树分类器时,需要进行以下步骤。 1. 数据准备 首先需要准备好训练数据。数据应该包括若干个样本,每个样本包含若干个特征和一个类别标签。 2. 计算信息熵 使用信息熵来衡量数据的混乱程度。信息熵的公式为:$H = -\sum_{i=1}^k p_i \log_2 p_i$,其中$p_i$是某个类别在所有样本中出现的概率。 3. 计算信息增益 信息增益衡量某个特征对分类的贡献程度。信息增益的公式为:$Gain(A) = H(D) - \sum_{v=1}^V \frac{|D_v|}{|D|}H(D_v)$,其中$A$是某个特征,$D$是所有样本,$D_v$是某个特征取某个值时的样本。计算每个特征的信息增益,找到信息增益最大的特征。 4. 构建决策树 将信息增益最大的特征作为当前节点的分裂特征。将所有样本按照该特征的取值分成若干个子集。对每个子集递归调用上述步骤,直到无法分割或者达到某个条件时停止递归。 5. 预测 对于新的数据样本,根据决策树进行分类。从根节点开始,根据各个特征的取值不断向下遍历,直到到达叶子节点,叶子节点的类别即为预测结果。 以上是基于ID3算法实现决策树分类器的主要步骤。在实际应用中,还需要考虑如何处理缺失数据、如何剪枝优化等问题。此外,也可以使用其他决策树算法,如C4.5和CART等。 ### 回答3: —————————————分割线—————————————— 决策树机器学习领域中重要的算法之一,它可以将数据集合分成可辨识别的不同类别,适用于二分类和多分类问题。而ID3算法是其中被广泛应用的一种决策树算法,它的主要核心是通过信息增益来分裂数据集合,得到高准确率。 实现基于ID3算法的决策树分类器的主要思路可以概括为: 1. 选取一个最优的特征,将数据集划分为若干个子集,使得节点上的样本分类纯度更高。通常采用信息增益或信息增益比来选择最优特征。 2. 不断调用递归函数,从根节点开始构建决策树。 3. 对于每个子集,如果该集合中的样本已经被完全划分为同一类别,或者集合为空,则对应的节点标记为叶子节点,并标注该节点的分类类别。 4. 否则,继续选择最优特征,将该子集继续划分为更小的子集。 实现ID3算法的代码框架可以参考以下伪代码: function ID3(DataSet) if (DataSet.samples all belong to same class): return a leaf node with the class as label else if(DataSet.features are empty): return a leaf node with the majority class as label else bestFeat = choose the feature with maximum information gain tree = a new decision tree with root node as bestFeat divide DataSet into subsets according to bestFeat for each subset add a branch to tree with ID3(subset) end for end if return tree end function 其中,信息增益的计算方式为: $Gain(D, A) = Ent(D) - \sum_{v=1}^V \frac{|D^v|}{|D|} Ent(D^v)$ 其中,$D$为数据样本集合,$A$为要进行划分的特征集合,$D^v$为集合$D$划分后属于$A$中特征值为$v$的子集合,$Ent$为样本不确定性度量函数。 通过ID3算法实现决策树分类器在处理张量数据时存在着一些困难之处,这时,可以将高维张量数据投影到低维度空间中使用ID3算法进行分类。这样可以降低特征数量对分类器效果的影响,从而提高计算效率和精度。 在实际应用中,ID3算法的效果受到很多因素的影响,如数据集质量、特征选择和树的剪枝方法等。因此,在使用中需要对其进行不断的优化和改进,以获得更好的分类效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值