Python实现决策树C4.5算法的示例

yizhihongxing

Python实现决策树C4.5算法的示例

什么是决策树C4.5算法?

决策树C4.5算法是一种常用的分类算法,它的基思通过对数据集进行划分,构建一棵树形结构,从而实现对数据的分类。C4.5算法是ID3算法改进版,它在ID3算法的基础上引入了信息增益比的概念,解决了ID3算法中存在的一些问题。

决策树C4.5算法的实现步骤

决策树C4.5算法的实现步骤如下:

  1. 最优特征:根据信息增益比选择最优特征作为当前节点的划分特征。

  2. 划分数据集:根据选择的特征将数据集划分成若干个子集。

  3. 递归构建决策树:对于个子集,重复步骤1和步骤2,直到所有子集都为同一类别或者无法再分为止。

4.枝处理:对构建好的决策树进行剪枝处理,提高决策树的泛化能力。

示例1:使用决策树C4.5算法进行分类

下面是一个示例,用于演示如何使用决策树C4.5算法分类。在这个示例中,我们假设有一个数据集,它包含5个样本,每个样本有两个特征,分别是年龄和收入,以及一个类别签,表示该样本属于哪个类别。数据集如下:

年龄 收入 类别
20 2000 0
25 2500 0
30 3000 1
35 3500 1
40 4000 1

我们需要使用决策树C4.5算法对这个数据集进行分类。

import math

def calc_entropy(data_set):
    num_entries = len(data_set)
    label_counts = {}
    for feat_vec in data_set:
        current_label = feat_vec[-1]
        if current_label not in label_counts.keys():
            label_counts[current_label] = 0
        label_counts[current_label] += 1
    entropy = 0.0
    for key in label_counts:
        prob = float(label_counts[key]) / num_entries
        entropy -= prob * math.log(prob, 2)
    return entropy

def split_data_set(data_set, axis, value):
    ret_data_set = []
    for feat_vec in data_set:
        if feat_vec[axis] == value:
            reduced_feat_vec = feat_vec[:axis]
            reduced_feat_vec.extend(feat_vec[axis+1:])
            ret_data_set.append(reduced_feat_vec)
    return ret_data_set

def choose_best_feature_to_split(data_set):
    num_features = len(data_set[0]) - 1
    base_entropy = calc_entropy(data_set)
    best_info_gain_ratio = 0.0
    best_feature = -1
    for i in range(num_features):
        feat_list = [example[i] for example in data_set]
        unique_vals = set(feat_list)
        new_entropy = 0.0
        split_info = 0.0
        for value in unique_vals:
            sub_data_set = split_data_set(data_set, i, value)
            prob = len(sub_data_set) / float(len(data_set))
            new_entropy += prob * calc_entropy(sub_data_set)
            split_info -= prob * math.log(prob, 2)
        info_gain = base_entropy - new_entropy
        if split_info == 0.0:
            continue
        info_gain_ratio = info_gain / split_info
        if info_gain_ratio > best_info_gain_ratio:
            best_info_gain_ratio = info_gain_ratio
            best_feature = i
    return best_feature

def majority_cnt(class_list):
    class_count = {}
    for vote in class_list:
        if vote not in class_count.keys():
            class_count[vote] = 0
        class_count[vote] += 1
    sorted_class_count = sorted(class_count.items(), key=lambda x:[1], reverse=True)
    return sorted_class_count[0][0]

def create_tree(data_set, labels):
    class_list = [example[-1] for example in data_set]
    if class_list.count(class_list[0]) == len(class_list):
        return class_list[0]
    if len(data_set[0]) == 1:
        return majority_cnt(class_list)
    best_feat = choose_best_feature_to_split(data_set)
    best_feat_label = labels[best_feat]
    my_tree = {best_feat_label: {}}
    del(labels[best_feat])
    feat_values = [example[best_feat] for example in data_set]
    unique_vals = set(feat_values)
    for value in unique_vals:
        sub_labels = labels[:]
        my_tree[best_feat_label][value] = create_tree(split_data_set(data_set, best_feat, value), sub_labels)
    return my_tree

data_set = [[20, 2000, 0], [25, 2500, 0], [30, 3000, 1], [35, 3500, 1], [40, 4000, 1]]
labels = ['age', 'income']
my_tree = create_tree(data_set, labels)
print(my_tree)

