数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-8-9 11:18
标题: 决策树分类器简单实现
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。) s: k  I  k- T) f
: m" \8 A$ G4 ?
### 类 `tree`8 ^3 n, g7 \1 a

) h& r* V, N6 f. \3 p. {0 R这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
" a- G: @5 a; D0 E, V4 [4 ]
. ]* H, P9 O# g8 J8 V! U#### 1. **初始化方法 `__init__`**
! u. v  x+ o. x  y# ]- **参数**:
+ l" r3 M/ G1 _1 g4 P% a  - `feature`: 输入特征数据。5 j  m& q: ]! v6 G# M
  - `label`: 对应的标签(目标值)。
+ N: O! ^) P% c8 x* J/ {- **功能**: 将特征和标签保存为类的属性,以备后续使用。( G8 F( u- t" ?- n) v) R

( n5 \( ~! D# Z#### 2. **方法 `Gini`**
& G: W! q" m* U  ^9 l, h- **参数**:& c( I! @, R( K6 ^1 N$ m; t- V
  - `dataset`: 一个类别标签数组。& r" k; q  E+ L0 W& o7 ^/ o' H
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
. ~8 r  e" c* R- **流程**:1 X. A% V  v3 S6 d' U+ P/ y2 m) n
  - 首先获取数据集中不同类别(标签)的集合。
0 o) g' F7 V. Z& B) Q  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。( |( h+ a9 P# C$ _8 s
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
3 H* `; i4 V  W* N- S/ D# r, }( ?6 v* j
#### 3. **方法 `cmpgini`**
. X- e  b/ e7 D! E# O- **参数**:
, `4 u& B& i: o, m- K. Y4 [* n  - `feature`: 当前特征列。% T; A3 G0 z2 n$ @& x
  - `label`: 对应的标签。) f9 [& [$ ]( |1 A
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
9 d# C. u2 z! m/ Q" K! D- **流程**:
/ W% L* s% a3 O! L  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。! i4 \% |; @- t/ y1 _$ ]
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
% H* m* z; R. |
# x% K2 b+ P$ j& U/ C" g# k: r, F  h#### 4. **方法 `maketree`**
( i6 q, W7 b- ~- **参数**:
3 d8 P5 n9 X7 ]7 U& [  - `feature`: 当前特征数据。0 ]8 D4 j. D& P/ l% l1 c  [  @
  - `label`: 当前标签数据。
! [: ]3 f. P( G- **功能**: 根据特征和标签递归构建决策树。
; \" u+ Q0 B" p- A$ J: W- **流程**:
/ v8 |* x6 q* V9 X6 s! Y  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。: x5 p7 M( i, t# T6 C- b4 y/ x
  - 计算所有特征列的基尼指数,找到最优特征及其值。
4 Q# c+ f7 Z- D& K  G+ Q1 M; e1 A  - 如果最小基尼指数等于 1,则返回标签。" q7 Q% q5 L$ A3 ?: x
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
5 t/ `8 a, t) M7 d' d  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
" x% n6 S/ ?1 J5 ?3 g. z7 @- ]- V& v1 P5 Q6 r. a
#### 5. **方法 `train`**0 t5 p0 h- [: l( y  _
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
+ O% P/ {1 m4 t5 X7 ]1 d# I- **作用**: 结果存储在 `self.train_result` 属性中。- t* I8 K- b* q- `) ]( Q- U  A' g
9 ]$ I( |3 K  X" k7 s9 P$ Q3 k
#### 6. **方法 `prediction`**6 a# r+ G, Z3 O; l) O
- **参数**:
8 ~+ C5 S1 i7 a4 b2 S6 g  - `Mat`: 待预测的特征矩阵。
! L2 G( M4 a% j, f3 j- **功能**: 根据训练得到的决策树进行分类预测。0 ^  [1 T1 t7 L2 i
- **流程**:
3 [3 s9 }4 ~; @/ T" \# s9 @  - 遍历每个样本,通过树结构进行预测。
2 E$ D* ~1 R" B# Y2 i: x  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。' h6 r4 S6 h% w+ M" T: C( ^- D
  - 返回每个样本的预测结果。
/ [7 Z) Z9 \$ o0 ]2 z
* b- K! A. p3 Y#### 7. **方法 `isLeaf`**
; U# i# i, }8 u7 Y- **参数**:
! L( @. O# n& V+ W8 H* j6 c* y  - `tree`: 当前树的节点。" E- T5 H# z5 e) N
- **功能**: 判断当前节点是否为叶子节点。
2 u3 {- u  V4 }- **返回值**: 如果是叶子节点返回 True,否则返回 False。
8 r. O% y  k, {" l6 p0 |
4 B# @3 m3 V( w2 e- [5 @3 _2 L8 ]! @#### 8. **方法 `getLeft` 和 `getRight`**; I9 B% Z6 R8 o
- **参数**:
1 v. I# ?* ~) H  - `tree`: 当前树节点。
! I& a. Z: k' j8 K' L# k- **功能**: 分别获取当前节点的左子树和右子树。
0 P5 C) @' l1 z2 F+ [# `* a0 ?# m% k, l$ m- **返回值**: 返回子树。' ~' O3 P+ j- G" s6 m# P9 {. Z- {

" V4 w  U1 ^! @, l* k' z### 总结
) X7 n, y3 z4 @. J0 {该代码实现了一个基本的决策树分类器,主要功能包括:
) o4 l0 U& {7 I: R  E- 计算数据集的基尼指数。5 y! A: k" X8 f, }: m. A% J+ I
- 根据特征和标签构建决策树。8 G$ G7 V; W/ P* k0 g3 E
- 利用训练得到的树对新样本进行分类预测。
# l4 c2 L% W! K# @$ g0 R( b0 ^
$ m! L. F% o& k' O该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
3 o1 T  d" \/ l# H( J' D% X6 T; ?4 G& x! h) k2 x' P
/ Q5 w! R0 E) `, c2 S( r
1 J5 v, R1 I, }: P9 S6 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