- 在线时间
- 478 小时
- 最后登录
- 2026-4-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7788 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
|8 L7 T: V/ e" g \- R
# u8 ~2 L/ e& [4 e5 U2 [. `+ j### 类 `tree`
2 o" y% W- A# T6 w- {: {8 l# z; ~& }6 x \. J+ F+ E6 ~
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。, F2 P( P6 t: R
8 L+ ^% t: h1 \/ d2 W4 x! O
#### 1. **初始化方法 `__init__`**
8 n' ~$ K b6 C$ r- **参数**:
: b# t2 A$ j6 ^5 A6 X - `feature`: 输入特征数据。* \0 F' t) H4 P8 L' }5 n) Y
- `label`: 对应的标签(目标值)。6 e8 ]) V6 ?5 n6 K- z4 R& V
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
) w# ~, `) V. T4 Y& D% s/ j( T+ F8 k5 W( J a# k2 `2 P/ @5 L
#### 2. **方法 `Gini`**
8 K1 R% Y; A( L1 k Q- **参数**:9 E4 I ^ I X2 X8 F1 f1 p% m
- `dataset`: 一个类别标签数组。
( g, E5 G8 I& E6 {, X. ~2 V- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
, X7 x$ o- A0 u3 ^, h( K- **流程**:
/ s# o) G0 I1 Z/ w2 f - 首先获取数据集中不同类别(标签)的集合。- @4 {) m4 q# A: P
- 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
$ C- M2 K1 a/ i) Q! ]* O0 Y4 c4 k - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
8 p6 Y% S" O0 i$ n& N5 |$ a3 ]* N G! l
#### 3. **方法 `cmpgini`**
, O I8 T1 U% l( a1 R7 r- **参数**:8 D+ M+ e& R9 g3 j! o4 E8 c
- `feature`: 当前特征列。
' @. X0 ?- C+ ?. \ - `label`: 对应的标签。; a: l* F: Y7 X9 L' l# m
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
4 Y6 z7 u! _, l* W6 V2 B- **流程**:5 K9 V* I5 o: W( \
- 遍历特征列中的唯一值,计算每个特征值的基尼指数。# \" M& |& w0 y
- 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
* `! F! A/ b" b$ L# c- e, q/ u1 I
0 q/ v9 C% L/ m9 Q2 L4 M#### 4. **方法 `maketree`**7 O" a* L" r* v5 Z
- **参数**:
w/ q( x+ Y2 ^' V - `feature`: 当前特征数据。
# S: Q. Q2 |+ ?$ V! n0 d - `label`: 当前标签数据。
?" b6 z1 m' s0 B- w- y# |- **功能**: 根据特征和标签递归构建决策树。; W7 p* \! K3 a& t/ A
- **流程**:
* T$ Y4 Q3 i+ c+ T4 e0 v - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
+ o+ O7 e$ f, i. O$ a - 计算所有特征列的基尼指数,找到最优特征及其值。" x# K9 G% a: \! B6 d! k
- 如果最小基尼指数等于 1,则返回标签。; i/ h/ @9 t4 s. `$ v8 I
- 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。- g( ?+ C8 Q, c) Y
- 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。0 Y3 T. {) T& Q8 v! o
" [& x; U& U; l4 u! l- U
#### 5. **方法 `train`**
( E$ R! L2 r+ B) H- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。1 p! F- `( s% H$ ]
- **作用**: 结果存储在 `self.train_result` 属性中。
+ F' m; C9 p/ D1 i" H* i' B! I, U* \9 {' z, @/ r8 y! Q+ I8 n
#### 6. **方法 `prediction`**" ?/ o9 i3 w# N' C; q: Q& Y, k
- **参数**:
. a. l6 l' A1 a" c& w; p' R - `Mat`: 待预测的特征矩阵。5 y: H+ \6 p6 i3 T4 e
- **功能**: 根据训练得到的决策树进行分类预测。
; y: O4 p5 K4 W- **流程**:
" F- E, n `' z' {) H - 遍历每个样本,通过树结构进行预测。1 x9 n% {. P" A5 I) K) H
- 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
1 ]* T9 d8 o& w) A( Q - 返回每个样本的预测结果。* k4 p$ r, V- e- N2 X, t( h% K1 [
: t0 `# f1 M, U#### 7. **方法 `isLeaf`**
$ Z. Y) K1 I9 v0 y& P, D }- **参数**:
1 \+ D9 U) ?+ y3 { - `tree`: 当前树的节点。
3 e: S+ ]$ [" c# [- **功能**: 判断当前节点是否为叶子节点。
. o6 F" U6 H+ i- f- **返回值**: 如果是叶子节点返回 True,否则返回 False。
' C2 h: p$ u* E' J1 \) b6 B5 k: K: {' L. e m* }6 M, ^
#### 8. **方法 `getLeft` 和 `getRight`**+ U: [% v8 G* K# C9 P0 y
- **参数**:# X6 w9 F( e2 }# W7 p
- `tree`: 当前树节点。0 x/ Y' ]# z4 U) a- d
- **功能**: 分别获取当前节点的左子树和右子树。
1 e, k) F' s9 ~% _+ n5 W- **返回值**: 返回子树。
# u, w& H1 {6 i' P( l% w' e2 b+ ]
# Y. D" ~, t3 D4 \### 总结
0 \3 `1 D! y/ P* P9 B# a该代码实现了一个基本的决策树分类器,主要功能包括:9 U- H9 l" ]$ B' l/ K* ]
- 计算数据集的基尼指数。
]* _; L* U* p% E0 e% G- 根据特征和标签构建决策树。) r# K# u# B+ l0 P: j/ C' I% I
- 利用训练得到的树对新样本进行分类预测。" S7 k9 y* m. C/ d$ ?3 j2 z
" X/ l9 n2 ` x G- J1 m0 T, O/ x该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。5 b3 b1 i* O& H; U5 m( X
+ d: t" ?: K+ [4 J% x7 h+ k: x& s: D
' \$ z( h# F3 c
2 Z4 \& Z- }8 r. Z4 ` |
zan
|