数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-8-9 11:18
标题: 决策树分类器简单实现
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。: u& G) I) X! q$ j
7 r) g* w6 ^1 b
### 类 `tree`
" t/ V4 A$ s& H( H
) x3 K; h5 z/ k7 S; p3 l( q* @/ `这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。& f) c& V( X8 E: a) g5 ~; [) U( k/ F

4 B1 U% E2 J1 l2 C#### 1. **初始化方法 `__init__`**
) m; T3 E! E. {5 l- **参数**:
6 C) ^8 {) e4 ]( E& A2 b% P3 r* @. b  - `feature`: 输入特征数据。2 f# s( D0 s% c& Z. E
  - `label`: 对应的标签(目标值)。
! b& l* X+ w% y: y  b; E  h- **功能**: 将特征和标签保存为类的属性,以备后续使用。! {: B' p# J: U
7 J8 u3 o) d# Q0 z! \6 m; h0 c9 |
#### 2. **方法 `Gini`**
4 D" D: T/ y* l2 m6 b( ~' l- **参数**:
  R$ v" x# N2 X! L6 b8 a1 u/ k  - `dataset`: 一个类别标签数组。
. j% R2 r" K$ r, L2 w- **功能**: 计算给定数据集的基尼指数(Gini impurity)。$ l4 v) u3 `: Q( H+ l/ G# V+ W
- **流程**:8 S2 b+ M/ K+ h* W7 a5 K" O1 U& ]
  - 首先获取数据集中不同类别(标签)的集合。! `% E4 I& u9 L  i- {" g
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
2 I9 O$ }; o$ c: f' L  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。( V! c: O. I  w' O8 l  d& \
! y7 _+ E; X9 Z* R
#### 3. **方法 `cmpgini`**% h4 Y* i1 ?1 }0 w; k; K  }" S: P
- **参数**:
: j6 Z- L9 V4 F; Y  - `feature`: 当前特征列。; Z2 x/ C6 b  X6 ~) k  T
  - `label`: 对应的标签。( `# @, q& z- v
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
6 r" l9 w: R  V( C2 z8 T- **流程**:
! L, |* u9 T) V3 F. C  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
  m: Z) ]2 G# g  S# E$ D  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
( X6 _/ ~- D+ @) s. F9 e
3 O: H/ U' ]& f  ~" e; {#### 4. **方法 `maketree`**: S5 v7 u( O1 K, Y& z
- **参数**:
- k  Z/ I+ ]+ |. l5 ~/ O+ \  - `feature`: 当前特征数据。/ F/ {# B) F0 f" t$ m) u
  - `label`: 当前标签数据。
3 J* {8 Y9 H8 `" e7 ]2 ]8 L- **功能**: 根据特征和标签递归构建决策树。2 n$ ?1 c# a- G' c9 A% k: p
- **流程**:
+ U1 T* E3 S- G% t  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
- F6 X6 ?" o6 z" d! U, w. K  - 计算所有特征列的基尼指数,找到最优特征及其值。
0 g: x7 _% U) w) r' ^0 O  - 如果最小基尼指数等于 1,则返回标签。8 A$ W, r7 |' P! z
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。: B$ Q4 E4 ]5 h: M: p
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
% i% h+ i5 F) F' c/ M( F- [8 |5 p& B% W8 S* g. c+ N4 P
#### 5. **方法 `train`**2 ^3 H7 k, p- X8 B; z2 a/ N
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
7 e; J, P, [( I7 D9 Q2 B- **作用**: 结果存储在 `self.train_result` 属性中。' X# g0 L+ Y# @3 Z" J# d  k
/ V3 y8 D/ A: i! D% }% A
#### 6. **方法 `prediction`**# [3 W" L3 p- _* u: V$ P7 m
- **参数**:4 z# t9 ~: S$ v
  - `Mat`: 待预测的特征矩阵。7 @" {& m2 W" d
- **功能**: 根据训练得到的决策树进行分类预测。
& `) |' v' I# r- **流程**:/ l3 ?( d% ?9 D; `+ O$ D
  - 遍历每个样本,通过树结构进行预测。, h$ Q7 _' [: Z  }  e3 g
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。3 I2 f, F' u4 e3 o
  - 返回每个样本的预测结果。7 A  j/ U' Y. d. h* u( x

' |# q. O$ Z% P4 h( n8 t#### 7. **方法 `isLeaf`**
4 j: ^# t% y; s# @- **参数**:* y, E. @" ?. M! C# W5 z
  - `tree`: 当前树的节点。1 Q% j% E" ^% A! s* j+ a* L4 {" v
- **功能**: 判断当前节点是否为叶子节点。
* L8 I; t3 [: F- **返回值**: 如果是叶子节点返回 True,否则返回 False。
, [: M* d. C5 O, a
7 @9 o$ d- n% L; F9 O% v#### 8. **方法 `getLeft` 和 `getRight`**1 z0 }  {9 |% f/ y. p
- **参数**:
" G$ P* k+ ]) |  W, A' q4 |( |  - `tree`: 当前树节点。
# k- f8 t3 N/ W7 i0 |- **功能**: 分别获取当前节点的左子树和右子树。& q  P2 G) }. C
- **返回值**: 返回子树。8 m( E% b$ w+ e( u0 }8 q* |
. p2 J7 n. a" a4 F
### 总结
' N+ ?0 v" [% L: b2 n# g, r该代码实现了一个基本的决策树分类器,主要功能包括:
9 w& F3 U3 u4 O% {2 J- 计算数据集的基尼指数。; N  R& B5 ~1 }% h, t% r' m* c
- 根据特征和标签构建决策树。$ l* I, P# Q( w
- 利用训练得到的树对新样本进行分类预测。
" I) n5 ?0 C6 b) @% z2 X- G& Z4 x% R5 `1 E5 A. O
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。+ ]) y: M6 U( T0 u  {

- Y& _( a% e' P8 W/ x& E2 r- p$ o0 w2 \7 e# \8 p
$ c7 D' |3 H; ?( V

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