QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1198

主题

4

听众

2978

积分

该用户从未签到

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

. Q3 i$ P0 Q( r/ {& B# f+ j### 类 `tree`
! G7 a% f; v8 ?* O# e4 K! j' B
+ {: s4 H; h6 P2 T! k这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。# A0 ~$ M1 w) Q. k
+ D% S6 x) w: J
#### 1. **初始化方法 `__init__`**
' I, f! }3 U0 {+ l9 q' s- **参数**:
, K. S) L4 O$ L8 l3 b  - `feature`: 输入特征数据。3 U* O# m7 Z" _' R0 ?% X
  - `label`: 对应的标签(目标值)。
7 f) l7 g& B+ P( A) X+ g- **功能**: 将特征和标签保存为类的属性,以备后续使用。
9 c: ]! f# a# p$ G7 p' n: F. ?$ x( L" x& _
#### 2. **方法 `Gini`**1 e% T+ z, i2 A  H
- **参数**:
" j6 ?, e$ K; x' ~, w  - `dataset`: 一个类别标签数组。
3 w: h  u( l4 Z% S- **功能**: 计算给定数据集的基尼指数(Gini impurity)。# \: G. x  E2 a
- **流程**:' o  Z( ^- ~7 r$ [
  - 首先获取数据集中不同类别(标签)的集合。2 H- R6 w0 e7 N3 L
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。: g" n- o% q3 e+ h1 h
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
2 }7 g) C5 ?7 L( d; R9 n" ^; F( o# o8 e2 \" E
#### 3. **方法 `cmpgini`**
+ }8 a; J5 Z, T5 m2 E/ l- **参数**:
. \2 G5 Y7 ?/ a: }; Z/ u1 h* @, L. {  - `feature`: 当前特征列。5 _$ }# D: e6 E  D% d+ Q. u, M
  - `label`: 对应的标签。
  Z) S. e  f( t9 y: l- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。* J* K/ C6 Y$ _6 s% Y
- **流程**:0 M$ l  E& b, A, ^3 I+ M
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。9 p" S) d/ w" e0 a5 A3 V
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
4 R7 }- L5 L, x; m) M; e" r: r: K- n4 u% d. x
#### 4. **方法 `maketree`**
- A: A7 B2 j% G2 i- **参数**:! e/ F( t5 s* K) j5 \% g( z
  - `feature`: 当前特征数据。2 }4 t7 B+ G5 D3 Y
  - `label`: 当前标签数据。
5 w# F7 e& q  s+ M3 c9 g7 z- **功能**: 根据特征和标签递归构建决策树。
. Z! z* w) Y' Y9 G# Y. p- **流程**:
: o) L$ L6 _3 x; z  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。5 P5 Z; d4 a( K" H: T$ g2 H2 D
  - 计算所有特征列的基尼指数,找到最优特征及其值。
" \; H* S1 V6 r3 s  - 如果最小基尼指数等于 1,则返回标签。
* i: s* |+ Y5 t- Q. ~+ U8 e  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。% s/ \0 w' k. Y& G# W7 T- B
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。5 f( E5 ?3 {5 H

: A; V! f" Y8 T. C#### 5. **方法 `train`**
" q9 [, K" d4 a, J+ [: F3 E- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
, Y. b% U0 |5 y: |. w( p- **作用**: 结果存储在 `self.train_result` 属性中。$ E7 N8 j' ?: `* W" J$ a' D& f  n

; _( N  m1 V# ~) Z0 O' Z#### 6. **方法 `prediction`**
. m$ O3 ^2 {+ g" D- **参数**:! n0 f' C6 k3 G, M  Y: Y
  - `Mat`: 待预测的特征矩阵。1 L% q/ M9 O( L  x% N6 ]' ^
- **功能**: 根据训练得到的决策树进行分类预测。8 Z7 s2 a4 {3 `& k/ |9 F+ ?
- **流程**:$ P1 G  x- X8 _0 P
  - 遍历每个样本,通过树结构进行预测。% L5 M0 u  B% z: q6 k( A
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
) j1 M  S' Z. D: q5 u! }- Y8 o  - 返回每个样本的预测结果。' \8 ?( x* g6 Y! A; ?9 g7 R

8 j0 w$ B6 u3 r  T( M  ^3 ?2 T#### 7. **方法 `isLeaf`**
* w( [2 o2 r/ t# w- **参数**:8 K; l# _8 \' L2 F7 }# K
  - `tree`: 当前树的节点。" q& r$ w/ U3 Q# e
- **功能**: 判断当前节点是否为叶子节点。5 I: R1 J; D% P
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
/ a( q" Y' O" c8 E
) X" N6 \& a* x# A; U" ]#### 8. **方法 `getLeft` 和 `getRight`**
  F7 P  v, g1 ^% V' I( w- **参数**:; ]6 r3 a; k! N; w
  - `tree`: 当前树节点。! i2 B: f0 u/ O4 G
- **功能**: 分别获取当前节点的左子树和右子树。
# w% @; B+ u$ B0 E+ M" |- **返回值**: 返回子树。
+ A% b7 A3 {$ C5 ]. L' k7 Q1 U; n3 G4 q( _' }5 J" q* \
### 总结
8 f& |' t( d% S: ?9 e' e. r* @  n该代码实现了一个基本的决策树分类器,主要功能包括:' y( W5 _6 `4 q
- 计算数据集的基尼指数。, v+ |  i: a5 r& f
- 根据特征和标签构建决策树。
, g) o' \' }3 Y; K7 i/ Z- 利用训练得到的树对新样本进行分类预测。+ m7 G& U8 ^1 n- n5 F* L7 U: H3 {
7 Q& k0 s9 G* u' [  G
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
* x. R7 @% y' ~2 Z% R
6 |$ u4 n. v8 [' ?; X6 E( d' y4 N7 q& f1 I
. K, x" k! ?! a. J% g3 A! R9 {

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-10-13 07:42 , Processed in 0.530902 second(s), 54 queries .

回顶部