QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。7 Y8 [1 B# k1 Y& P- ~* j0 p* C5 _
3 M+ W: E' q' T) o: O$ S
### 类 `tree`/ u- W  o* T8 f  q% p/ y6 _6 d
- E4 R; K) @8 z$ F
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。0 q3 p* M. b/ J: F4 Y& t
6 j( s( C. H/ W- l
#### 1. **初始化方法 `__init__`**  s6 y2 N3 ?+ H) W6 W/ Y; l0 Z; g! u
- **参数**:
& [' v  `; k, H  - `feature`: 输入特征数据。
* `% l6 H3 C- U" }  - `label`: 对应的标签(目标值)。
- y2 J& p  G' n+ E4 R$ k: W- _9 |- **功能**: 将特征和标签保存为类的属性,以备后续使用。
5 }1 b& C' u5 H; O2 _8 A& y; g$ e
( N- m& M0 Y, z. P- _3 Q; @+ \#### 2. **方法 `Gini`**& J6 e2 N2 x: k" D- O' g6 ~% x
- **参数**:
! b1 N3 O, V6 y2 s) }" k  - `dataset`: 一个类别标签数组。
, h7 J2 h& z1 ?6 e1 ?: U( o- **功能**: 计算给定数据集的基尼指数(Gini impurity)。$ i: `% q2 ^6 Y1 W: Y( U
- **流程**:
. d  b, }0 D2 ]2 D, n7 Z& s& \  - 首先获取数据集中不同类别(标签)的集合。
9 A5 \. B3 h! t6 M/ G& V, K5 F  [+ s  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。# I/ J* P8 c3 L. l2 i
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
) D4 T4 U7 F  c$ ~9 ]1 H5 |$ W- D  {4 ~# l
#### 3. **方法 `cmpgini`**, d# n3 j3 M  @+ f& U
- **参数**:$ H) X: M" r$ e2 j3 A: P( T
  - `feature`: 当前特征列。
" l& m% Z5 @4 y' s, p  - `label`: 对应的标签。
/ U- C' _( g: N' U# T- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
3 e# ?8 s1 A! w# Z( k% r- **流程**:
% @5 b% ~+ J6 B  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。+ T/ L" `: Z1 v" X! C! `5 m
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。; O$ ?: p4 Q  d9 m: f

, f/ X1 m+ a* z  F( y. P#### 4. **方法 `maketree`**
( y& ?: R, N3 `/ C( C; x6 H% `+ h- **参数**:( R0 I/ K: N* ?2 K
  - `feature`: 当前特征数据。
1 @6 L4 n% L7 b  - `label`: 当前标签数据。
3 R8 k3 U& B' }! d- **功能**: 根据特征和标签递归构建决策树。
3 z8 E. G- U  j; u6 T- **流程**:" {; a  L5 `9 K. V5 z$ H2 F
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
4 g2 Z; G1 h0 X  - 计算所有特征列的基尼指数,找到最优特征及其值。7 Z' R' Q* w; a/ u
  - 如果最小基尼指数等于 1,则返回标签。; B( P: F9 }; j$ q, ~+ I/ z0 X
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
- t8 l! `" D0 {1 g6 [, B/ M  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
2 L0 c9 A* X2 b9 v* ?
1 X: d. `7 a  G+ P! \/ W# |, U$ G#### 5. **方法 `train`**+ {# I" N* \( Q3 y4 ]
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。! b6 E, V3 h# t' [/ q" V
- **作用**: 结果存储在 `self.train_result` 属性中。5 g* R9 R+ ]3 q/ @8 e9 U/ ]) F

) i: |  f9 o- o- K5 S( B! b  L4 _$ z" z6 F#### 6. **方法 `prediction`**
3 g, ~, Q% y9 P3 S/ c- **参数**:
& r* d' ^& f( f. h; s- s, \: E  - `Mat`: 待预测的特征矩阵。1 m. X3 v. p+ m. l9 J
- **功能**: 根据训练得到的决策树进行分类预测。
2 P. L. j+ g( I) A+ \/ f  z% B9 U- **流程**:0 D' I. Y7 G5 p- o2 {: g# U* B
  - 遍历每个样本,通过树结构进行预测。
  _' m* d  L' }- q: ^+ v4 k% G% d  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
" A$ B2 r2 s9 q1 T0 |/ e  - 返回每个样本的预测结果。7 x$ t$ j9 y% w

6 }$ j" {. z' `- V* _) z' S#### 7. **方法 `isLeaf`**
; D6 x1 I7 ]5 A6 \4 j- **参数**:& @( |3 z3 l2 ^; c% |& Z# k
  - `tree`: 当前树的节点。
# G8 H+ _6 d9 l; u3 G) L- **功能**: 判断当前节点是否为叶子节点。% {) o) `# s1 R  K# I! F
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
5 L8 h# F/ |$ b( Z0 r+ @
5 Y2 C0 c: Q& y- O#### 8. **方法 `getLeft` 和 `getRight`**7 C4 W0 }8 Z" U, G. F- p1 m( Z" t
- **参数**:* t7 \" i6 m- k8 H& o/ q' W
  - `tree`: 当前树节点。5 ^# N9 d/ i) J" u3 L
- **功能**: 分别获取当前节点的左子树和右子树。) [0 T9 H2 a% H) x
- **返回值**: 返回子树。
4 x* G, U, t  \5 J0 H' t1 ~% _6 Z/ m4 y8 i: J6 X7 }- F# d
### 总结  |  o0 v1 Z/ A
该代码实现了一个基本的决策树分类器,主要功能包括:* g. |' W- ~( i7 \1 p% f% }
- 计算数据集的基尼指数。
; g4 J& D0 p- i! m- 根据特征和标签构建决策树。
6 t% M6 m: q0 m& p) `" N: P- 利用训练得到的树对新样本进行分类预测。. F6 Y- [& k% Z; D' J3 X: r' v
& h' k) {% M4 U: z
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
8 q2 n, d5 J% u
- V1 |9 M0 i* n/ A( N
6 Q; A8 F  G4 I/ s' Q
8 W7 \* e$ j% }$ h

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 02:59 , Processed in 0.499461 second(s), 55 queries .

回顶部