Python机器学习之决策树算法

下面是关于“Python机器学习之决策树算法”的完整攻略。

1. 决策树算法的基本原理

决策树算法是一种基于树形结构的分类算法,它通过对数据集进行递归分割,生成一棵树形结构,用于对新数据进行分类。决策树算法的基本流程如下:

  1. 选择最优特征:根据某种评估指标,选择最优的特征作为当前节点的分裂特征。
  2. 分裂节点:根据分裂特征的取值,将当前节点分裂成多个子节点。
  3. 递归:对每个子节点递归执行步骤1和步骤2,直到满足终止条件。
  4. 终止条件:达到预设的终止条件,如树的深度、节点数等。

2. 决策树算法的Python实现

以下是决策树算法的Python实现示例:

import numpy as np

# 定义节点类
class Node:
    def __init__(self, feature_index=None, threshold=None, left=None, right=None, value=None):
        self.feature_index = feature_index  # 分裂特征的索引
        self.threshold = threshold  # 分裂特征的阈值
        self.left = left  # 左子节点
        self.right = right  # 右子节点
        self.value = value  # 叶节点的值

# 定义决策树类
class DecisionTree:
    def __init__(self, max_depth=None):
        self.max_depth = max_depth  # 树的最大深度
        self.root = None  # 根节点

    # 计算基尼指数
    def gini(self, y):
        _, counts = np.unique(y, return_counts=True)
        p = counts / len(y)
        return 1 - np.sum(p ** 2)

    # 计算信息熵
    def entropy(self, y):
        _, counts = np.unique(y, return_counts=True)
        p = counts / len(y)
        return -np.sum(p * np.log2(p))

    # 选择最优特征
    def choose_best_feature(self, X, y):
        best_feature_index = None
        best_threshold = None
        best_score = float('inf')
        for feature_index in range(X.shape[1]):
            thresholds = np.unique(X[:, feature_index])
            for threshold in thresholds:
                y_left = y[X[:, feature_index] < threshold]
                y_right = y[X[:, feature_index] >= threshold]
                score = len(y_left) * self.gini(y_left) + len(y_right) * self.gini(y_right)
                if score < best_score:
                    best_feature_index = feature_index
                    best_threshold = threshold
                    best_score = score
        return best_feature_index, best_threshold

    # 构建决策树
    def build_tree(self, X, y, depth=0):
        if depth == self.max_depth or len(np.unique(y)) == 1:
            return Node(value=np.bincount(y).argmax())
        feature_index, threshold = self.choose_best_feature(X, y)
        X_left, y_left = X[X[:, feature_index] < threshold], y[X[:, feature_index] < threshold]
        X_right, y_right = X[X[:, feature_index] >= threshold], y[X[:, feature_index] >= threshold]
        left = self.build_tree(X_left, y_left, depth+1)
        right = self.build_tree(X_right, y_right, depth+1)
        return Node(feature_index=feature_index, threshold=threshold, left=left, right=right)

    # 训练决策树
    def fit(self, X, y):
        self.root = self.build_tree(X, y)

    # 预测单个样本
    def predict_sample(self, x, node):
        if node.value is not None:
            return node.value
        if x[node.feature_index] < node.threshold:
            return self.predict_sample(x, node.left)
        else:
            return self.predict_sample(x, node.right)

    # 预测多个样本
    def predict(self, X):
        return np.array([self.predict_sample(x, self.root) for x in X])

在这个示例中,我们定义了一个Node类,用于表示决策树的节点。每个节点包含分裂特征的索引feature_index、分裂特征的阈值threshold、左子节点left、右子节点right和叶节点的值value。我们还定义了一个DecisionTree类,用于表示决策树。每个决策树包含树的最大深度max_depth和根节点root。我们使用gini()函数计算基尼指数,使用entropy()函数计算信息熵。我们使用choose_best_feature()函数选择最优特征,使用build_tree()函数构建决策树。最后,我们使用fit()函数训练决策树,使用predict()函数预测多个样本。

以下是使用决策树算法解决鸢尾花分类问题的Python示例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from decision_tree import DecisionTree

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = DecisionTree(max_depth=3)
model.fit(X_train, y_train)

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

在这个示例中,我们使用load_iris()函数加载鸢尾花数据集,使用train_test_split()函数划分训练集和测试集。接着,我们使用DecisionTree类训练决策树模型,并使用predict()函数预测测试集。最后,我们使用accuracy_score()函数计算准确率。

以下是使用决策树算法解决泰坦尼克号生存预测问题的Python示例:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from decision_tree import DecisionTree

# 加载数据集
data = pd.read_csv('titanic.csv')
X = data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']].values
y = data['Survived'].values

