QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。8 V7 b/ `1 d, {) m( @/ j
: j& L, m- y% T* l8 \
### 类 `tree`2 v" E2 m% Z( i9 K5 ^3 n

, K8 `( R$ `, |- K5 u这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。: z* j, S- y3 ?) z0 P2 y; [

, c4 v9 N+ D- [7 L1 L( K0 F# I#### 1. **初始化方法 `__init__`**
; u- A# \% |8 A- **参数**:" W/ ^2 {. E( X1 |1 V4 r3 O
  - `feature`: 输入特征数据。
- P: X9 d. [, {3 v% p  - `label`: 对应的标签(目标值)。& U* m  s  k: T( p5 r. W" ^
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
+ ^5 N$ Q3 B* y- L1 i" e" @9 X# }  v0 f; L9 j
#### 2. **方法 `Gini`**: D0 \7 `" E$ Q$ E
- **参数**:
% L  w( |5 W4 B% W+ C" _  - `dataset`: 一个类别标签数组。) v8 L) O9 d% ^5 m* n2 j/ G
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
- r8 Z' f* i8 |- `9 b% S/ w- **流程**:, R# \  |! {/ M7 H( x
  - 首先获取数据集中不同类别(标签)的集合。
+ I$ w5 I0 N3 z  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
. y, y0 Z$ g* K6 E8 ?- ~& J4 ]  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。1 {; N$ E* X% L( b+ ?
( K; W6 X7 v$ B6 I
#### 3. **方法 `cmpgini`**. Y. r4 K. I# G
- **参数**:
* e' g5 y. I# F2 G4 B4 L  - `feature`: 当前特征列。
4 [: m* J1 h* H  {6 t, k+ P  - `label`: 对应的标签。7 u. E, q& x8 {  Q
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。" I5 p9 ?) o! O' g: f( W3 s
- **流程**:% |- h- {5 ]- F9 {# g0 b- t
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
/ k' S8 Q" a  O  T, h  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
' b* P4 [, Y; Z* x# G# Q% `" w  H% y: [1 |# e1 p
#### 4. **方法 `maketree`**+ b  t$ [7 {+ `7 k# o4 W
- **参数**:
+ }9 a' g/ h# @0 P2 }1 N  - `feature`: 当前特征数据。
8 J% e: d' I: Y# d8 e: c) {1 o  - `label`: 当前标签数据。  E# f1 d" M- D8 t) q
- **功能**: 根据特征和标签递归构建决策树。) \- u0 i3 R: k' A0 Z% T+ C
- **流程**:
2 ^0 T) ^, x4 M( K$ T. ~  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。! x0 l+ f) @4 m) {7 ^1 i
  - 计算所有特征列的基尼指数,找到最优特征及其值。
9 A: O1 m$ O7 K6 X( V7 L, @0 ?  - 如果最小基尼指数等于 1,则返回标签。' r9 h: b7 U8 \1 s5 B! r) M
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
. N5 Y5 e4 z8 A  ~! L  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
# k  ?' ~1 n9 s" J. @/ w2 h; F1 x0 D) r* ^* g! c
#### 5. **方法 `train`**1 g3 S+ g. @( s$ h2 e8 h; w
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。' K) `! J* l; p3 r0 l5 t
- **作用**: 结果存储在 `self.train_result` 属性中。* Q( b& t: ^- r; e

. u% J' Q% U$ y) `/ R#### 6. **方法 `prediction`**, _0 w* L: R& t& T5 {0 K
- **参数**:
3 k9 U4 u) C+ j# z) M  - `Mat`: 待预测的特征矩阵。
! d0 t; s9 v# U- **功能**: 根据训练得到的决策树进行分类预测。
( f! |  X7 ]2 d7 K/ v  B- **流程**:# u7 k% ?& ~# t: Q  ?! q' f* U8 o
  - 遍历每个样本,通过树结构进行预测。9 X, |5 c" M* }$ T" K& H
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
6 \; [5 ^8 y* p  - 返回每个样本的预测结果。" y* ^* P! H2 i& w- e/ k5 R7 [" i4 w

) {# y( S5 S$ s# H# O9 P  b' m+ G; l#### 7. **方法 `isLeaf`**
2 |. a% ^  `6 `0 C# p/ Y$ T- **参数**:. k( M" h" Y# J, G. ]
  - `tree`: 当前树的节点。( W5 h9 i. V* Q. ]: }/ z
- **功能**: 判断当前节点是否为叶子节点。0 T9 G) D/ A/ Y' h- O
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
* C+ K% A% X1 T8 ~- x1 o- x) G. _$ H/ d) h, L
#### 8. **方法 `getLeft` 和 `getRight`**
+ B& {* f6 r( X% R- **参数**:
% U# ]+ o) d/ B  - `tree`: 当前树节点。& d2 ~7 a4 R* f$ `, v
- **功能**: 分别获取当前节点的左子树和右子树。
5 I5 M- r2 P0 g5 a2 D8 z- **返回值**: 返回子树。% u' z+ Z1 }% w# j! N

3 R$ \) n( h  Q$ H7 U9 n### 总结& L) u8 ?3 r4 X5 j4 N) q( s
该代码实现了一个基本的决策树分类器,主要功能包括:- W7 e2 D7 l! r* T* M3 O+ {7 W
- 计算数据集的基尼指数。
+ Z3 D5 p) P( v, m( Q) x/ F* G% ^1 i- 根据特征和标签构建决策树。3 x+ K, j3 \3 `  j0 U3 }$ f3 U) s% {
- 利用训练得到的树对新样本进行分类预测。$ S+ `& H: [& i, _8 k
+ ], Q, R# e. r9 ^
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。+ }4 ~: ?. X3 F- ?! R: q

2 Y3 m/ Z+ q3 w; D5 v6 o/ ?* t# w7 ?. m5 J  c0 P
+ c& D! d3 s! m$ k7 \

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-4-16 15:15 , Processed in 0.430589 second(s), 54 queries .

回顶部