QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。+ [# i0 t7 \4 a" y0 p8 {
1 X) h( ]) M- V4 A
### 类 `tree`
( h) [8 }9 C( C! B) Q
' B& i/ v2 u0 @' S& b这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。9 p$ [: T9 Z: s6 p, G! v" T
- N; C) R* C+ _# ~
#### 1. **初始化方法 `__init__`**
$ i" z+ L9 F& G# h; N: J- **参数**:/ \2 e% y- I' [2 b8 ^# o2 Y9 T
  - `feature`: 输入特征数据。% @1 v. |6 o4 x+ _2 S
  - `label`: 对应的标签(目标值)。
3 F4 I( C* T- m) H: Z% @" C% _- **功能**: 将特征和标签保存为类的属性,以备后续使用。
, ?. \; S0 q) f" h5 q- H( O/ d) z1 g, E
#### 2. **方法 `Gini`**7 J0 p2 z: I9 }; U
- **参数**:
; ^$ R5 Z; D. o- L9 r  - `dataset`: 一个类别标签数组。
  z% W% J# |" i/ Y$ x$ u$ {- ^- **功能**: 计算给定数据集的基尼指数(Gini impurity)。# _3 j) w! t8 B6 u1 f/ x# r# \
- **流程**:
0 P4 x3 z2 \! _% t4 H) U8 Q$ j4 _  - 首先获取数据集中不同类别(标签)的集合。
& N% F+ a5 Q( u4 [9 Y7 r# B' m5 P  {  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
7 h! ?" p' ?6 ]4 H  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。5 m4 b/ h$ T; u2 S; k8 n; A+ B& G

( a* `$ z6 w  K: j7 O8 o#### 3. **方法 `cmpgini`**
- S6 t# U/ v' [# z9 i- **参数**:8 w6 h3 Y6 V; l& A
  - `feature`: 当前特征列。
# g; g* I& ?1 `, N+ p  - `label`: 对应的标签。
/ ^: i5 E7 X$ u+ U" h  y* p# a# Z- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
) s4 [5 D# |( W, |( w- **流程**:, X* L( m1 b( ^4 k& j, l, I
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
4 h1 m& k" L4 v% [$ y  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。3 i: ^" A! g, d1 |4 M) d

1 k# M& X. d* d6 L, J& s#### 4. **方法 `maketree`**& z  `- R2 _# n2 J+ g
- **参数**:
" D9 s6 d: m0 K; o  - `feature`: 当前特征数据。1 o5 G( H" N5 e# c: X
  - `label`: 当前标签数据。( D0 p/ ~' y  c9 t8 y  q: \9 v
- **功能**: 根据特征和标签递归构建决策树。
- N7 [- ?" C4 S$ O- **流程**:
! e! z  R8 y8 c, c4 n  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。& H( ^6 U& w: o' K. G3 R
  - 计算所有特征列的基尼指数,找到最优特征及其值。
3 ?  i+ t( f' a4 b2 F2 W- o' i  - 如果最小基尼指数等于 1,则返回标签。0 Z; S# `1 m+ o
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。& |0 p$ d' }  C( H: w
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。% a) k+ [4 P/ O3 G. v

: w  F8 @3 K. w- N. J+ @#### 5. **方法 `train`**
. d# F: Q, I) G6 e- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
3 k% _/ n0 Y4 y+ G' R- **作用**: 结果存储在 `self.train_result` 属性中。! F- _5 v" F8 t3 V

- {/ j% Q) b/ E* k#### 6. **方法 `prediction`**0 E# y6 U! C, G* N, n8 O
- **参数**:
" m7 g. T2 e$ N; q4 N0 ~) ~  - `Mat`: 待预测的特征矩阵。% o& G3 a4 U( q) i2 _" [" [  |
- **功能**: 根据训练得到的决策树进行分类预测。
* Z8 p& j' l" p( V. V- **流程**:5 Q, p4 h; ]7 f
  - 遍历每个样本,通过树结构进行预测。$ s! t  f, @: V  u: U
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。, |, s$ C" x! n( `4 ]+ `
  - 返回每个样本的预测结果。* a6 ~4 S3 H2 z, q/ J
4 J& k' u0 J( @) [3 c0 N( L, P
#### 7. **方法 `isLeaf`**# J! g# e4 V* u- s2 u
- **参数**:
- j7 f- Q4 ?6 L1 T& B7 Q  - `tree`: 当前树的节点。( p6 N8 J  ?  J( Z2 O% s
- **功能**: 判断当前节点是否为叶子节点。
# s4 j6 C: _) x/ Y+ r/ X1 l# I- **返回值**: 如果是叶子节点返回 True,否则返回 False。
: C9 q9 K% j3 w# c1 w
) R$ J) k0 s5 F& L3 y  T0 [& v#### 8. **方法 `getLeft` 和 `getRight`**- e) K! f2 U8 w+ a
- **参数**:
1 z% m. t  Z2 K" E  - `tree`: 当前树节点。
7 ~- X& y5 I; Q) |: y- **功能**: 分别获取当前节点的左子树和右子树。
. ?; S9 B  M! M, Z# w& k# J- **返回值**: 返回子树。
- n8 ~4 y" S( C% z/ i$ }# a0 [4 w2 d$ i( z( O* x4 J, d  b7 H
### 总结
  W# K! f6 x% m$ V4 n9 q该代码实现了一个基本的决策树分类器,主要功能包括:
: p5 q5 _3 O8 Z# Q+ Q+ x. K1 f1 G' ~/ H0 w- 计算数据集的基尼指数。2 Q4 Q0 t, l3 t- P
- 根据特征和标签构建决策树。
. P7 o( _5 x. Y  x: `- 利用训练得到的树对新样本进行分类预测。
% a- ]% b. X/ L+ i/ e
- i6 Q3 Y2 L  p8 Z, ^该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
; G) D9 _) m; I; D/ J& G- B8 ~. X* `: q

9 S8 t" _7 `7 \4 n, B& j$ E' `, j9 \5 z6 c' w5 w

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 13:48 , Processed in 0.456219 second(s), 54 queries .

回顶部