数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-8-9 11:18
标题: 决策树分类器简单实现
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。% Y- L, N8 q3 h! n

' K  S* ?* K) j* w% F### 类 `tree`
' |: K/ a9 c* U6 m$ q! ]: u; I# d  _1 v$ M1 c2 Q
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。* l' D6 ^7 E: r. l+ T/ J4 z1 @

" f- c% Y& J. h$ @- [+ |9 m#### 1. **初始化方法 `__init__`**1 Y) v. i. r/ i& x# z4 f  [
- **参数**:
- G8 O" L" Z+ D2 M/ `4 V) l  - `feature`: 输入特征数据。8 U; @; x7 h% G9 I8 I. M! I1 H
  - `label`: 对应的标签(目标值)。7 I" q- b* o7 K- [! x( b
- **功能**: 将特征和标签保存为类的属性,以备后续使用。/ s6 F3 ^( q- ^, k0 |

) m- g* g, }4 K8 }  m5 Q6 r6 ?' h#### 2. **方法 `Gini`**, S3 D4 z& K  ^5 D8 I
- **参数**:
0 N$ ^8 [9 T; A2 f  - `dataset`: 一个类别标签数组。  T5 ]1 K6 ?& C4 _% R
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。5 l9 u+ }1 p/ h6 P4 @( r; j
- **流程**:
, X9 L& X( C. [; F( |" _. M  - 首先获取数据集中不同类别(标签)的集合。
, C0 y' p, v1 N  P$ }9 |  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。: m7 N! @0 g( n% j9 m, c' i
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
8 [+ x! V" @) k: u. d- n2 ?( ^. O) f5 B& J) `, z5 K
#### 3. **方法 `cmpgini`**
4 }. o8 ?6 D8 ^$ T- **参数**:
0 ]5 N- B. Q% {  - `feature`: 当前特征列。5 v9 `7 {" `/ V- {
  - `label`: 对应的标签。7 T+ Z. \$ ?* Q# V; U$ j  j
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。- ^0 J" k0 V2 b  W
- **流程**:
4 Q  F. y( \$ S7 K) w6 y' `/ _  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。2 T3 B$ t' ^2 x
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
; @9 l' K1 _* f2 c+ c/ _4 f: v+ B0 \0 X  x7 {+ j9 t6 f
#### 4. **方法 `maketree`**. T7 b) m# @7 V) s. C, t
- **参数**:8 H9 x& j( s) n0 {& y9 a
  - `feature`: 当前特征数据。
- P+ d, H" O: m3 L  - `label`: 当前标签数据。( l' R: }$ E  [
- **功能**: 根据特征和标签递归构建决策树。
' g0 S3 a. B- \- **流程**:8 J% x$ d% u! I+ J# O% T9 U
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。# z: Z) [  |8 I8 y( \
  - 计算所有特征列的基尼指数,找到最优特征及其值。* _  W5 a% X& m( ?( Z
  - 如果最小基尼指数等于 1,则返回标签。) k! C3 \" V8 i2 c& ~
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。" [, O* G8 J' o. Z4 l# b
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。; r. Y3 {: r/ g& {% R
$ s- ?# _, \2 n. V' c2 `
#### 5. **方法 `train`**/ A4 H0 ^3 \- |2 j
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。* j$ [( D- H) P7 U$ |
- **作用**: 结果存储在 `self.train_result` 属性中。. h" s, U: _! D7 `" G% C

/ |  N( p1 k' K#### 6. **方法 `prediction`**
. g4 `3 ]" e' p+ h- **参数**:. f3 j2 Y0 S* J- V
  - `Mat`: 待预测的特征矩阵。; e) t. w+ n; |/ y
- **功能**: 根据训练得到的决策树进行分类预测。7 E; [7 J; v" Q
- **流程**:
! G- I0 y. s+ K5 X& }& b  - 遍历每个样本,通过树结构进行预测。' [6 q2 F& ]/ N% ]4 r0 `% m
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。6 W  o& O  x% Z
  - 返回每个样本的预测结果。+ R! h6 s' p. g5 U

+ A; S- C/ @2 r+ u, t#### 7. **方法 `isLeaf`**
) ?( P8 d' L5 e. Q) e' y- **参数**:) M) m3 ^6 ~' w: v
  - `tree`: 当前树的节点。, a" G& J/ Q. o$ m9 H# M
- **功能**: 判断当前节点是否为叶子节点。$ b$ S  d9 n* [
- **返回值**: 如果是叶子节点返回 True,否则返回 False。( T6 A" b$ Q1 m( K* @, u  g
0 b2 }! t' i% J0 b6 r
#### 8. **方法 `getLeft` 和 `getRight`**7 |5 Z( ~5 n: y  `4 b+ H
- **参数**:
7 U9 s3 {! }' m2 b  - `tree`: 当前树节点。5 I* M& X3 c; m' r5 P1 J) m- A9 ~
- **功能**: 分别获取当前节点的左子树和右子树。
7 j+ U3 J& P$ w7 M  K; k- **返回值**: 返回子树。1 c% u/ r' s( a& ?
% j# ^+ M& p9 |1 e2 P- I
### 总结
0 }! N7 ?; ~" b, T% o) L8 e该代码实现了一个基本的决策树分类器,主要功能包括:
; i- J7 [4 |7 l) N- 计算数据集的基尼指数。
) x' Q+ E& }8 B8 W: s" y- 根据特征和标签构建决策树。
# F2 A6 o& B1 O' p, ?5 T- 利用训练得到的树对新样本进行分类预测。
& u! E3 z, u( i- S2 G  D0 m4 j$ O' D  u  Q
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
/ g' Z$ c1 h+ u" q$ ?! p# Z& p8 w
3 T9 L0 _0 \6 a) L. y
. z& @/ t& j- k; }: J, \
7 G- c' l: y3 U! ]! U

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