在这个示例中,我们定义了calc_entropy、split_data_set、choose_best_feature_to_split、majority_cnt和create_tree五个函数,用于实现决策树C4.5算法。然后,我们使用data和labels两个参数调用create_tree函数,构建决策树,并输出结果。

示例2:使用决策树C4.5算法进行分类

下面是另一个示例,用于演示如何使用决策树C4.5算法进行分类。在这个示例中,我们假设有一个数据集,它包含8个样本,每个样本有三个特征,分别是色泽、根蒂和敲声,以及一个类别标签,表示该样本属于个类别。数据集如下:

色泽 根蒂 敲声 类别
青绿 蜷缩 浊响 0
乌黑 蜷缩 沉闷 0
乌黑 稍蜷 浊响 1
青绿 稍蜷 浊响 1
浅白 蜷缩 浊响 0
乌黑 稍蜷 沉闷 1
青绿 硬挺 浊响 0
浅白 稍蜷 浊响 1

我们需要使用决策树C4.5算法对这个数据集进行分类。

import math

def calc_entropy(data_set):
    num_entries = len(data_set)
    label_counts = {}
    for feat_vec in data_set:
        current_label = feat_vec[-1]
        if current_label not in label_counts.keys():
            label_counts[current_label] = 0
        label_counts[current_label] += 1
    entropy = 0.0
    for key in label_counts:
        prob = float(label_counts[key]) / num_entries
        entropy -= prob * math.log(prob, 2)
    return entropy

def split_data_set(data_set, axis, value):
    ret_data_set = []
    for feat_vec in data_set:
        if feat_vec[axis] == value:
            reduced_feat_vec = feat_vec[:axis]
            reduced_feat_vec.extend(feat_vec[axis+1:])
            ret_data_set.append(reduced_feat_vec)
    return ret_data_set

def choose_best_feature_to_split(data_set):
    num_features = len(data_set[0]) - 1
    base_entropy = calc_entropy(data_set)
    best_info_gain_ratio = 0.0
    best_feature = -1
    for i in range(num_features):
        feat_list = [example[i] for example in data_set]
        unique_vals = set(feat_list)
        new_entropy = 0.0
        split_info = 0.0
        for value in unique_vals:
            sub_data_set = split_data_set(data_set, i, value)
            prob = len(sub_data_set) / float(len(data_set))
            new_entropy += prob * calc_entropy(sub_data_set)
            split_info -= prob * math.log(prob, 2)
        info_gain = base_entropy - new_entropy
        if split_info == 0.0:
            continue
        info_gain_ratio = info_gain / split_info
        if info_gain_ratio > best_info_gain_ratio:
            best_info_gain_ratio = info_gain_ratio
            best_feature = i
    return best_feature

def majority_cnt(class_list):
    class_count = {}
    for vote in class_list:
        if vote not in class_count.keys():
            class_count[vote] = 0
        class_count[vote] += 1
    sorted_class_count = sorted(class_count.items(), key=lambda x: x[1], reverse=True)
    return sorted_class_count[0][0]

def create_tree(data_set, labels):
    class_list = [example[-1] for example in data_set]
    if class_list.count(class_list[0]) == len(class_list):
        return class_list[0]
    if len(data_set[0]) == 1:
        return majority_cnt(class_list)
    best_feat = choose_best_feature_to_split(data_set)
    best_feat_label = labels[best_feat]
    my_tree = {best_feat_label: {}}
    del(labels[best_feat])
    feat_values = [example[best_feat] for example in data_set]
    unique_vals = set(feat_values)
    for value in unique_vals:
        sub_labels = labels[:]
        my_tree[best_feat_label][value] = create_tree(split_data_set(data_set, best_feat, value), sub_labels)
    return my_tree

