2744557306 发表于 2024-8-9 11:18

决策树分类器简单实现

这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。

### 类 `tree`

这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。

#### 1. **初始化方法 `__init__`**
- **参数**:
  - `feature`: 输入特征数据。
  - `label`: 对应的标签(目标值)。
- **功能**: 将特征和标签保存为类的属性,以备后续使用。

#### 2. **方法 `Gini`**
- **参数**:
  - `dataset`: 一个类别标签数组。
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
- **流程**:
  - 首先获取数据集中不同类别(标签)的集合。
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。

#### 3. **方法 `cmpgini`**
- **参数**:
  - `feature`: 当前特征列。
  - `label`: 对应的标签。
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
- **流程**:
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。

#### 4. **方法 `maketree`**
- **参数**:
  - `feature`: 当前特征数据。
  - `label`: 当前标签数据。
- **功能**: 根据特征和标签递归构建决策树。
- **流程**:
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
  - 计算所有特征列的基尼指数,找到最优特征及其值。
  - 如果最小基尼指数等于 1,则返回标签。
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。

#### 5. **方法 `train`**
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
- **作用**: 结果存储在 `self.train_result` 属性中。

#### 6. **方法 `prediction`**
- **参数**:
  - `Mat`: 待预测的特征矩阵。
- **功能**: 根据训练得到的决策树进行分类预测。
- **流程**:
  - 遍历每个样本,通过树结构进行预测。
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
  - 返回每个样本的预测结果。

#### 7. **方法 `isLeaf`**
- **参数**:
  - `tree`: 当前树的节点。
- **功能**: 判断当前节点是否为叶子节点。
- **返回值**: 如果是叶子节点返回 True,否则返回 False。

#### 8. **方法 `getLeft` 和 `getRight`**
- **参数**:
  - `tree`: 当前树节点。
- **功能**: 分别获取当前节点的左子树和右子树。
- **返回值**: 返回子树。

### 总结
该代码实现了一个基本的决策树分类器,主要功能包括:
- 计算数据集的基尼指数。
- 根据特征和标签构建决策树。
- 利用训练得到的树对新样本进行分类预测。

该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。



页: [1]
查看完整版本: 决策树分类器简单实现