数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-8-9 11:18
标题: 决策树分类器简单实现
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
- O  z6 K. B# [6 _6 q$ L6 F" m
### 类 `tree`
3 W1 B1 {: ]& ~' V- B) f% G# ?
& ^3 {! O  S4 i( X这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
/ U8 ^( `4 X( z( O/ a; N8 }' {8 r+ o- P1 g/ w
#### 1. **初始化方法 `__init__`**6 h* ~" G! q# `+ i
- **参数**:3 u3 D) {* T8 Z( e8 c
  - `feature`: 输入特征数据。
9 _: b% t" ~5 [1 G* l& D8 p9 j" C  - `label`: 对应的标签(目标值)。) k% `$ s4 \. D
- **功能**: 将特征和标签保存为类的属性,以备后续使用。# k  A' b) J/ N$ {: a2 [% Y

1 H6 G; z8 S$ ^9 t. q9 d9 E4 ]#### 2. **方法 `Gini`**2 t. |$ X1 Q4 w3 L' [8 V. U
- **参数**:
  @5 q$ ]+ [8 }$ _  - `dataset`: 一个类别标签数组。
1 k/ D) m/ l0 i0 V1 S( I- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
! v1 U2 P' n6 Q7 l& P- **流程**:1 j  G  p5 c/ _
  - 首先获取数据集中不同类别(标签)的集合。
  d# ?- a; y2 H$ v  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
- Y8 l  y5 @$ h  i1 ~& u. q* x" E& Q6 C  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
: \4 X1 ]9 w! S- T# O
9 w" \8 V" I+ {#### 3. **方法 `cmpgini`**& @( |$ E* x. F) m% O" d* t
- **参数**:
7 B9 P) O8 G" `/ ]. M  - `feature`: 当前特征列。
" ?$ Z: K% E! L7 M  - `label`: 对应的标签。
9 r/ v1 G( }! B9 m- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。9 x: U8 m- u) K3 x4 i: ~
- **流程**:
0 v1 `  b; ?9 Q! f1 U% r( T  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。; k5 R' O0 t4 _# k+ e3 d2 K$ G
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。, P" ]1 a9 ^) |' _" o# G/ y
0 w3 R' R) a  r
#### 4. **方法 `maketree`**, B+ G9 A  ]! K! U5 H
- **参数**:5 p0 A7 }( O- S
  - `feature`: 当前特征数据。
& C0 s$ W2 H# i- P. n  - `label`: 当前标签数据。
8 r9 t6 |8 D3 z. f( Y- **功能**: 根据特征和标签递归构建决策树。4 }2 a  K- `8 y8 e2 {' L
- **流程**:
- _# {; \9 a; k3 R" j  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
! k3 X1 ?/ n7 F$ Q1 l  - 计算所有特征列的基尼指数,找到最优特征及其值。! c) H9 b+ H' A* t9 w
  - 如果最小基尼指数等于 1,则返回标签。
2 A4 W3 F( B* y4 O# ]9 H- O  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。; R+ O2 `- W* G$ D
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。6 D: i  s6 v- g9 E1 i8 E4 y
, M$ S; T' F& U; [; t1 ]
#### 5. **方法 `train`**
$ {- m. E1 t+ ~- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。+ @2 v9 y8 ?' i
- **作用**: 结果存储在 `self.train_result` 属性中。
5 i- `% {2 g- R" n
4 y8 B& O2 a' ]#### 6. **方法 `prediction`**! S0 w6 Y* O# w, m2 \: ?
- **参数**:
5 ?# `$ o9 z/ k: F' V  - `Mat`: 待预测的特征矩阵。' u/ c4 Y6 b- G1 E
- **功能**: 根据训练得到的决策树进行分类预测。
- F" `! ~; ]( }: v1 {- **流程**:! |: \* E- }! n
  - 遍历每个样本,通过树结构进行预测。+ i+ L8 ^  D+ Q+ l
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
; e4 o1 M- v5 x, T  - 返回每个样本的预测结果。
& p  H$ ~8 w6 n% i! O/ M+ o1 }. f. O  v  w% j4 d7 R; v6 l
#### 7. **方法 `isLeaf`**
/ i# y4 j( P2 v/ @0 L- **参数**:
+ l7 ]7 i  P4 m- W/ `1 B. }" U  - `tree`: 当前树的节点。% _  k6 M; G; }  L; F. v4 u
- **功能**: 判断当前节点是否为叶子节点。
* r) ^% j! P/ Y+ G3 _- **返回值**: 如果是叶子节点返回 True,否则返回 False。+ ~7 G; ]! j" t2 V$ b- `
' J) F! {+ F' r$ U7 g" h. b  k
#### 8. **方法 `getLeft` 和 `getRight`**/ h& G' ^, p" D6 V4 ^; d
- **参数**:
( G* A7 s) Q& i* ~+ Y3 t; H+ t  - `tree`: 当前树节点。# [$ g/ I3 p- z1 Y: k
- **功能**: 分别获取当前节点的左子树和右子树。# a9 h* T! m2 W1 ~
- **返回值**: 返回子树。
  M2 E* n7 \. U! A, M3 C
1 f8 e( }! u7 B### 总结
. ^0 u% d+ {- s, U4 d, u# P- J/ ?& `4 u该代码实现了一个基本的决策树分类器,主要功能包括:
/ B- U* B& [0 w* q- Q- 计算数据集的基尼指数。
2 f4 {0 D2 z. {# f& @) J0 n3 M- 根据特征和标签构建决策树。1 u+ R5 J" F9 u! m/ z
- 利用训练得到的树对新样本进行分类预测。& y- g' O' I6 _8 H- z
; b) a+ M5 Y9 v1 t) b
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。! D+ A2 Z. H( X4 r. m1 z# k. O
5 l5 j& N6 n' p  h9 c9 F" L
2 N# K, l9 h4 W4 N% N/ V+ Q4 \

! ?2 p6 E0 r7 H, |4 m- S

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