data_set = [['青绿', '蜷缩', '浊响', 0], ['乌黑', '蜷缩', '沉闷', 0], ['乌黑', '稍蜷', '浊响', 1], ['青绿',稍蜷', '浊响', 1], ['浅白', '蜷缩', '浊响', 0], ['乌黑', '稍蜷', '沉闷', 1], ['青绿', '硬挺', '浊响', 0], ['浅白 稍蜷', '浊响', 1]]
labels = ['色泽', '根蒂', '敲声']
my_tree = create_tree(data_set, labels)
print(my_tree)

在这个示例中,我们定义了calc_entropy、split_data_set、choose_best_feature_to_split、majority_cnt和create_tree五个函数,用于实现决策树C4.5算法。然后,我们使用data_set和labels两个参数调用create_tree函数,构建决策,并输出结果。

结论

本文介绍了如使用Python实现决策树C4.5算法,并提供了两个示例说明。在实际应用中,我们可以根据具体的问题选择不同的算法实现方式,并结合其他算法进行综合处理,实现复杂的数据结构和算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现决策树C4.5算法的示例 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 浅析PHP与Python进行数据交互

    浅析PHP与Python进行数据交互的完整攻略 PHP和Python在数据交互方面都有很好的支持,可以轻松地实现数据传输、数据交互等。 一、PHP与Python进行数据交互的方法 1.使用curl库进行数据交互 使用curl库可以很容易地实现PHP和Python之间的数据交互,curl库是一个很强大的工具,可以使用各种协议传输数据,并且支持proxy、coo…

    python 2023年6月3日
    00
  • python tkinter 代码布局

    【问题标题】:python tkinter code layoutpython tkinter 代码布局 【发布时间】:2023-04-05 16:07:02 【问题描述】: 到目前为止,我会为每个界面创建不同的模块,启动屏幕,登录然后主界面并将每个模块传递给 main_window。 class MainWindow(tk.Tk): def __init_…

    Python开发 2023年4月5日
    00
  • Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法

    当Python中的Matplotlib模块用于绘制图形时,往往需要对图形进行标注,比如绘图的横坐标或纵坐标需要加上中文标题或特殊符号。但是,Matplotlib默认情况下并不支持这些特殊字符的显示,需要进行一些设置和转换才能实现。下面是使用Python中的Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法的完整攻略。 配置字体 Matplotli…

    python 2023年5月18日
    00
  • 计算python字典中每个唯一键的唯一值

    【问题标题】:Count unique values per unique keys in python dictionary计算python字典中每个唯一键的唯一值 【发布时间】:2023-04-06 20:36:01 【问题描述】: 我有这样的字典: yahoo.com|98.136.48.100 yahoo.com|98.136.48.105 yaho…

    Python开发 2023年4月7日
    00
  • 关于pytest结合csv模块实现csv格式的数据驱动问题

    关于pytest结合csv模块实现csv格式的数据驱动问题的攻略如下: 1. 安装pytest和csv模块 在使用pytest和csv模块之前,需要先安装这两个模块。可以使用pip install命令来安装: pip install pytest pip install csv 2. 准备测试数据 在使用csv模块之前,需要准备好测试数据所在的csv文件。假…

    python 2023年6月3日
    00
  • 基于Python手写拼音识别

    基于Python手写拼音识别 简介 手写拼音识别是一种将手写的汉字转化为对应的拼音的技术。它广泛应用于中文输入法中,用来提供用户输入的汉字的拼音。Python可以通过使用神经网络模型实现手写拼音识别。 准备工作 首先需要安装Python,建议使用3.x版本,同时需要安装相关的Python库,例如: numpy:用于进行数学计算 pandas:用于数据处理 m…

    python 2023年6月6日
    00
  • Python 获取windows桌面路径的5种方法小结

    下面我会详细讲解“Python 获取windows桌面路径的5种方法小结”的攻略。 1. 背景介绍 在进行Windows操作系统上的Python编程时,需要获取桌面路径的需求是非常普遍的。Python提供了多种方法用于获取Windows桌面路径。本文将旨在介绍Python获取Windows桌面路径的5种方法,并说明它们的使用场景以及各自的优缺点。 2. 获取…

    python 2023年6月2日
    00
  • Python 列表(List)操作方法详解

    Python列表(List)操作方法详解 当我们需要在Python中存储一组数据时,可以使用列表(List)。列表是Python中最常用的数据类型之一,它是一个有序集合可以存储任意类型的,包括数字、字符串、甚至是其他列表。列表是可变的,这意味着可以通过添加删除或修改元素来改变列表的内容。本文将详细讲解列表(List)的知识点,包括列表的创建、访问、修改、添加…

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部