QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。3 H( p0 d2 \+ J! a
7 d3 \' y9 X. |0 ]+ _8 e$ L
### 类 `tree`
! U$ w6 |9 b& M* A$ w% S: u* L( V. W& I
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
8 }4 G" W) `2 _' [6 P1 X
9 f' t% W! b; X& [0 Q#### 1. **初始化方法 `__init__`**
$ b, w. g# N- Q* @- u9 P5 ]- **参数**:# S! m9 d) m# x) l: E8 \$ v
  - `feature`: 输入特征数据。: y; z# z6 U/ u! m! I
  - `label`: 对应的标签(目标值)。# i7 C+ p# V5 j
- **功能**: 将特征和标签保存为类的属性,以备后续使用。. ~( H) x3 ]+ P6 O1 w2 z, [

, l) ]. G# j4 x5 n* x#### 2. **方法 `Gini`**
0 D- Z  n/ x" ~! g2 b0 I! j- **参数**:
5 a9 W5 e) Q& G* U' ?. n  - `dataset`: 一个类别标签数组。3 [  p4 `# ~% {+ [  D
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。$ B0 ?  z3 ^4 k* c- U& d, }
- **流程**:! @) [  U4 D1 v0 N% s7 m7 I8 P0 W
  - 首先获取数据集中不同类别(标签)的集合。
+ }% {/ `: J/ ?4 O; q  E  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
' ^" _- F! P0 e5 r( z" c  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
0 n: ~: a- P  ~) ]1 Z
8 w9 @- E% n4 M#### 3. **方法 `cmpgini`**
2 E6 [: e0 O) z" O4 H; n- **参数**:
' s  @- x8 ?0 S/ L  - `feature`: 当前特征列。
6 ~! j% K/ ?6 |' d  - `label`: 对应的标签。/ Z& }5 p3 M/ A/ l& ]. N5 F
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
3 Y' z+ T6 l  @5 @* L, N; ~- **流程**:
0 t8 t! d$ X2 T  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
  U9 J! t( p9 q7 h, `  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
: B5 p" F  Z" r$ h/ @& h: P+ ^( P2 D7 \
#### 4. **方法 `maketree`**( z' o9 I7 h, B0 C% S4 {9 F, v' c/ J
- **参数**:
1 A" v6 |2 O4 i4 H* d  - `feature`: 当前特征数据。
  H* X& w# B' y& g6 z  - `label`: 当前标签数据。9 k1 l8 e2 Z& D+ W' `
- **功能**: 根据特征和标签递归构建决策树。
% L$ e1 f/ w8 v& _, c' L- **流程**:9 t! b. E  f# W& B+ |
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。, L( `; T$ H- q, G  o% Y6 Z
  - 计算所有特征列的基尼指数,找到最优特征及其值。. ]4 R% `3 S# [9 j5 M* W" T5 O
  - 如果最小基尼指数等于 1,则返回标签。
3 d( v* o4 |& ~* C; E  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。8 |6 y" Y9 N0 w/ M# W' e
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。) L4 z/ i( R; F. ]
7 D7 A2 Q! |* A- S' e  m3 e7 D
#### 5. **方法 `train`**
1 V5 p6 i! b9 K# q8 H1 v- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
0 b7 D1 C* w% E% V- **作用**: 结果存储在 `self.train_result` 属性中。
4 o+ o) [, k. j6 X8 q
6 ]" r8 B4 N  ?7 ]#### 6. **方法 `prediction`**: _7 `* ]: ?% o7 e& Z( S
- **参数**:: v* P4 b5 J$ q! p
  - `Mat`: 待预测的特征矩阵。& \8 G: B9 B+ C+ M) E( u% |
- **功能**: 根据训练得到的决策树进行分类预测。
+ ^$ n, F( ~6 h' m! l1 l- **流程**:
9 ~( E6 D( w% l: a  - 遍历每个样本,通过树结构进行预测。) y" L; J* u2 r6 `( B
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
8 ?2 X# [; b/ f  - 返回每个样本的预测结果。. s1 l& D# O9 e& U8 q

8 s' V! L  m+ V9 `% u3 [#### 7. **方法 `isLeaf`**
( U- R  o$ I2 j0 f- **参数**:
5 L# h4 l9 n% Y, U, n; r  - `tree`: 当前树的节点。
, U' Y/ ~2 i$ B0 _5 N# I( |! z- **功能**: 判断当前节点是否为叶子节点。+ T% z' ^: x0 ?1 o
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
0 K5 U* N5 W! H- e+ X/ m
  N) o. J  P9 h( @- b  q#### 8. **方法 `getLeft` 和 `getRight`**( j+ ^" }1 _8 Q. R( e$ C
- **参数**:
8 B4 K) m$ v! ?: w' h' g+ x  - `tree`: 当前树节点。
. v4 X: G4 p6 R# t- **功能**: 分别获取当前节点的左子树和右子树。0 S2 u# f# g: G: w/ A6 C$ m
- **返回值**: 返回子树。
$ B# q1 Z9 s7 x5 l* w; ?5 m$ O+ g: P( u' G
### 总结
+ x1 j+ `$ P9 @3 O1 K该代码实现了一个基本的决策树分类器,主要功能包括:5 G& \2 P! I# U# b& Q" G; z9 e
- 计算数据集的基尼指数。
1 S3 j( w: p* h) L) m" }- 根据特征和标签构建决策树。
6 Z# V9 k$ f6 ~3 M" e/ c8 \- 利用训练得到的树对新样本进行分类预测。
5 r0 j) S& h. W, z; ]
, K( w7 `. i1 Z1 Q4 b# V该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。" f! |$ a2 g5 S
( L" T4 Z1 L6 Q2 ^% g& P

! Y2 q9 h; R- T# L) F2 v
! F9 v( K2 r/ V$ n" V5 t

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-25 09:25 , Processed in 0.522884 second(s), 55 queries .

回顶部