QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1171

主题

4

听众

2781

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。) b1 N9 ], H4 A: {' a' p. e) V

" q" b: U% C, [5 h( @" a### 类 `tree`0 `7 {  `; H, B6 ~6 a

9 Q5 Z! q/ E. ]/ j; P* v% U这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
# D* m! e6 d% t( W7 B0 b/ s# ?0 V9 [* i6 \3 v0 `! D
#### 1. **初始化方法 `__init__`**2 ^# l0 Y6 U' N
- **参数**:
( B: w6 e+ c( e8 A  - `feature`: 输入特征数据。
0 f) F; Z% W( t. L  - `label`: 对应的标签(目标值)。
4 Q! X2 T1 m' ~" g5 b) L3 Y$ j- **功能**: 将特征和标签保存为类的属性,以备后续使用。
, R9 _# n* x8 q* D) i6 Q
6 _) P+ z. p( a* J/ T& A#### 2. **方法 `Gini`**! f: ?" I7 N) v+ m8 V+ a' P0 O
- **参数**:8 A, V( u5 w) }' t5 s( h& [3 O
  - `dataset`: 一个类别标签数组。6 A/ u) U. ]( m6 G. r. a$ l  ]
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。: U. i3 h  j5 O8 H
- **流程**:
3 M2 ?' Z5 a1 ]/ I4 e  - 首先获取数据集中不同类别(标签)的集合。# K+ a2 h% _1 v9 M8 c* U1 a
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
( p  c" P) m5 q& r4 ?! ~" o' t  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
; b! ~* w0 {- C6 P$ P% _
$ G4 G( t* W4 o$ Y! w#### 3. **方法 `cmpgini`**& H( p5 U% X' F- Z+ h
- **参数**:( O4 ~$ S+ ~3 O
  - `feature`: 当前特征列。* K6 X% W0 E& d! T- E9 {- q
  - `label`: 对应的标签。2 z, R4 u3 U; o0 u2 Q% C
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
6 {/ l$ I/ Z; @& I8 N- **流程**:
1 [" }9 A4 V) Q( A  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。; `2 r# ~) L, T- ?4 ^. P
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
+ {; F! a8 ^& H( h3 l! Y
2 Z: U( D+ ?" M3 S0 F" I4 i#### 4. **方法 `maketree`**( P! Q" e5 n4 l; a. D% z  @( M
- **参数**:
/ i7 P1 T( e2 M& o  - `feature`: 当前特征数据。
8 v# d( S3 L  d4 U  \5 r9 c+ t! {! H  - `label`: 当前标签数据。
' V+ G+ M; X7 z+ V: A  `" q1 E- **功能**: 根据特征和标签递归构建决策树。, i# c( ?5 e8 D, L, t- ~
- **流程**:
+ O! m+ j! f% @% x; y3 w% R, \; |  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。  f8 x; H) D& }6 C
  - 计算所有特征列的基尼指数,找到最优特征及其值。8 t) u2 S* B9 X9 H- C
  - 如果最小基尼指数等于 1,则返回标签。
+ P! t8 m5 J( I/ o  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。+ D# O* u" B, y- }* T
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
& K- Q* G1 N* ]* a# l7 `
1 d1 I4 L% Y- _5 L) j$ |" y#### 5. **方法 `train`**! Z6 d/ \5 J) V# t3 x
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。# P8 B1 F3 @: _8 y' G6 `' l
- **作用**: 结果存储在 `self.train_result` 属性中。# N0 R& k2 G7 m( P, z) ?

6 v* N5 a# p# p#### 6. **方法 `prediction`**
8 W- N, a+ Y; b+ Q/ f) {- **参数**:
' R3 }( F: Y$ Y/ H; O: u5 f  - `Mat`: 待预测的特征矩阵。
8 H, K. c# Q- M" h- **功能**: 根据训练得到的决策树进行分类预测。4 T: l3 C6 i* w( Y: T. S
- **流程**:& Q- {; w, G( n9 _
  - 遍历每个样本,通过树结构进行预测。6 s( A$ \. I: E, D* i" O
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。$ h$ M2 ]6 t' `4 M0 A, C" n( D  j+ Z
  - 返回每个样本的预测结果。+ g! T' c, j  q1 [9 O1 E
; }7 S4 y# m- m1 ^2 j
#### 7. **方法 `isLeaf`**
7 z8 \: w' G5 r0 W- **参数**:
, d1 l* k6 ~( X  - `tree`: 当前树的节点。/ p' M- d4 H3 h* y6 \( m
- **功能**: 判断当前节点是否为叶子节点。  E4 \2 O0 n* N" \
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
" z/ W: ^% R7 V5 M7 y: J: k! a' F, d4 J- R
#### 8. **方法 `getLeft` 和 `getRight`**: a# ^5 @8 ^8 h% S. j& N9 L
- **参数**:2 M9 a& s3 o" Q0 P0 }3 W
  - `tree`: 当前树节点。
4 M2 h* G) n! q  M* C! U: ^- **功能**: 分别获取当前节点的左子树和右子树。
+ R9 H$ ]. `: f0 N; A# P- **返回值**: 返回子树。- z4 D! E# q8 L
# V- ^& {* `, u' ?  C( V/ W
### 总结
: g  ?7 p) M1 @7 v2 o5 @+ ]& n该代码实现了一个基本的决策树分类器,主要功能包括:
& o# @2 Q; n; G) |$ f- H/ W- 计算数据集的基尼指数。! q  B' O8 K  T9 i: b8 }
- 根据特征和标签构建决策树。' R5 w& e2 D" o. x
- 利用训练得到的树对新样本进行分类预测。
% \, I% M& Q, {) T% E( J7 G9 M; _8 n/ y9 D3 M8 k
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
; {- X/ [. @6 {  b
7 W, U2 F  P3 X( T% P
/ h6 O$ g9 q2 j2 J% l4 x
1 J2 A. ?5 f& B( U

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, 2025-6-24 19:23 , Processed in 0.589928 second(s), 54 queries .

回顶部