QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1791|回复: 0
打印 上一主题 下一主题

决策树分类器简单实现

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
: I& A) \& a* P* s1 x4 `% j2 g4 ~. ?4 i9 W9 e& H
### 类 `tree`( z5 a$ W$ J: g6 M7 H+ n) }. @" F5 E

% A9 s+ x% i: O/ m8 K0 X& {这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。$ x$ i, I+ r# ^8 {* ~$ j
+ W8 M' c3 p& N6 r' F$ i/ K
#### 1. **初始化方法 `__init__`**" L5 f- u8 ?1 p) u0 z
- **参数**:
: k" I$ y9 X$ w: j  - `feature`: 输入特征数据。. y0 \. A! o- v, `" G4 x' |" ]5 d
  - `label`: 对应的标签(目标值)。
$ h8 ?& m# t$ G& L5 a1 `% b- **功能**: 将特征和标签保存为类的属性,以备后续使用。
6 E! `& k5 Y( ^9 m, J5 ~, z+ G, ?
#### 2. **方法 `Gini`**
# u3 S) H4 w% f/ q3 M  P- **参数**:
: B1 t! X+ ]2 u6 s+ J( |/ |  - `dataset`: 一个类别标签数组。: V* t1 t  b( ~) |2 Q7 ^- @; y
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。1 U# T/ P# w% v: t& l- m% c: W
- **流程**:7 Z" J/ a% g& U2 g5 Q
  - 首先获取数据集中不同类别(标签)的集合。5 `1 W3 ^% B( T5 f! h
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
. e/ h) _) e' W* G' M/ v  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
, J4 I) k) @, I% x  R9 \. ^, h+ f- u4 V, ?/ c4 s9 z
#### 3. **方法 `cmpgini`**! `* P. ~8 f1 B1 ^
- **参数**:
6 n) F- X2 ]+ K4 f  - `feature`: 当前特征列。
* }, b7 v8 o2 P/ J8 W  - `label`: 对应的标签。3 s; t' N) _/ [0 J
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
* e+ J8 N. J; f! B- **流程**:: E- K, O0 K, \; O/ ]2 |( }" ^1 Q8 s
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
5 ]8 }% p4 m7 g8 Q: W4 y# m; C  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
; R5 e. s: M' N3 E# h
3 r& V5 Y5 {' L; f2 V. J7 z#### 4. **方法 `maketree`**$ P& u/ R- t7 S! l6 Z6 B
- **参数**:# T! d. u  L4 V$ t
  - `feature`: 当前特征数据。
; D+ n  t% t2 c! T) F( m& U: L6 l  - `label`: 当前标签数据。) v, Y+ k1 q/ ?* Q
- **功能**: 根据特征和标签递归构建决策树。
+ {" Z8 a1 `( }  f- **流程**:: Q8 I! e0 p7 ]  `; F
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。4 w. n7 U1 V7 s8 n
  - 计算所有特征列的基尼指数,找到最优特征及其值。, I+ P# d  i, S! n
  - 如果最小基尼指数等于 1,则返回标签。9 U8 X9 t3 Z* }/ C. \- p
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
# L7 K8 R; I- i0 @2 z2 v, Y  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。# V1 P6 y) D/ X
4 m7 @0 l7 y6 |6 c/ K) K# ~
#### 5. **方法 `train`**9 v6 Q' N) q9 N' c  d* [' X  C
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。0 S" o1 ~3 ?/ ]% A0 Z) p6 m, V1 q; Z
- **作用**: 结果存储在 `self.train_result` 属性中。
+ i0 G0 d0 O4 Z* `; L; T; R9 \6 z! i
#### 6. **方法 `prediction`*** T! Y9 X! G& I& @( v5 e3 ~
- **参数**:& Y7 |3 S4 `# f& x/ m; p4 u/ ^
  - `Mat`: 待预测的特征矩阵。
& h$ Q! C! T: ?) i- **功能**: 根据训练得到的决策树进行分类预测。
* @7 A9 t+ ~/ n' H- **流程**:8 I+ C% [/ w1 o  l% n2 a
  - 遍历每个样本,通过树结构进行预测。
* x! l% h% \" U& _, A/ z# b  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
: }$ i3 A, W2 `  - 返回每个样本的预测结果。" f+ K* Y2 G0 Y+ g9 x

- |4 i9 I/ o5 u- f' [% B0 i  m#### 7. **方法 `isLeaf`**
" P; {) c1 y( h# f& g  x- **参数**:1 s, {( s/ X9 T
  - `tree`: 当前树的节点。
6 g, I  J$ M+ O9 Z- **功能**: 判断当前节点是否为叶子节点。
, j$ `' n, s; G9 M5 Z7 l$ X& W- **返回值**: 如果是叶子节点返回 True,否则返回 False。9 W& {" H4 r- B* \" x+ M

) D' M; M3 a+ g, z9 H2 g+ `#### 8. **方法 `getLeft` 和 `getRight`**
7 `6 s. |6 O7 a2 R* ~# ?9 [- **参数**:
& \0 |+ ?& ^- }! g  - `tree`: 当前树节点。
& X2 x' _- q" g- **功能**: 分别获取当前节点的左子树和右子树。- g/ a1 ~8 H% [; w
- **返回值**: 返回子树。
4 q0 f5 K1 E0 ]$ X! n/ m
! P1 r' s3 L% j. R2 ]" S5 z4 }6 L" k### 总结8 P1 U1 u+ A+ I+ g) K6 B3 H5 o
该代码实现了一个基本的决策树分类器,主要功能包括:
( M+ I$ `  o+ p5 p- 计算数据集的基尼指数。2 X1 W  d8 s6 e4 j7 E2 p, q! k8 ]0 c
- 根据特征和标签构建决策树。7 o; z; F# n; s8 i! Z! w/ v
- 利用训练得到的树对新样本进行分类预测。# E/ i  U6 ~% i% u/ ^5 b( e8 x9 M  n

6 e- }9 O/ d, |: m; p9 g: y该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
' Q, B2 u1 h2 z. B
( U- n5 [" J/ c  y5 f1 w0 x
" B5 G. B5 B, z2 T  b, l" F" I8 n# V$ f7 {4 Z$ w4 e

test.py

1018 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

cart_Classification_tree.py

2.85 KB, 下载次数: 0, 下载积分: 体力 -2 点

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-8-3 13:50 , Processed in 0.400692 second(s), 56 queries .

回顶部