QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。/ F6 s! ?3 \7 J

" s* a2 l/ N6 [5 ^- p3 _1 U1 u### 类 `tree`- w  ?7 N, @8 ]4 r- E' O

: Z% m( d: F/ t4 w# y这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。. j5 i- e; X+ q0 b! O% D
) C$ N. B$ m# ?
#### 1. **初始化方法 `__init__`**- d+ k: N8 v- i. W
- **参数**:/ N  p2 w& F4 d6 f; Z
  - `feature`: 输入特征数据。7 k$ P8 L8 `( ]. t4 S0 F+ S# g
  - `label`: 对应的标签(目标值)。- T  M1 P: O' K$ z  L
- **功能**: 将特征和标签保存为类的属性,以备后续使用。) p; t( h, c2 ~4 r$ H5 @2 N" W
8 p* l' }+ Q; r* q( T; D
#### 2. **方法 `Gini`**# g. O4 W! L. L7 I0 A
- **参数**:
/ {$ {3 E2 z1 f* p( @) ?  - `dataset`: 一个类别标签数组。; q/ `: X4 Y) {) u* p
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。" Z9 R) M9 D* }4 {8 j
- **流程**:8 d# U- Y: m" W! X0 j9 L% h* {% o& t
  - 首先获取数据集中不同类别(标签)的集合。
4 ~* u5 G  p# g. K" X/ j  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
3 m0 J! `' B& |. J  |  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
- D7 D3 |" |7 V) G
6 r4 T) j1 O6 m/ p6 r#### 3. **方法 `cmpgini`**
7 U/ ~' ?- N5 K1 u" L- **参数**:
# e8 \# u9 |1 I& D9 S# h7 ~6 o" F  - `feature`: 当前特征列。
- f5 z4 V! r6 b  K1 g* M  - `label`: 对应的标签。
1 T8 R8 w* X. A) w' B- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。- h) {- t. _6 M, w5 c8 `, o$ H
- **流程**:1 k" H/ {0 n5 O& J
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
& I0 }; |( H. s  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
8 |. j0 q# B5 F- R4 z) X4 I
% J9 }9 v4 Y4 r& A1 V! R#### 4. **方法 `maketree`**
6 l0 A! w" q. B2 C- **参数**:- A' ?, M: O$ V
  - `feature`: 当前特征数据。
# }) j" v" |- I7 h" X$ h( H  - `label`: 当前标签数据。$ }9 q1 A, ^% T% K
- **功能**: 根据特征和标签递归构建决策树。' u/ E8 ~1 {. R0 R, ]: A# N. L5 b
- **流程**:
" A  |" ~/ d1 A+ b* |3 }  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
8 d& m" q3 ^8 Q. F  - 计算所有特征列的基尼指数,找到最优特征及其值。, X% {$ P- Q8 R) [0 Y
  - 如果最小基尼指数等于 1,则返回标签。
4 k1 f. N: {, A* @- p* a  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。+ I; g, u2 Z9 `2 ]$ F$ D9 n
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
3 q" {0 A2 R2 E* B1 H) a+ _$ F6 q4 {) C, i) J
#### 5. **方法 `train`**
  _) K6 Q' @  t  h+ W$ }3 J7 x- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。/ i! q- Z0 M: Q9 P+ r6 s
- **作用**: 结果存储在 `self.train_result` 属性中。3 C9 `8 ^; S) _$ \! h  u

2 f% h, F% T, @+ B#### 6. **方法 `prediction`**6 F+ r8 `! i9 J- k+ G
- **参数**:; x' R; v  H7 P. Y
  - `Mat`: 待预测的特征矩阵。
) b' d+ Z+ Y( y6 s8 \- **功能**: 根据训练得到的决策树进行分类预测。/ ]0 h! L- W( K2 t2 ]1 y
- **流程**:
- j6 G2 |! Z2 w9 {  - 遍历每个样本,通过树结构进行预测。
8 o. b* j+ R8 }  l9 x! v+ U9 ~  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
% B0 n# ]0 k4 F+ r0 j  - 返回每个样本的预测结果。
" C  j# N* ]8 M# S% u4 I' \! ?' m" f# h
#### 7. **方法 `isLeaf`**1 K, K9 Z3 I" w
- **参数**:$ Q# i" K  ]( a- o! h: N+ N
  - `tree`: 当前树的节点。
" C3 F/ G, K6 [( u5 f- **功能**: 判断当前节点是否为叶子节点。
: y* V5 f! v. a9 u3 k4 V8 n" U- **返回值**: 如果是叶子节点返回 True,否则返回 False。- J0 f# g7 i2 E/ {, @: `
3 O, Q# r7 T+ _: M' W
#### 8. **方法 `getLeft` 和 `getRight`**9 n! ]7 H+ g& c; o- F0 U7 }# R
- **参数**:
, g5 A3 r3 ?2 a  - `tree`: 当前树节点。
% W* Y% x; M4 X0 _  l* ~, x- **功能**: 分别获取当前节点的左子树和右子树。7 C2 i# n! Y1 \2 t7 R0 w% Q$ p4 A
- **返回值**: 返回子树。( }% Z. b4 m) w; u8 Y
, X' @3 W9 r3 n' p! c3 A
### 总结
% [9 e9 ?1 V# T该代码实现了一个基本的决策树分类器,主要功能包括:7 v. a7 T5 j6 I  N' E/ w. A
- 计算数据集的基尼指数。
# v; X# p% \( N5 P- 根据特征和标签构建决策树。* M  K$ q+ v/ R( Q
- 利用训练得到的树对新样本进行分类预测。2 ~5 L. b' F( l9 Y' I/ U

  _4 U0 W' {& Y/ v6 m+ T该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
# a( t' ^% O7 x: X
$ X6 c' y7 l& U
7 n+ h7 }5 t) x/ }' H- l  |+ q; z. Q7 {

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-2 12:04 , Processed in 0.382636 second(s), 55 queries .

回顶部