QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。/ i6 B7 {% ^; V8 t
; S* ^% o) i- ^# A/ {, ~
### 类 `tree`! ~3 z. y( ?4 J- V! i

  a* r, T  O$ }* _  [3 ]这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。* X7 I* x/ U( m4 b) `0 Q/ e

$ i. P  I$ x- [/ `8 j#### 1. **初始化方法 `__init__`**
2 u- f2 n% M% P8 o" ~6 v7 [- **参数**:6 z4 J) C) L4 ]4 C3 d
  - `feature`: 输入特征数据。
" ^* R$ @+ D6 a  - `label`: 对应的标签(目标值)。/ h' B$ r; U) q2 j4 v) w! ?
- **功能**: 将特征和标签保存为类的属性,以备后续使用。, A6 y/ F& q# p- y+ r( R. `0 t

% T4 F. V$ G" T#### 2. **方法 `Gini`**
4 o, J" D% W( _4 e( d+ X- **参数**:7 m+ c  ^! F$ X( a( z4 H/ E6 I& R
  - `dataset`: 一个类别标签数组。
" m3 l# K  o) j: L4 t- **功能**: 计算给定数据集的基尼指数(Gini impurity)。7 J6 m) V: ^6 q& R' a* A+ k  ~
- **流程**:
" k% k1 C- Q# ]8 V& P1 _! r/ }  - 首先获取数据集中不同类别(标签)的集合。$ }4 i" P! p  j. n) p6 c% C7 K
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。2 k$ e  N4 o5 h% i4 \
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
4 r2 N1 p9 {( i- K* X1 X0 S) l2 Y4 Z& r& Z) a/ l0 O
#### 3. **方法 `cmpgini`**
# S& F/ n# Z  B! i2 M) S- **参数**:. H& |6 O" ~1 ~- F: l6 v3 Q
  - `feature`: 当前特征列。
) q, g( J/ P- i3 B6 S: G1 K# d  - `label`: 对应的标签。+ r3 p6 c5 [3 |& Y
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
5 Y8 m3 M8 V! u7 ]  X  G, i. f- **流程**:$ Z3 \! e6 ]8 n+ y1 G! l; @$ O" ]
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。' i' k2 x4 k/ E3 ~! R/ s
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。2 v! |+ A5 _% ?) }/ ]$ p

: W1 b6 W) t$ q, [# r" V#### 4. **方法 `maketree`**  K9 U8 Y# V' Z1 N! b7 ^
- **参数**:
1 W2 H7 G2 g# h4 q  - `feature`: 当前特征数据。8 S/ @: h0 `* R% N- s' u5 P
  - `label`: 当前标签数据。
7 P. M$ u% o5 s; h- **功能**: 根据特征和标签递归构建决策树。
) F  j. r1 M1 n  Y- **流程**:
8 N6 Z' Z% P' ]+ B$ ~3 C* K( @  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。0 K- Z1 A9 r+ ^2 B. S. X# R4 F1 ^
  - 计算所有特征列的基尼指数,找到最优特征及其值。: T+ m: K0 o+ V3 T6 t5 H
  - 如果最小基尼指数等于 1,则返回标签。
2 h, I8 Q2 g5 A7 d) z# n  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
* i- D* l1 a2 `  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
! [' W" ?) G+ n6 c8 h; w" ?/ y. [5 E
#### 5. **方法 `train`**3 h- p( W! y. ]' w& R$ }" r, m
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
( o& y2 B+ c- H6 q2 W' t- **作用**: 结果存储在 `self.train_result` 属性中。6 P: x. `7 ^, B4 e, D; P: N5 ^5 {
$ W; O# d' H0 d, e8 P! D
#### 6. **方法 `prediction`**
/ z7 s2 _; f5 e7 A2 C7 i) \( f- **参数**:# Z/ X1 U$ o. l
  - `Mat`: 待预测的特征矩阵。
* B& I6 m9 c1 x5 Q8 ?- F) X- **功能**: 根据训练得到的决策树进行分类预测。
: r6 c; B' B  j9 p0 n- **流程**:
! p2 M7 u& o* M  - 遍历每个样本,通过树结构进行预测。, F/ R! t. e! r9 }" y1 [8 r
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。- r8 B6 E2 X& @# m) U
  - 返回每个样本的预测结果。
  s# x! U5 b; M: _. Y) Z3 F9 W2 n
#### 7. **方法 `isLeaf`*** u  h1 R( w7 J' U& L7 z
- **参数**:1 T$ {7 G! r6 f9 [1 O$ x% R$ V
  - `tree`: 当前树的节点。
3 a7 A% ]: f3 U- **功能**: 判断当前节点是否为叶子节点。/ |1 h4 I, ~; o9 r
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
: ~" _. _# I% H$ \2 a1 l: F; p, D/ P  E0 }! B0 f  q+ ^2 r) E
#### 8. **方法 `getLeft` 和 `getRight`**# w6 H# q" |5 @
- **参数**:
. t& s/ W- ]' n. w" i: v1 w  - `tree`: 当前树节点。( V  _! D. a. y6 w) q
- **功能**: 分别获取当前节点的左子树和右子树。
# B5 }! i; `& e3 Q- **返回值**: 返回子树。
4 s5 Y4 [3 f- T
, Z* N/ a  Z3 _  F### 总结$ e6 o) i7 x/ |: X, z
该代码实现了一个基本的决策树分类器,主要功能包括:
' \+ U/ Z2 C6 t( _4 e) W7 y- 计算数据集的基尼指数。
! e* J# D, r( d8 U- 根据特征和标签构建决策树。0 {5 L3 p, S: N+ d* j
- 利用训练得到的树对新样本进行分类预测。4 {  q2 q8 C; S$ k+ }) A% M( c
7 O" B: ?, T6 [, `6 S# f& P5 }2 V
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。6 Q9 K6 r$ D, U' q: I" k
1 a8 r$ L7 _! \+ q1 T

8 C2 w; |# v" Y, R) R  v, v9 L! m# l; E+ 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-4-16 19:09 , Processed in 0.408698 second(s), 55 queries .

回顶部