QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
/ z& j! s$ W; ^8 E1 a7 ]6 T; U
, X2 x) {2 o, [% \### 类 `tree`! ]0 O  K- v9 f8 b6 Q) T$ m: G

% c0 D- o9 L% Z! |这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。2 Z9 p3 x. C6 J+ O8 W& j& R+ ~, L

& s1 V1 o2 c8 ]* B#### 1. **初始化方法 `__init__`**( t" w  l$ J$ C5 d5 f( `7 l
- **参数**:
5 J' j- `2 M" t4 g! P5 u+ v  - `feature`: 输入特征数据。7 j" G% L9 [9 p) e4 }
  - `label`: 对应的标签(目标值)。
0 q! Z; J. l* X$ R6 ^- **功能**: 将特征和标签保存为类的属性,以备后续使用。
* o+ X. x7 f; R, q4 a- E; W+ ^& t( q1 ]# i0 T) t3 V, A% m9 F  O* `
#### 2. **方法 `Gini`**
1 ]0 R0 J9 T- T9 e1 T$ h* m- **参数**:& M3 ~. k* F% o8 ?% P9 @* _) p! E
  - `dataset`: 一个类别标签数组。" M9 t  l! |+ [; N
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
) U& A7 m1 d( t- **流程**:, Q: d% H: b' S! b
  - 首先获取数据集中不同类别(标签)的集合。
+ C5 ?+ P) `0 O, Q& S7 N! t. f  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。/ X8 R" g* _8 H# W9 l4 i( P# J
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
: l6 T) M0 S4 f- H7 p7 Q+ P9 D$ h( o+ E/ H, a
#### 3. **方法 `cmpgini`**  X7 ^! u5 P" c3 I8 ?. [* n3 Q
- **参数**:( s( N0 y5 O5 Z1 t0 P: A
  - `feature`: 当前特征列。
/ r  Z, u4 ^/ M$ ?3 I: _  M4 p  m  - `label`: 对应的标签。
& M5 P1 Z8 U& w2 o' _& q- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。! z6 g: A. G# d
- **流程**:
/ h3 c/ E: [$ ?0 J# \  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
( E. s' m9 Q( c9 Z% s  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
" ~9 D) V* l' M# s: Q
2 p# A: ?, q" ^( P- ^# B#### 4. **方法 `maketree`**( F- k7 `* B( R$ r
- **参数**:
5 S4 N9 G2 f+ l  B  - `feature`: 当前特征数据。
3 ], e2 G- [/ l  - `label`: 当前标签数据。- O6 `0 {* T( K! ?/ e! U
- **功能**: 根据特征和标签递归构建决策树。% o( L$ t1 g# p7 [3 v
- **流程**:3 z% C  [  ~* }7 b5 C6 U' U
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
+ i& k7 n5 \/ T9 i! K  - 计算所有特征列的基尼指数,找到最优特征及其值。
7 x8 d$ x0 ^8 i' C( E1 t  - 如果最小基尼指数等于 1,则返回标签。
; ^6 Y6 ~8 `# i1 A. m  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。) k; U! E9 A7 X( r
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
$ F& Y# D9 s! O- w$ e8 M4 l& O9 O7 P: j8 B% A- A, h* C
#### 5. **方法 `train`**
& B- h0 }4 `$ ^/ x4 r  Q  l9 e- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。, d, j7 k$ z! h
- **作用**: 结果存储在 `self.train_result` 属性中。
5 u! i5 B1 V: U. Q
6 }. A6 l' c- p& n# ^# H#### 6. **方法 `prediction`*** F6 U& R" I( q# \
- **参数**:
4 p/ x7 i5 L$ q  - `Mat`: 待预测的特征矩阵。
3 U8 q1 d, T( a# l! c, T% ?- **功能**: 根据训练得到的决策树进行分类预测。, {5 @+ w: D7 \% `8 I; F2 G
- **流程**:, w7 K' i4 Y* e/ Q% ^) i4 x6 b
  - 遍历每个样本,通过树结构进行预测。; C9 c, R, u5 c# Y5 Z* D  B- q+ i/ A
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。# L" Z& B" k% g
  - 返回每个样本的预测结果。
( y2 D; B3 ]: ~" _# j" s$ o/ W* p4 j* M0 V4 H7 h, Y
#### 7. **方法 `isLeaf`**6 Y( _% g3 E; s+ T" A. t  u2 [
- **参数**:5 H- |. V7 k8 B# s
  - `tree`: 当前树的节点。
3 R/ h  f! l; R" x- **功能**: 判断当前节点是否为叶子节点。
/ v& N9 ~# {4 L4 T0 N( ]- **返回值**: 如果是叶子节点返回 True,否则返回 False。" S+ P; j7 L3 r
% ?4 q" j% l: i, R+ O7 h
#### 8. **方法 `getLeft` 和 `getRight`**
" y0 \# W) j+ O+ v; V' ?- **参数**:% g9 S8 J' |: l- H2 ^: m: }
  - `tree`: 当前树节点。& f+ L" \5 ~. X( i
- **功能**: 分别获取当前节点的左子树和右子树。* J& k8 p( N2 L- ~
- **返回值**: 返回子树。
' L6 V! Y0 y4 \" k. g/ D/ B. x2 _# g: u' R0 J
### 总结
- p- Y9 f0 b  O3 W+ L5 C% C该代码实现了一个基本的决策树分类器,主要功能包括:
* q3 f4 k& c# O& l7 ~5 A  p6 b2 w- 计算数据集的基尼指数。
2 t- z4 G6 H  [' D1 [0 \/ x- 根据特征和标签构建决策树。/ T, q; ?4 A+ M/ e
- 利用训练得到的树对新样本进行分类预测。2 _) d0 l: {6 Z% w
9 a/ B  I, _4 W' J  ]# r: e
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。( R) K3 h$ L* e
# s: l/ a* W) v2 j" T  m3 W

- U0 `% K/ `' f: r# Y4 D5 o! N9 B3 [2 Z

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-4-15 06:47 , Processed in 0.344995 second(s), 55 queries .

回顶部