QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
& L5 E! k8 w# P, u% V9 L" |. M- U, o' H# l' h
### 类 `tree`
% C9 p- I. h( E" n' [9 n( U
% i3 S8 ^& \, ^, |这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。- o# W0 x6 `. p/ _7 n/ J  p
% }& F. |" I: j$ k0 C) r) p
#### 1. **初始化方法 `__init__`**' h' [' ~4 G+ c6 k- t' B: M
- **参数**:
2 X9 B) L7 c* v: |1 n  - `feature`: 输入特征数据。2 x# K* U/ t- K. g+ [$ c1 D
  - `label`: 对应的标签(目标值)。/ b. i* W+ P4 M% G7 H! e
- **功能**: 将特征和标签保存为类的属性,以备后续使用。' u3 g% U0 b& U& @2 Z+ z

% P4 G' o" G) U#### 2. **方法 `Gini`**
' ^6 O. [9 A1 j5 H8 T- **参数**:
! e# Z. h& H0 u% g% Y) `* J6 O6 }% R" A  - `dataset`: 一个类别标签数组。; D& Y* Z3 W* d0 q$ R1 x
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
) }3 a. N6 m2 J. S1 j, h% }3 p- **流程**:; X+ b! |' j& A/ `* c( p; q
  - 首先获取数据集中不同类别(标签)的集合。
1 T4 m0 A5 x0 O  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
. X; }  i/ h- E$ P' [  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
- J( X: E0 T# C5 b. R; Q2 e% w% @
" @, F9 |9 A+ j2 j( i#### 3. **方法 `cmpgini`**. p0 Q# m8 Y; ^# e
- **参数**:  d: M2 W; B+ y8 w! C# B1 i0 v3 B
  - `feature`: 当前特征列。
4 y/ x( B- J+ e, i& J  - `label`: 对应的标签。+ Q& a& W- G% y
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
4 H% Y* q1 O9 t+ m1 j# N1 l- **流程**:0 x; b8 k1 l1 _/ S+ A, J# X! F- Q
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。* G/ ^1 {7 U/ h
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
: z/ H; v8 O6 n% H
1 a* _; [% Q* U0 V0 }5 P# F#### 4. **方法 `maketree`**2 k$ ]8 z+ p' T3 C4 @
- **参数**:9 I' H$ L4 D. M8 G
  - `feature`: 当前特征数据。
+ I6 x. w$ u  K# U2 m8 B5 c* M1 c. M  - `label`: 当前标签数据。
- s( k0 @' f. Y) M' k, `- **功能**: 根据特征和标签递归构建决策树。, n/ N; o. ~2 [( h- t+ _! T  }
- **流程**:' p* p6 |, c0 {8 `, C
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
9 a: a* L4 l, M2 Z. n. P) i  - 计算所有特征列的基尼指数,找到最优特征及其值。% H  Q5 P+ R4 h  \+ ?
  - 如果最小基尼指数等于 1,则返回标签。/ L4 |# U6 m$ \! F* U
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
% m- {& X( h" Z6 G2 t+ w  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
) c( e# d( P$ e7 t% J+ c8 L+ }4 q4 Q6 n
#### 5. **方法 `train`**
# q0 R6 l# ^7 f5 \( y- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。8 B- j. E; Z1 n  A  z( o
- **作用**: 结果存储在 `self.train_result` 属性中。- ~3 {- b! r# g8 O, G

; k; S! _: t8 {+ d. t* _5 u#### 6. **方法 `prediction`*** y5 T. {( q6 }  U
- **参数**:
2 W  Y" S1 b- @; Z0 C9 a! [0 {& r% U& V  - `Mat`: 待预测的特征矩阵。1 |4 L- w; P: B" x9 e! L
- **功能**: 根据训练得到的决策树进行分类预测。
# t6 q+ N, J" N. S- **流程**:4 G# U& T( q3 L/ G, F4 T+ S& {. w
  - 遍历每个样本,通过树结构进行预测。3 B) s+ M5 Z1 N" f! h" F& q
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。6 U  j4 Z; N/ S8 O1 c
  - 返回每个样本的预测结果。" L; D, T9 g. B

6 d# n  j; K, J: y#### 7. **方法 `isLeaf`**
& d7 c# ~; C0 a/ p: T, r- x* E- **参数**:
8 U7 U( O- c" W4 u& Y  - `tree`: 当前树的节点。3 d5 A' O8 }6 A6 o
- **功能**: 判断当前节点是否为叶子节点。
6 q" S1 j0 V  ~/ y3 @4 p- **返回值**: 如果是叶子节点返回 True,否则返回 False。9 C, @1 Y: I: ~* J

1 a9 j0 A) d% e7 V. c#### 8. **方法 `getLeft` 和 `getRight`**  C' j9 @! L* b2 f6 Z" c! L1 T, i
- **参数**:
. l% |# g+ {/ r- Q  - `tree`: 当前树节点。
% W; _2 Q) x0 m- **功能**: 分别获取当前节点的左子树和右子树。! m7 W6 h; {% ^$ m( C# H* Z; l
- **返回值**: 返回子树。8 m/ C( p0 U" t' d6 x& ?2 m

* w5 E. r4 b: |+ u* P; r& l0 w2 D### 总结
% b% K: ]" v' f/ X' i% Q6 v. ~该代码实现了一个基本的决策树分类器,主要功能包括:
& z& D( d7 |3 L- 计算数据集的基尼指数。
. I( W( r% o" [) y- 根据特征和标签构建决策树。
1 _. O" P- d" t7 ]6 [9 c- Q- 利用训练得到的树对新样本进行分类预测。5 f/ h6 R8 e$ J& P3 c
  z* d1 W5 G; O4 ^
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
) s7 d& n4 Z) _. b  ?% \3 @" ~# d9 m7 }) P, d

& ]. `2 \& g- p% @% T1 k4 {4 ^3 y) Q3 v! {

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-6-15 21:52 , Processed in 0.435180 second(s), 55 queries .

回顶部