QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。7 L: x4 e0 g7 Y5 N/ E  B

* s, [2 O) r0 r4 J- V### 类 `tree`
% U* u/ R5 K" J6 d7 z
. T9 G+ d0 l5 g  z8 ?这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。6 }9 d6 X. c! Y5 K

6 H" W/ U+ a- @. t* W#### 1. **初始化方法 `__init__`**
) P8 W7 X% N' F) [9 f0 x- **参数**:% o1 s7 a" m" M; ?' |" J
  - `feature`: 输入特征数据。
2 H8 U+ |) }" _( u  - `label`: 对应的标签(目标值)。3 p+ w9 ?' Q6 P/ X  e8 K
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
3 B# w7 }9 w- h" k
8 t- V) ?! G/ i4 r( H#### 2. **方法 `Gini`**
6 I+ n7 R- _' ]* c- **参数**:
3 A0 r. ?6 j8 i4 B) v  - `dataset`: 一个类别标签数组。1 D6 b, ?, g; f" J6 C, ~+ D
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。& p2 F2 j3 N; L8 D' G7 X- V1 W+ L
- **流程**:: d) H3 U$ P5 p2 ?1 g, t$ r: F
  - 首先获取数据集中不同类别(标签)的集合。! i1 C7 O, T2 D$ ?; m, |
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
& f5 a7 S1 o" t$ t  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。/ n: j" z$ g/ B* U8 T$ ~' ~0 S# W! H) v

( X0 j: _- ~0 [4 d1 L( {  V& l* D$ j#### 3. **方法 `cmpgini`**8 P, d. {8 H" Z: x! L7 {
- **参数**:
: j* B/ V: o/ E8 s4 p: c1 K0 G  - `feature`: 当前特征列。9 \7 V: w0 s" {" A4 |8 O
  - `label`: 对应的标签。3 e& e& X9 L- A0 T3 u
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
; g' i* _* h8 G  K' v3 ~* A6 |- **流程**:
) {7 z  z7 f1 c4 q  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。3 x/ g# B  I5 _( y/ d* @" {
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。, E% R8 t, P  q" s

9 Z) S0 l' h$ I1 B" n0 i' D#### 4. **方法 `maketree`**( B' V" e; Q' A" [7 s" r
- **参数**:* e$ i. g: x; u5 \" }
  - `feature`: 当前特征数据。
, `6 |" S; P5 h) }& Q+ Q  - `label`: 当前标签数据。
  v& W5 _  K2 K! d+ r- **功能**: 根据特征和标签递归构建决策树。
* a- }1 l& Y; ?- **流程**:- A9 x2 [. i  b
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
, U7 I1 s$ r3 I2 W1 C  - 计算所有特征列的基尼指数,找到最优特征及其值。6 ^9 `! b* h1 H3 J" T7 L
  - 如果最小基尼指数等于 1,则返回标签。/ c1 K+ Z; v8 ]. _- F
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。7 j1 P9 T. S) M5 w" L
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
& b  z& o+ r+ w# H+ j& Y. r
% _' O2 ^+ r7 |) K/ I#### 5. **方法 `train`**0 t) @) D+ I$ F$ g1 F: @$ J
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
! C2 ~0 c! c+ K. i! R- **作用**: 结果存储在 `self.train_result` 属性中。+ I0 ?3 j# P* A' H* {+ n9 P
/ F: ?* t, V$ [! A7 }
#### 6. **方法 `prediction`**
* |- ]; z4 ?8 I. _0 D+ ^- **参数**:
7 O1 G) {8 u3 F( B( l' C0 q  - `Mat`: 待预测的特征矩阵。& g( b9 c% ~# t2 w3 T
- **功能**: 根据训练得到的决策树进行分类预测。
. Z; O( G' b6 z& @8 l! @; ^- **流程**:' `* n7 I1 I% x5 p  [) e
  - 遍历每个样本,通过树结构进行预测。
$ D0 f" A% U4 m4 b: C  _0 o  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。; Q6 H+ t: ?' w9 O2 ~
  - 返回每个样本的预测结果。9 `  ?8 ^- a! C$ {
7 Q8 B7 f- Q& k* L8 D- R
#### 7. **方法 `isLeaf`**. k% {) Z6 r+ e! B
- **参数**:
+ N9 v5 I) n8 [; S. ~  - `tree`: 当前树的节点。
! {$ e6 o$ j6 Z6 O) L1 ]- **功能**: 判断当前节点是否为叶子节点。- ~6 ^" @- a  Y" G- p, r
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
5 R( J; x& f" D+ G: t" P" u
6 I9 \/ m3 A$ f# E* ^% N7 ]7 C#### 8. **方法 `getLeft` 和 `getRight`**4 Y% m, R. V. D3 i+ H  R+ w
- **参数**:& v  \, Q2 g' y5 E, z  Y, k
  - `tree`: 当前树节点。
( @3 Y2 v& ?5 w5 e0 _- **功能**: 分别获取当前节点的左子树和右子树。
1 M  d' J2 d6 @$ Z: u7 h- **返回值**: 返回子树。3 _6 z/ o( s9 {4 n/ G& Y5 p

4 a7 [/ c# t! f. A### 总结8 b5 b# v# I% J; F+ R7 y7 ^
该代码实现了一个基本的决策树分类器,主要功能包括:
2 D  r. m+ a& t" v# S6 S3 ?- 计算数据集的基尼指数。" R3 n& Z9 a  e% [# ~* q
- 根据特征和标签构建决策树。! |% E* s$ L/ q" W3 S" i
- 利用训练得到的树对新样本进行分类预测。' L' F. L. W' x2 o+ P- b
, E+ q8 i8 R- i
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。+ f: L9 ]! d3 l( v
" C- D2 X( |9 y+ B; X' W0 m8 w

  Z+ J4 s' E- r" X% U
' |* b1 z. ^9 E% g8 F

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-10-11 07:20 , Processed in 0.619706 second(s), 55 queries .

回顶部