数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-8-9 11:18
标题: 决策树分类器简单实现
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。1 m6 w$ [  L' K9 ?$ O
2 {: T' m+ ?  A1 b; z. d
### 类 `tree`
9 O7 z" r! \' P1 \# k2 ?# R- R1 B* T. d5 C9 S% [
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
( E" L& K% n. R/ k/ d: I- O5 B& K7 z6 N
#### 1. **初始化方法 `__init__`**, h6 R: D/ d7 e) c7 z5 l
- **参数**:
/ Z' I. j' }$ X* E8 B  - `feature`: 输入特征数据。
3 O6 Y: D+ [$ }. P$ v2 u' ]  - `label`: 对应的标签(目标值)。1 t. W. e+ r2 f5 }0 g) S, m2 c
- **功能**: 将特征和标签保存为类的属性,以备后续使用。) O9 a# D9 m2 N; A3 A

2 O4 j# B7 T+ X4 L: k# |, R4 B+ s& S! {#### 2. **方法 `Gini`**; ?' \  B0 @7 M
- **参数**:
4 T4 f& y5 l& i% B  - `dataset`: 一个类别标签数组。
2 T4 ?5 l2 d4 t" X7 j$ B- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
6 Y, i8 e: v6 C  G0 o" ]$ V. k- **流程**:
. L& [6 k& J4 M8 l* F6 g# h" y  - 首先获取数据集中不同类别(标签)的集合。
- N8 x" o# @2 @" V2 A  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
; a% P+ u, X; h  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
( G( l( Q6 f. o* `2 t  Q
0 q% Z/ p" ?+ C6 x#### 3. **方法 `cmpgini`**
' y9 ~2 G8 J7 F) @4 ^0 |" y- **参数**:, Y) [* ^8 u! _0 D7 @3 Z7 w3 W
  - `feature`: 当前特征列。" P2 e8 J8 s& ^3 R, H
  - `label`: 对应的标签。/ i" o& y& ?7 g( [, q$ R! O" Y
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。* S% p! g* c  j  c+ _
- **流程**:% A2 z- j: u: ^" k+ L2 k
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。! Z4 F& S6 k; G$ N
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
' G, t$ M2 T9 b6 Y# s* @- G7 c$ Y3 \4 n7 q& _
#### 4. **方法 `maketree`**. z. }5 C# _# O- l( r
- **参数**:: S/ e0 z# G3 O9 K; d$ N' R
  - `feature`: 当前特征数据。, {2 a- ~" Y- K5 J; _  g& C& o
  - `label`: 当前标签数据。  f' N, _5 W, Y; I+ x" V
- **功能**: 根据特征和标签递归构建决策树。
; n' l* Y# R. D: i4 A2 e( q- **流程**:
" h. C* ^5 Z7 @5 ]+ A  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。* h7 Y* c* q0 ^4 k. |, [  S4 u
  - 计算所有特征列的基尼指数,找到最优特征及其值。/ K+ _2 P/ }/ I6 p
  - 如果最小基尼指数等于 1,则返回标签。9 |5 G  q% t/ n& [+ q
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。  M8 {! Q" V8 b2 f
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
( n2 g7 b1 b5 F$ N8 O2 v+ r% V) Q  ?7 @( S+ E7 o) I
#### 5. **方法 `train`**
  x& {9 ^4 M$ K, p5 ^/ C- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
/ u8 a" S9 Q( R- **作用**: 结果存储在 `self.train_result` 属性中。
, C6 u: E3 o: ]) _+ \7 u3 [! v& F2 A# i& V
#### 6. **方法 `prediction`**5 Y+ g! t. E+ `$ t2 {' K9 Q- T  w
- **参数**:
1 `8 a- j3 l6 ^+ t6 X$ q) Y  - `Mat`: 待预测的特征矩阵。8 d+ d# v& o: s1 u% H# n
- **功能**: 根据训练得到的决策树进行分类预测。
8 g& x# H& g3 b+ R) @6 h5 s- **流程**:
8 W, R. W7 D( H5 r5 v& t  - 遍历每个样本,通过树结构进行预测。
4 `8 A( k, \+ ^" F5 O5 T  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。0 O% j% T2 S( b. j1 B2 o
  - 返回每个样本的预测结果。* k* I( c: |7 w3 w+ E! u2 q
% m7 P1 d# W) x5 M$ M* f# {& l0 S
#### 7. **方法 `isLeaf`**
% {5 P& }1 _0 T0 m8 l" e$ N8 {- **参数**:; v' e8 g1 x! j- e" h# W) F4 S3 t. `
  - `tree`: 当前树的节点。9 c* i: e9 S) M: g/ z: W
- **功能**: 判断当前节点是否为叶子节点。
/ m4 P7 I/ I/ \' a7 S8 B5 p" m& z4 j3 p- **返回值**: 如果是叶子节点返回 True,否则返回 False。
5 v2 P( f5 v- m% @' ?
. |/ G) _8 @2 }' j" D#### 8. **方法 `getLeft` 和 `getRight`**5 c6 i* H/ v, y) d8 e7 T
- **参数**:
: v  b0 A) S5 e* S/ _6 E  - `tree`: 当前树节点。/ L- X+ T) h) M' N
- **功能**: 分别获取当前节点的左子树和右子树。
3 f! a) x) g4 A  ~3 T- **返回值**: 返回子树。
: ~* v5 }$ l4 b5 B7 s' O( |* v; ?/ `7 o
### 总结/ H7 i3 p$ v& y# y- }
该代码实现了一个基本的决策树分类器,主要功能包括:% `: d/ _/ M& s% H+ M2 ?7 Z  Z
- 计算数据集的基尼指数。
5 P$ e, j  [( t( l- 根据特征和标签构建决策树。5 p, H, T% o; J& k: x
- 利用训练得到的树对新样本进行分类预测。
# y+ l" n& ]  X& Z. v1 `; r& u1 t6 i6 t" _& n( u+ m9 @5 F  T* @
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。! h. f9 ]' R  [4 q1 W
3 j6 A( q& k& {! [, l
) z- T: f/ K0 ]; u

8 O/ ]8 R, Y8 @( Q- R" ]

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