QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1171

主题

4

听众

2781

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。( K1 `1 t5 J6 k  x" `$ `9 d

+ `4 D6 P, {2 e. t  J; o9 e### 类 `tree`2 a7 D! E: b0 t2 E
( D5 h' P9 X9 d
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。! B- A7 ]3 ~; x' s6 |8 r5 k

. |3 }& t3 h/ y6 h7 F! z#### 1. **初始化方法 `__init__`**
; k( k( e9 P4 v0 _/ U$ U- **参数**:
, ~# L1 q$ q& ]" Y  - `feature`: 输入特征数据。  D0 s: T8 S0 f* u% `
  - `label`: 对应的标签(目标值)。$ p  A) `6 v  I/ j7 ~, y
- **功能**: 将特征和标签保存为类的属性,以备后续使用。, N7 W# f' w, B6 D' z5 g  A
+ M+ F" ~& h- o7 w* |3 ~( X9 H
#### 2. **方法 `Gini`**4 F1 K; k4 d) m- T- T8 i
- **参数**:7 w$ T" w" m4 R$ ?+ k/ a
  - `dataset`: 一个类别标签数组。4 n! H) {" B" w6 c9 ]# `6 d2 i$ h; n5 K
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
: G7 E* f3 z( F! ?1 V" o" K- M- **流程**:
2 `+ L6 y) C3 }! w5 j- @7 M  - 首先获取数据集中不同类别(标签)的集合。8 B$ k7 x& D+ e4 L* }  q5 A
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。( {2 S$ Z; `0 P' O! j. S; b
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
- j: x' H9 v0 h- B6 m  J4 v; I8 a
#### 3. **方法 `cmpgini`**
' `: R3 p9 c! e- ^; _- **参数**:! ]: F$ M4 r, I5 b
  - `feature`: 当前特征列。
% I$ p* f- V# ^3 v$ i( ^! W/ `  - `label`: 对应的标签。& ?8 L" X& s5 m& @& y
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
8 n% i* @% H  p" o! l( O( e- **流程**:
# o* {3 v* R( {; ~) o  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
2 J! l" t, z7 q7 p  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。1 ?* t4 D/ d/ }3 t* P

# W4 F2 ?9 M( c$ Q0 d#### 4. **方法 `maketree`**6 ~- T% }& {4 m; ]; T' \% T
- **参数**:6 `5 a# G# z& W  X) X
  - `feature`: 当前特征数据。
2 `/ ?# T2 ~; u  L3 u  - `label`: 当前标签数据。
2 L- j/ S' X8 s4 r' t! n3 N- }- **功能**: 根据特征和标签递归构建决策树。& h0 W! O# O; ^. p, U3 t# q5 ^
- **流程**:' P- ^% t5 G6 e4 e, \0 ?
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
8 M+ }9 Q7 }0 u4 e  - 计算所有特征列的基尼指数,找到最优特征及其值。5 D/ H& ^, {- N- H
  - 如果最小基尼指数等于 1,则返回标签。
7 T* m; g) z2 l4 x7 U  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。& B( ?" P5 A3 N# B! K$ V
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
& W% m% I' n! Z0 `$ a" N! k
' i& T" t- S; M#### 5. **方法 `train`**7 ~1 k: v. \1 ^: j) }; n
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
9 Z  P1 C. w& {+ {) n6 t9 k2 |" j$ Z! H- **作用**: 结果存储在 `self.train_result` 属性中。
4 Q" [& `  @: W
( k0 G1 N; R3 _) Y: s4 O% }#### 6. **方法 `prediction`**
9 _- J9 E# u! T" A- **参数**:: g  w1 ?, E4 r( T
  - `Mat`: 待预测的特征矩阵。
* v( b. h$ \$ p5 q9 a; A7 G: B- **功能**: 根据训练得到的决策树进行分类预测。
' d4 O7 Y  T: A- **流程**:2 i0 n  Q3 r2 C' D1 K# f2 N0 V
  - 遍历每个样本,通过树结构进行预测。7 N8 q1 m6 k% r, \! o# {
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。2 T9 W+ r" B8 c; ?9 I; z, Q
  - 返回每个样本的预测结果。2 H! Y; u& ^6 ]; ^2 \

' q7 Q& i/ O: |$ T- I#### 7. **方法 `isLeaf`**
, U" _  x3 \5 {6 a7 {- **参数**:
; s8 n9 B1 t* ]% h  N, x1 ?6 E& k& N  - `tree`: 当前树的节点。
( ]+ l0 u( ?; l( a! x8 ~, _  f9 B/ c- **功能**: 判断当前节点是否为叶子节点。- x& p  }" O2 ?% X, i9 R
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
' R9 ~4 f+ c) M! y5 P. a, s# @6 Q8 [! u4 b6 M5 L2 [4 ^, X
#### 8. **方法 `getLeft` 和 `getRight`**
! T- f- c4 k" i- **参数**:
# M- a" D) w* r& p, A2 F  - `tree`: 当前树节点。
) \. b1 S4 k  X  b- **功能**: 分别获取当前节点的左子树和右子树。
* J1 `: u! _) h' U( C% q- **返回值**: 返回子树。; o2 \8 s  _. I1 n' e0 i/ V- j
9 t& X  |* x' Q7 U6 G/ p
### 总结) a* i6 ?- {' s  a; V7 e" H
该代码实现了一个基本的决策树分类器,主要功能包括:& L8 Z; X; k$ }! A. E* n
- 计算数据集的基尼指数。0 r! z. H4 e2 \2 v5 G3 B' x" S, A
- 根据特征和标签构建决策树。
9 _4 u2 D  F" \6 k! L% K3 z- 利用训练得到的树对新样本进行分类预测。
; r6 y, C- R' w3 }2 u7 X- P; W; m2 k: u. G! @/ I' E
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
) y$ S2 p: L; U9 k' N' \8 I0 z& I/ E# y8 H
2 f. x2 B" F! B% x4 P1 D
/ @( I- @2 E% ~7 u2 y4 |+ e

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, 2025-6-24 09:06 , Processed in 0.355529 second(s), 54 queries .

回顶部