- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7953 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2978
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。7 L: x4 e0 g7 Y5 N/ E B
* s, [2 O) r0 r4 J- V### 类 `tree`
% U* u/ R5 K" J6 d7 z
. T9 G+ d0 l5 g z8 ?这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。6 }9 d6 X. c! Y5 K
6 H" W/ U+ a- @. t* W#### 1. **初始化方法 `__init__`**
) P8 W7 X% N' F) [9 f0 x- **参数**:% o1 s7 a" m" M; ?' |" J
- `feature`: 输入特征数据。
2 H8 U+ |) }" _( u - `label`: 对应的标签(目标值)。3 p+ w9 ?' Q6 P/ X e8 K
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
3 B# w7 }9 w- h" k
8 t- V) ?! G/ i4 r( H#### 2. **方法 `Gini`**
6 I+ n7 R- _' ]* c- **参数**:
3 A0 r. ?6 j8 i4 B) v - `dataset`: 一个类别标签数组。1 D6 b, ?, g; f" J6 C, ~+ D
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。& p2 F2 j3 N; L8 D' G7 X- V1 W+ L
- **流程**:: d) H3 U$ P5 p2 ?1 g, t$ r: F
- 首先获取数据集中不同类别(标签)的集合。! i1 C7 O, T2 D$ ?; m, |
- 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
& f5 a7 S1 o" t$ t - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。/ n: j" z$ g/ B* U8 T$ ~' ~0 S# W! H) v
( X0 j: _- ~0 [4 d1 L( { V& l* D$ j#### 3. **方法 `cmpgini`**8 P, d. {8 H" Z: x! L7 {
- **参数**:
: j* B/ V: o/ E8 s4 p: c1 K0 G - `feature`: 当前特征列。9 \7 V: w0 s" {" A4 |8 O
- `label`: 对应的标签。3 e& e& X9 L- A0 T3 u
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
; g' i* _* h8 G K' v3 ~* A6 |- **流程**:
) {7 z z7 f1 c4 q - 遍历特征列中的唯一值,计算每个特征值的基尼指数。3 x/ g# B I5 _( y/ d* @" {
- 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。, E% R8 t, P q" s
9 Z) S0 l' h$ I1 B" n0 i' D#### 4. **方法 `maketree`**( B' V" e; Q' A" [7 s" r
- **参数**:* e$ i. g: x; u5 \" }
- `feature`: 当前特征数据。
, `6 |" S; P5 h) }& Q+ Q - `label`: 当前标签数据。
v& W5 _ K2 K! d+ r- **功能**: 根据特征和标签递归构建决策树。
* a- }1 l& Y; ?- **流程**:- A9 x2 [. i b
- 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
, U7 I1 s$ r3 I2 W1 C - 计算所有特征列的基尼指数,找到最优特征及其值。6 ^9 `! b* h1 H3 J" T7 L
- 如果最小基尼指数等于 1,则返回标签。/ c1 K+ Z; v8 ]. _- F
- 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。7 j1 P9 T. S) M5 w" L
- 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
& b z& o+ r+ w# H+ j& Y. r
% _' O2 ^+ r7 |) K/ I#### 5. **方法 `train`**0 t) @) D+ I$ F$ g1 F: @$ J
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
! C2 ~0 c! c+ K. i! R- **作用**: 结果存储在 `self.train_result` 属性中。+ I0 ?3 j# P* A' H* {+ n9 P
/ F: ?* t, V$ [! A7 }
#### 6. **方法 `prediction`**
* |- ]; z4 ?8 I. _0 D+ ^- **参数**:
7 O1 G) {8 u3 F( B( l' C0 q - `Mat`: 待预测的特征矩阵。& g( b9 c% ~# t2 w3 T
- **功能**: 根据训练得到的决策树进行分类预测。
. Z; O( G' b6 z& @8 l! @; ^- **流程**:' `* n7 I1 I% x5 p [) e
- 遍历每个样本,通过树结构进行预测。
$ D0 f" A% U4 m4 b: C _0 o - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。; Q6 H+ t: ?' w9 O2 ~
- 返回每个样本的预测结果。9 ` ?8 ^- a! C$ {
7 Q8 B7 f- Q& k* L8 D- R
#### 7. **方法 `isLeaf`**. k% {) Z6 r+ e! B
- **参数**:
+ N9 v5 I) n8 [; S. ~ - `tree`: 当前树的节点。
! {$ e6 o$ j6 Z6 O) L1 ]- **功能**: 判断当前节点是否为叶子节点。- ~6 ^" @- a Y" G- p, r
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
5 R( J; x& f" D+ G: t" P" u
6 I9 \/ m3 A$ f# E* ^% N7 ]7 C#### 8. **方法 `getLeft` 和 `getRight`**4 Y% m, R. V. D3 i+ H R+ w
- **参数**:& v \, Q2 g' y5 E, z Y, k
- `tree`: 当前树节点。
( @3 Y2 v& ?5 w5 e0 _- **功能**: 分别获取当前节点的左子树和右子树。
1 M d' J2 d6 @$ Z: u7 h- **返回值**: 返回子树。3 _6 z/ o( s9 {4 n/ G& Y5 p
4 a7 [/ c# t! f. A### 总结8 b5 b# v# I% J; F+ R7 y7 ^
该代码实现了一个基本的决策树分类器,主要功能包括:
2 D r. m+ a& t" v# S6 S3 ?- 计算数据集的基尼指数。" R3 n& Z9 a e% [# ~* q
- 根据特征和标签构建决策树。! |% E* s$ L/ q" W3 S" i
- 利用训练得到的树对新样本进行分类预测。' L' F. L. W' x2 o+ P- b
, E+ q8 i8 R- i
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。+ f: L9 ]! d3 l( v
" C- D2 X( |9 y+ B; X' W0 m8 w
Z+ J4 s' E- r" X% U
' |* b1 z. ^9 E% g8 F |
zan
|