数学建模社区-数学中国

标题: 决策树分类器简单实现 [打印本页]

作者: 2744557306    时间: 2024-8-9 11:18
标题: 决策树分类器简单实现
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
) a8 _, D# T  ^
' U2 t5 H3 u2 I, c7 A! R### 类 `tree`
5 B/ w. H" A* L9 c7 W8 Q+ s" u2 T& L, k% L! _( b6 R( A
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
5 O8 A6 O0 K; a2 l3 o3 H
( N5 V+ K( {6 w3 v: X, C6 F7 r#### 1. **初始化方法 `__init__`**; ]2 i  M+ }$ C% {% z
- **参数**:+ Q4 C& w; }) J( \
  - `feature`: 输入特征数据。
5 }4 ~, e  }7 Q) v5 c  - `label`: 对应的标签(目标值)。  f& S7 ?! ^0 U8 }$ N
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
, K/ c" u1 t- K4 }. c  c3 R
. f. m, V% K- E/ F#### 2. **方法 `Gini`**
' A5 S, _- j# h! B) s; o- **参数**:
& {# S' `7 A7 Q/ K' C  - `dataset`: 一个类别标签数组。
  ^; O, l- u2 p9 h4 A" o- **功能**: 计算给定数据集的基尼指数(Gini impurity)。$ H$ R$ i5 ]2 A
- **流程**:
7 I8 v2 Z/ o9 h! ^. w' `  - 首先获取数据集中不同类别(标签)的集合。
0 N# i* }- b4 a% |  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。. n6 P6 G, d) U$ E
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
  o& y  e* {9 f( j+ N! m& y& A
  ?) N0 G+ s* L#### 3. **方法 `cmpgini`**
- P$ W  u# e8 U4 Q- **参数**:' K; C$ Y6 V1 I1 ~
  - `feature`: 当前特征列。2 A- f6 v6 F4 {# R. A; b
  - `label`: 对应的标签。+ W) s, E1 H8 H/ A5 q8 Q+ n
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。2 g3 }5 o/ n( t9 p- j0 j9 s
- **流程**:1 V/ r( \5 E) ]' R
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。) ?8 R3 H; V6 `. [
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。  E3 W7 m- i5 B+ Z$ \' \1 |. ^6 D

$ A7 p4 w: r9 q! I/ S6 x/ F& k5 S#### 4. **方法 `maketree`**% S/ @; [2 D& X7 k7 v# z
- **参数**:! n5 R- d1 a0 X7 D& N7 B, ~4 c
  - `feature`: 当前特征数据。
2 g! V0 W  j4 z7 b/ Y, ~7 U  - `label`: 当前标签数据。0 }5 ]/ w2 V) J
- **功能**: 根据特征和标签递归构建决策树。
; ?7 i9 o6 Q2 O$ _' F& w- **流程**:& A1 R& X. m$ o. H
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。; _8 z  ~$ z& i7 R- o1 l
  - 计算所有特征列的基尼指数,找到最优特征及其值。  b$ d8 \# P3 {, R4 D7 v7 h
  - 如果最小基尼指数等于 1,则返回标签。! V8 ~0 D8 _, e& h$ H
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
. ^4 ?2 v+ o- Q$ Y- m! _  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
1 M) k# o  d; ~0 i) f! t# K9 u' P8 i& i  o4 v" l2 v
#### 5. **方法 `train`**0 F9 }( [$ K$ ~
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。0 G" w1 b7 Y4 i) X- A
- **作用**: 结果存储在 `self.train_result` 属性中。9 O0 G, ^. R4 Q1 T5 S+ ^
% V4 t( n- G. [: l! Z4 W3 C, J
#### 6. **方法 `prediction`**0 w& D: r1 M6 B1 y
- **参数**:
: j7 T( e$ ?# t1 l9 u* U! C  - `Mat`: 待预测的特征矩阵。
1 b5 L0 m: d7 I1 \! w) r; q' ?- **功能**: 根据训练得到的决策树进行分类预测。; s* P: }$ G$ ?$ N
- **流程**:
" Z" ~% m# i& |6 ^7 G2 K  - 遍历每个样本,通过树结构进行预测。
7 B2 A  u+ `5 \  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。- `% N5 k3 \: ~! \4 e
  - 返回每个样本的预测结果。' n5 h! Q! w4 I! ~5 l" E

$ L; E1 w6 u% M* L#### 7. **方法 `isLeaf`**
  d, e- ^, o2 X/ z# p  g* c- **参数**:2 Q- o6 o* _# j' _% O# n
  - `tree`: 当前树的节点。
5 g7 D1 C4 t' c% _- **功能**: 判断当前节点是否为叶子节点。
7 @! }1 s" j- I" X; S- **返回值**: 如果是叶子节点返回 True,否则返回 False。* s8 J* q; \9 o0 ^9 K+ G/ ]) V  c
0 b6 [. J% _9 r! z
#### 8. **方法 `getLeft` 和 `getRight`**
  ?/ {% b1 \7 H. Q- **参数**:2 |2 E. }% ~) @* X: b' L: `. ~
  - `tree`: 当前树节点。
9 I) f) R0 w7 b' g$ D- **功能**: 分别获取当前节点的左子树和右子树。, |; q% D) L! L
- **返回值**: 返回子树。0 M' ?6 V: V& u4 l+ u
( h) {: O# X' a* L  H
### 总结+ U" {8 A8 c2 @' f, V$ S4 t) _
该代码实现了一个基本的决策树分类器,主要功能包括:7 p5 `( m& v# f, d* f
- 计算数据集的基尼指数。+ q! Z5 W0 K, B3 m* h! \- q) r& [
- 根据特征和标签构建决策树。
/ E  l! |; ^9 _- x  b- 利用训练得到的树对新样本进行分类预测。
  i  _' `: t' V( S: A' f+ s* P& Q0 x* e. s0 J% b' n
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。% }! ^+ l- W5 R! Q8 ?; {( L

$ X- R& z+ B3 R6 y- Y
% @; g& J+ F; [. k! |
# x5 r; y7 x( a& L. r7 Q

test.py

1018 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

cart_Classification_tree.py

2.85 KB, 下载次数: 0, 下载积分: 体力 -2 点






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5