QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。/ B, o5 E: A, y+ i/ l( Z0 J
3 Q0 n0 N0 A% u! w" f/ [: Y% k
### 类 `tree`
2 a; ~: ], Z2 y9 O' G$ A6 k- U" N
8 u0 H0 D! j  B6 i) [8 g, [7 x) F' ?这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
; ~7 q- o# c( q/ j$ ^, G/ W& Y7 R
* _6 [9 m0 j8 Z" g* Q; @" s#### 1. **初始化方法 `__init__`**; N+ n1 ]# K/ T1 p: X, @& G! ?
- **参数**:
5 _  a$ z$ s6 G# e  - `feature`: 输入特征数据。
; h: D9 H% @  b* R  - `label`: 对应的标签(目标值)。6 b: c/ N: p# i
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
- C& @5 U8 [. x+ L# F2 X
: ~) H7 `6 p; Y3 d3 j#### 2. **方法 `Gini`**/ U/ s: {2 g7 `6 \2 V! J
- **参数**:* w& x" F$ m1 A& \0 [6 @7 {
  - `dataset`: 一个类别标签数组。" G$ \: N* |4 Y) a! Y
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
8 G! B1 O% Y1 H5 p- **流程**:
9 E) A; p" X$ W/ z7 ^5 e  q  - 首先获取数据集中不同类别(标签)的集合。9 w, @. r! a' c- N/ i1 Y+ e
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
1 D* P  M( ]. k1 k) M" ~  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。6 U0 S1 u4 a! }8 a5 ^1 l+ x

7 l! S2 J% R% C7 K* j9 l$ w#### 3. **方法 `cmpgini`**
3 {1 |2 C& x! c- **参数**:
4 _5 R5 M0 H7 p  @* g  - `feature`: 当前特征列。9 i! i- e. w7 D! |, q
  - `label`: 对应的标签。
9 [6 l2 O  q7 C2 d7 r" Q6 x- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。: b4 `) E- c: H0 [
- **流程**:  m$ u1 P: h1 q! L" h) w
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。% K3 }5 f5 ?- t' i5 m
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。8 e9 B. N- H& T+ ]

3 l0 ~0 s4 K. m! W# I/ q#### 4. **方法 `maketree`**
3 a$ p0 _( E1 _4 ~- **参数**:
# u" X) q" ]7 k% Z: w; |3 g, {+ n  - `feature`: 当前特征数据。
) V- o  ?) O1 m3 w3 l$ i; a  - `label`: 当前标签数据。
- ]: \2 Q: X1 I* V' ^& m. u5 x- **功能**: 根据特征和标签递归构建决策树。2 U2 c3 s5 V% s) v! m2 ]' Y( X) e
- **流程**:
0 f: T5 z5 h% r, Q/ ?- c! b" @0 I1 i  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
3 o8 O# ?( k( q* A9 H  - 计算所有特征列的基尼指数,找到最优特征及其值。  a) i4 {4 C/ w  h3 _2 Z
  - 如果最小基尼指数等于 1,则返回标签。/ X8 x  v) f3 V/ d; O$ z. w
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。3 i! \' {9 E8 y& [+ S
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
, {3 D/ D8 {5 K% w
" g& i/ r1 x+ f9 t6 b2 n+ E#### 5. **方法 `train`**
9 w/ O& G. _  @- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
! Z: T3 N2 g6 F, p1 j0 X1 j; t- **作用**: 结果存储在 `self.train_result` 属性中。4 J# m" O; U7 p' w/ A8 ~: q. O+ C
" d. l: ~1 m% k! }" S. E
#### 6. **方法 `prediction`**
3 b' s) ]$ E* |3 J4 E- **参数**:
  j3 o6 x: j% R3 j  - `Mat`: 待预测的特征矩阵。% u$ M5 W' R1 ~1 `( H
- **功能**: 根据训练得到的决策树进行分类预测。1 y, b0 [4 R7 v  g5 A8 ~
- **流程**:
# r3 i+ Z  t% {. Y! i) B7 K9 }  - 遍历每个样本,通过树结构进行预测。* F; ?% W% g5 O) t( n
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
( z3 m% {5 \5 g  - 返回每个样本的预测结果。
6 a+ J+ H- I7 r& B2 W. V
  p, g; k5 q4 `2 g: M" }6 z7 s#### 7. **方法 `isLeaf`**
( ]# O3 q  S4 `7 S2 z0 A+ q9 j- **参数**:
" @0 l/ ]* F7 S3 j. m& ?8 O  - `tree`: 当前树的节点。
& d. S7 y; C- @  H- **功能**: 判断当前节点是否为叶子节点。& r/ @  R) {; D3 @2 s. j3 O" [7 h
- **返回值**: 如果是叶子节点返回 True,否则返回 False。" ]0 O" }7 M7 _0 d

+ D4 N: Y8 ~( U9 o( K* F- m#### 8. **方法 `getLeft` 和 `getRight`**
4 c7 s  D* M- [0 f6 z- **参数**:; Z8 u9 j  q4 c7 L
  - `tree`: 当前树节点。
+ \; ]7 W: o$ K) O7 R2 j. l5 K- **功能**: 分别获取当前节点的左子树和右子树。
, }- l9 n6 a" w3 a: x9 k& k- **返回值**: 返回子树。( g% }+ f4 i% P3 h3 |2 ^1 F. m

. G; {( `6 ^/ i### 总结7 G# Z3 q: ~( m1 q6 L! N
该代码实现了一个基本的决策树分类器,主要功能包括:
" y9 }7 I6 n9 l8 o$ @2 w% h5 v- 计算数据集的基尼指数。
, ?4 D( D+ X* {2 S  f4 }! a+ x- 根据特征和标签构建决策树。
: M4 L9 W  C0 u6 @6 E' M0 c+ A* _- 利用训练得到的树对新样本进行分类预测。
- g: U7 G" m' H+ a+ B/ W7 W9 k* e) I4 N2 N1 d& {
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
* i& N* m3 a) j2 L. ~* h8 g# A, P: p  x; x; [( ~
$ ]2 r+ R5 x  K, d5 M

0 j, ]4 e1 E6 P* p

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-5-25 22:28 , Processed in 0.409523 second(s), 55 queries .

回顶部