QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
: `7 w0 W" E# f1 q) `8 s
1 i' f( p+ x' `; c; h$ K# R' E### 类 `tree`
% ~; g% |% Z6 n
* H5 s* b& y/ }这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
( n% I6 z. s7 w- Q1 s- n
# O( {2 S4 y" H% q5 K* S#### 1. **初始化方法 `__init__`**
3 L% H$ }- g! h1 t% {- **参数**:9 U+ {, v% |! z, w
  - `feature`: 输入特征数据。6 J8 L1 ]) r' E4 H, s/ [8 }  ~
  - `label`: 对应的标签(目标值)。$ g0 k/ e9 T3 Q1 O1 X) }' G' c
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
# T9 ~# u: i- S. Q* k, y  i2 ^7 s# ]
' Q% \/ `4 ]: j& d* N' W8 Q) z% ]/ K% H#### 2. **方法 `Gini`**# K) E; T# H: E; w5 d
- **参数**:
; d- ?1 ]$ F  {% P& J/ D& q4 ]  - `dataset`: 一个类别标签数组。
' N* }1 |: Q) _1 m$ J+ r& M- **功能**: 计算给定数据集的基尼指数(Gini impurity)。4 B  [# u  N( E) i; U+ r& f$ a  [
- **流程**:
2 \9 N" l1 x( r+ j  - 首先获取数据集中不同类别(标签)的集合。5 h1 Z- C0 }0 I, w
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
- [4 u) v8 R3 v  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。( D! N- r9 Y% I

, P* Y% U- t( H#### 3. **方法 `cmpgini`**. o' l+ l5 m$ t4 ~
- **参数**:
4 k9 |. e6 A3 c/ w3 t" ^  - `feature`: 当前特征列。) Z8 w) N8 G$ {( \- z& c
  - `label`: 对应的标签。
+ `' I- q1 K. T" F$ @. m- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。1 T8 B& E6 A; g8 s5 B$ D
- **流程**:
/ `: Q$ s* V6 n% y3 G) M: r% E  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。  M) M& K" J$ {7 e% Q( S5 O
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
3 A3 O4 Y( k0 Q! t+ z1 Z6 `
3 R! `# k; W0 a* k* l#### 4. **方法 `maketree`**% X3 U" n* ~& p/ E1 J
- **参数**:
! S, y& s, d% v( r  - `feature`: 当前特征数据。% m4 N1 R; ]3 v! U# I+ x1 t$ @* A
  - `label`: 当前标签数据。, N: B# u. O& v* w- G
- **功能**: 根据特征和标签递归构建决策树。
5 i& D" D1 \' u. U( i) }4 n- **流程**:: n7 U: W: H' t8 c7 B# l+ }
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
' P$ M+ b. j3 s8 N% Q. v* T  - 计算所有特征列的基尼指数,找到最优特征及其值。
: @; |: a3 t) `1 [2 V  - 如果最小基尼指数等于 1,则返回标签。
& D+ X; `4 {  t  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
) ], k9 {; [# b" p! }. g* q6 A& k1 q. {  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
, D, P' \2 d% [+ ]  a5 \, Q6 T0 s* W4 |* X
#### 5. **方法 `train`**$ S( j( x2 T) g+ A) I/ Z
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。% F; r- v- g7 [3 n( f6 t
- **作用**: 结果存储在 `self.train_result` 属性中。+ x9 _1 O' ?- D, R8 M: a" E3 |* N
: ]1 E7 d# `, U* {% C; @" ]
#### 6. **方法 `prediction`**
7 N. L9 y5 O! ]- f. S0 Y& o# t( @- **参数**:
) s) y' u  B' t: O! ^. ^  - `Mat`: 待预测的特征矩阵。# ?2 l  e+ q8 s7 R
- **功能**: 根据训练得到的决策树进行分类预测。" O. }% ^( _" @- a3 V8 B" P
- **流程**:
" @+ J1 ~  h* o  - 遍历每个样本,通过树结构进行预测。
# ]0 u" O$ B% k- O0 b5 r& v  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
* ^$ O& [( l1 V+ t+ g  - 返回每个样本的预测结果。
' S8 n0 Z- F/ r3 `5 q! A
# n6 x+ m4 s0 E! ?6 G#### 7. **方法 `isLeaf`**
" x% M5 D  |' r# |4 C- **参数**:) L* f; A: r' \3 v" R# P
  - `tree`: 当前树的节点。2 [* z. B! C& ?0 M
- **功能**: 判断当前节点是否为叶子节点。
  z! c3 N" z2 o9 v+ d- **返回值**: 如果是叶子节点返回 True,否则返回 False。
  o# x: h7 L* {( r1 [# f! l" g1 H+ M3 Z) k# P: j6 O
#### 8. **方法 `getLeft` 和 `getRight`**
9 U+ L) D9 m' `- **参数**:/ I- D: B' N3 @8 G3 }; r2 ^, f. d
  - `tree`: 当前树节点。
9 A$ ^/ ~! X5 A. Y9 A2 o- **功能**: 分别获取当前节点的左子树和右子树。
$ h/ e7 d, V9 ~0 L$ V- **返回值**: 返回子树。
2 o  A; Y" t+ a0 K2 ~7 x+ s' G9 s6 `9 a7 K  I5 E
### 总结; |6 N( `7 z7 C! K6 q* G& d
该代码实现了一个基本的决策树分类器,主要功能包括:
2 |4 d$ W7 U8 G( V- 计算数据集的基尼指数。
7 o) ]; P6 u2 N7 b- 根据特征和标签构建决策树。1 r' e1 Z$ P( N/ u+ g* [- D
- 利用训练得到的树对新样本进行分类预测。8 H) e# A, e0 L6 D# L5 l

3 E8 b: {( w( L0 U/ e( d/ q该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。) I% ~9 U; k7 m9 E

8 P* [8 u. T) K3 ]6 L" E" r% T# D+ D, J2 _- t2 q( [7 _

- Z/ J" l. x# r, E7 ~' H# j6 S$ 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, 2026-6-15 20:43 , Processed in 1.464392 second(s), 55 queries .

回顶部