- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
. c2 R' e+ R, ]( o" K$ }' m$ m1 @9 C
### 类 `tree`2 s9 t( w+ i+ M- v0 R
! e" X1 U. x5 T" L G这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
" p( \( J: ?& t R6 w5 ?# E- P
#### 1. **初始化方法 `__init__`**
! d* V5 G" I! F, ]- **参数**:
4 q) D w( e$ f* k- {; \ - `feature`: 输入特征数据。3 \6 B) V+ y8 X. O0 ?# m0 {
- `label`: 对应的标签(目标值)。" w: `0 o T) A% Z2 F" J5 [
- **功能**: 将特征和标签保存为类的属性,以备后续使用。8 U* _, g$ f% `) W' z
3 O# t7 Z$ {; O# I$ C& z* r y
#### 2. **方法 `Gini`**6 g& j. V1 e5 x" e' c
- **参数**:( s' m4 p6 q; R& g7 t0 @
- `dataset`: 一个类别标签数组。* l' `+ J' M7 y0 r" @
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。/ o% z& z1 w/ g. `( `
- **流程**:
. B9 c" ]3 [" ^& I' l" Y t - 首先获取数据集中不同类别(标签)的集合。 R' _2 M' Y3 @3 J$ w: q
- 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
- S2 v% o3 u$ J$ X. G: K - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
9 h, p& q k& F. ]* i
1 w2 Z4 w, ]7 G# W! D. N8 ?. s& g6 t#### 3. **方法 `cmpgini`**2 H2 c0 A* Z d {" p' Y
- **参数**:
( H- O9 Z" k, @+ N7 d' M - `feature`: 当前特征列。
, T, ]" H' x# e* d" k - `label`: 对应的标签。
2 `$ U' q3 `# q- t4 b& _* Z% \! C! R: g- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。' k$ V0 T) p+ v# S6 V1 X
- **流程**:
$ c5 u2 g8 S6 o! B. S% j - 遍历特征列中的唯一值,计算每个特征值的基尼指数。: T0 e/ j( s/ ]# b5 O
- 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。 a2 Z8 n+ v9 R9 }6 s) r# L9 p
3 s3 p9 V5 @' B7 T2 |
#### 4. **方法 `maketree`**
8 f: {6 q4 ?' V' N* l: y- **参数**:5 ^2 N! O, j! p; g# b. u1 K1 q( o
- `feature`: 当前特征数据。
% l6 x5 f6 Q, c0 }; m; \# S; G - `label`: 当前标签数据。* v/ h0 U4 {0 M$ K4 h2 _' p# E
- **功能**: 根据特征和标签递归构建决策树。
6 s* q, P6 d! X9 M: C2 F2 s: i- **流程**:0 h7 n. S* `& ]# O: e. Y1 k' P
- 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。5 V$ T7 ?$ l: x/ d: R' e
- 计算所有特征列的基尼指数,找到最优特征及其值。
# i! Q! g$ S! \$ h2 t) w5 I - 如果最小基尼指数等于 1,则返回标签。
1 ]0 `' d7 k6 r/ k7 y4 Q - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。2 d8 c" C; T8 O9 D* [0 E
- 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
- R# ^, }3 x" _" s2 o! |1 q3 v
/ G% |7 g: E7 M3 U0 r#### 5. **方法 `train`**
! @6 v7 R4 q. {, F8 f& S# C- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。" n. } N G2 U
- **作用**: 结果存储在 `self.train_result` 属性中。9 M3 s: c' r6 N R7 e8 @& \
& M0 b5 c; o6 a$ Z I7 v3 I' i+ ^#### 6. **方法 `prediction`**
5 I$ L: r3 b. O" D8 `/ j- **参数**:( H' y: S4 ]% L7 v: I7 v
- `Mat`: 待预测的特征矩阵。
+ r0 g+ _' T t- **功能**: 根据训练得到的决策树进行分类预测。8 w1 m. s4 @8 R7 F
- **流程**:
* C1 l" h; A K - 遍历每个样本,通过树结构进行预测。: v/ s1 a- {- o- |3 Z2 }6 L! ?; E
- 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
+ W( g& S5 a0 W - 返回每个样本的预测结果。. H8 y2 r" y3 [! L
+ {1 B' g% u! I' c+ K
#### 7. **方法 `isLeaf`**/ `: \+ O6 f- q# m( x" J+ }3 ~
- **参数**:, ^/ C$ c5 l6 U' w8 X. m6 J+ d% e
- `tree`: 当前树的节点。
4 s) t2 U4 {3 p9 M* g' m& D* @- **功能**: 判断当前节点是否为叶子节点。
, X- N5 }8 A3 L4 s8 k& V; i- **返回值**: 如果是叶子节点返回 True,否则返回 False。
* {. k1 H. w' k' z2 z/ v/ c
5 }. |/ w6 Z8 h* F#### 8. **方法 `getLeft` 和 `getRight`**
( x C$ `8 l1 b1 }5 `3 f B, b- **参数**:
4 E, H/ V6 I* v7 M6 h' j - `tree`: 当前树节点。' N5 J1 o, l, X* N
- **功能**: 分别获取当前节点的左子树和右子树。& \, m( U; P' v* {# m. A1 l
- **返回值**: 返回子树。& N+ \$ K. ~# F# c; D: R v9 h0 W
( r( k. A7 x$ i8 W; u5 M) @5 `### 总结+ v$ y2 g% G& `9 n4 U+ p& w; c
该代码实现了一个基本的决策树分类器,主要功能包括:/ F+ J( G. Y! S" |. l5 r5 a( t
- 计算数据集的基尼指数。
9 [0 _2 R: v8 D6 ]( r+ `" @- 根据特征和标签构建决策树。# f) G$ X6 G5 g7 A( u% e1 U& A
- 利用训练得到的树对新样本进行分类预测。
1 m6 j! O' L, r! v. j. ]! E$ r8 f, E9 ~4 T* |" L4 y
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
7 A& }. R. g1 @; h
# J3 t1 s6 m. F2 P
' k7 z& f6 l1 |/ H0 K
) w/ x' u7 p; k+ P9 B# r |
zan
|