机器学习——决策树

目录

什么是决策树

怎么实现决策树

1.数据准备:

2.特征选择:

3.树的构建:

        选择根节点:

        分裂数据集:

        递归构建子树:

        叶节点标记:

4.进行预测:

决策树的实现:

运行结果:​编辑

实验总结:


什么是决策树

        决策树是一种常用的监督学习算法,用于分类和回归任务。它通过构建一棵树状结构,其中每个内部节点表示一个特征或属性的测试,每个分支代表测试的结果,每个叶子节点表示一个类别标签或回归值。

       简单来说, 决策树是一种机器学习模型,目标是通过树的分支来分隔数据,以便能够高效地对新样本进行分类或回归预测。

怎么实现决策树

1.数据准备

        收集训练数据,包括特征(属性)和相应的标签(类别或目标值)。

2.特征选择

        选择用于构建决策树的特征。通常,特征选择基于不纯度度量(例如基尼不纯度、信息增益、均方误差等),以找到最佳的分裂特征。

3.树的构建

        选择根节点

        选择根节点时,通常会考虑所有可用特征,并使用某个分裂准则来选择最佳特征。

        分裂数据集

        根据选择的分裂特征,将数据集划分成多个子集,每个子集对应于分裂特征的不同取值。每个子集将成为决策树中的一个分支。

        递归构建子树

        对于每个子集,递归地应用相同的构建过程,直到满足停止条件。

        叶节点标记

        当满足停止条件时,为叶节点分配一个类别(对于分类问题)或目标值(对于回归问题),通常是该节点中样本的多数类别或样本的平均值。

4.进行预测:

        使用训练好的决策树来对新数据进行分类或回归。

决策树的实现:

class TreeNode:
    def __init__(self, depth=0, max_depth=None):
        self.depth = depth
        self.max_depth = max_depth
        self.feature_index = None
        self.threshold = None
        self.left = None
        self.right = None
        self.value = None

    def fit(self, X, y):
        if self.depth == self.max_depth:
            self.value = np.mean(y)
            return

        num_samples, num_features = X.shape
        if num_samples <= 1:
            self.value = np.mean(y)
            return

        best_gini = 1.0
        for feature_index in range(num_features):
            feature_values = X[:, feature_index]
            unique_values = np.unique(feature_values)
            for threshold in unique_values:
                left_indices = feature_values <= threshold
                right_indices = feature_values > threshold
                if sum(left_indices) == 0 or sum(right_indices) == 0:
                    continue

                left_gini = gini(y[left_indices])
                right_gini = gini(y[right_indices])
                weighted_gini = (sum(left_indices) / num_samples) * left_gini + (sum(right_indices) / num_samples) * right_gini

                if weighted_gini < best_gini:
                    best_gini = weighted_gini
                    self.feature_index = feature_index
                    self.threshold = threshold

        if best_gini == 1.0:
            self.value = np.mean(y)
            return

        left_indices = X[:, self.feature_index] <= self.threshold
        right_indices = X[:, self.feature_index] > self.threshold
        self.left = TreeNode(self.depth + 1, self.max_depth)
        self.right = TreeNode(self.depth + 1, self.max_depth)
        self.left.fit(X[left_indices], y[left_indices])
        self.right.fit(X[right_indices], y[right_indices])

    def predict(self, X):
        if self.value is not None:
            return np.array([self.value] * len(X))

        predictions = np.zeros(len(X))
        left_indices = X[:, self.feature_index] <= self.threshold
        right_indices = X[:, self.feature_index] > self.threshold
        predictions[left_indices] = self.left.predict(X[left_indices])
        predictions[right_indices] = self.right.predict(X[right_indices])

        return predictions

def gini(y):
    if len(y) == 0:
        return 0
    p_i = np.bincount(y) / len(y)
    return 1 - np.sum(p_i ** 2)

import numpy as np

# 生成一些示例数据
X = np.array([[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]])
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

# 创建决策树模型
max_depth = 3
tree = TreeNode(max_depth=max_depth)
tree.fit(X, y)

# 进行预测
X_test = np.array([[2.5], [7.5]])
predictions = tree.predict(X_test)
print(predictions)
    

运行结果:

实验总结:

        决策树是一种用于分类和回归分析的机器学习算法,具有易于分类回归的优点,但在不同数据集中可能存在过度拟合的现象。所以说决策树是一种强大的工具,但它并不适用于所有问题,需要根据不同需求的情况来使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值