# 处理缺失值
X[:, 2][pd.isnull(X[:, 2])] = np.mean(X[:, 2][~pd.isnull(X[:, 2])])

# 处理分类变量
X[X[:, 1] == 'male', 1] = 0
X[X[:, 1] == 'female', 1] = 1

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = DecisionTree(max_depth=3)
model.fit(X_train, y_train)

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

在这个示例中,我们使用pd.read_csv()函数加载泰坦尼克号数据集,使用train_test_split()函数划分训练集和测试集。接着,我们使用DecisionTree类训练决策树模型,并使用predict()函数预测测试集。最后,我们使用accuracy_score()函数计算准确率。

3. 总结

决策树算法是一种基于树形结构的分类算法,它通过对数据集进行递归分割,生成一棵树形结构,用于对新数据进行分类。在Python中,我们可以使用类和函数等基本语言特性来实现决策树算法。决策树算法的应用非常广泛,可以用于分类、回归、特征选择等领域。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python机器学习之决策树算法 - Python技术站

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

相关文章

  • python获取当前时间对应unix时间戳的方法

    获取当前时间对应的 Unix 时间戳,可以使用 Python 的标准库 time 或 datetime 中的方法。下面我将详细介绍两种方法。 使用time库 方法一 可以使用 time.time() 方法获取当前时间的 Unix 时间戳,它返回的是浮点类型的秒数。 示例代码: import time unix_time = time.time() print…

    python 2023年6月2日
    00
  • 用Python抢火车票的简单小程序实现解析

    读取本地JSON文件并解析JSON数据是Python中常见的操作。以下是读取本地JSON文件,解析JSON数据的详细攻略: 读取本地JSON文件 要读取本地JSON文件,可以使用Python内置的json模块。以下是读取本地JSON文件的示例: import json with open(‘data.json’) as f: data = json.load…

    python 2023年5月14日
    00
  • Python读写锁实现实现代码解析

    当多个线程仅有一个线程能够写入特定数据时,使用读写锁可以提高程序的性能。Python提供threading模块支持读写锁实现,而读写锁的实现基于RLock对象。读写锁的实现能够控制多个线程同时读取一个文件或者同一时刻只允许一个线程写入一个文件。 创建读写锁 使用threading模块的RLock()方法创建一个新的读写锁。读写锁可以用来控制对文件或者数据结构…

    python 2023年5月19日
    00
  • python保留格式汇总各部门excel内容的实现思路

    下面我来讲解一下“Python保留格式汇总各部门Excel内容的实现思路”的完整实例教程。 一、需求分析 我们需要实现一个Python程序,该程序可以自动批量提取各部门的Excel表格内容,并将内容汇总到一个新的Excel表格中,同时保留原有表格的格式和样式。 二、实现过程 1. 首先安装所需的Python模块 在终端中输入以下命令进行安装: pip ins…

    python 2023年5月13日
    00
  • Python基础学习之简单理解函数

    对于“Python基础学习之简单理解函数”,我们可以从以下几个部分来进行讲解: 一、函数的定义和概述 1.1 函数的作用 在Python中,函数是一段可重复调用的代码块,它能够完成特定的任务,具有以下几个作用: 代码复用:在不同的地方使用同一段代码,提高程序的可读性。 提高代码的可维护性:对于一些需要反复使用的代码,使用函数可以方便后期的维护。 提高代码的复…

    python 2023年6月5日
    00
  • Python机器学习之基础概述

    Python机器学习之基础概述 机器学习是一种人工智能技术,它可以让计算机从数据中学习并自动改进。Python是一种流行的编程语言,它在机器学习领域得到了广泛的应用。本文将介绍Python机器学习的基础概述,包括机器学习的类型、常用的Python机器学习库和两个示例说明。 机器学习的类型 机器学习可以分为三种类型:监督学习、无监督学习和强化学习。 监督学习 …

    python 2023年5月14日
    00
  • 详解Python数据类型、进制转换、字符串格式化的问题

    Python是一种动态类型语言,它支持多种数据类型,并且可以方便地进行进制转换和字符串格式化操作。 Python数据类型 Python中常见的数据类型有: 数字类型(int, float, complex) 布尔类型(bool) 字符串类型(str) 列表类型(list) 元组类型(tuple) 集合类型(set) 字典类型(dict) 其中数字类型分为整型…

    python 2023年6月5日
    00
  • python使用glob检索文件的操作

    当我们需要在一个文件夹中检索某些类型的文件时,python的glob模块就可以很好地完成这个任务。这个模块提供了一个类似正则表达式的接口来匹配文件名,但它比正则表达式更简单易用。 以下是使用glob模块检索文件的方法: 1. 导入glob模块 import glob 2. 基本用法:使用glob.glob()函数对符合条件的文件进行筛选 my_files =…

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