QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
8 u" s7 q$ H! o. P  K* M1 y6 G) y7 A
### 类 `tree`1 F, A3 A! T/ j; d
+ s9 b1 W. B! t$ i2 o
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
& [7 A# b6 x5 A- d! X6 t
- m5 A6 t( ~1 o/ R, D5 g+ y& u#### 1. **初始化方法 `__init__`**
* O2 v, w9 T' v, U2 x# f- **参数**:  ^% q5 c$ M. x# k5 @+ @7 a0 q/ l/ S$ R
  - `feature`: 输入特征数据。
/ p$ _4 F$ C/ ]; `- R' e  - `label`: 对应的标签(目标值)。
) R+ n% K+ O$ m5 t0 u* F- **功能**: 将特征和标签保存为类的属性,以备后续使用。+ b. c& J0 }+ f/ A# T, p) b7 K
2 q) H5 h& D  s8 g2 y- Z
#### 2. **方法 `Gini`**
7 [) O- M/ ]5 B+ o8 ~, V3 L- **参数**:  w7 T8 v7 ?# N$ W5 q& N
  - `dataset`: 一个类别标签数组。
- X4 h' Q& ?5 j- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
6 x; d( P3 b4 A+ @- **流程**:
3 Y- O# m) S) m3 E  - 首先获取数据集中不同类别(标签)的集合。
3 _! z) H# o0 N+ ^  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
; g- {! p6 d- H! S# m6 Y+ O  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。4 Q8 X2 o7 T+ l+ `/ n
* M* o& ]! r; X& u: i% j# U- s
#### 3. **方法 `cmpgini`**
5 q& B, r) G. I4 g$ E3 n/ L" i- **参数**:
2 q/ S) ^$ m; Q3 t* q  - `feature`: 当前特征列。/ d5 C+ L0 [6 C/ K3 m% x
  - `label`: 对应的标签。
! R/ r$ v* A7 W- `3 [3 |- o- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
) H9 r& f2 P' x; h; e4 I/ d- **流程**:8 F& n( J, K% g  i. x
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。1 P4 l8 @& {/ A: H) m
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
2 }2 p# }6 d8 [' L+ O- M* Q4 P
! W6 w! y+ F/ @& ^4 z! `& ]; W#### 4. **方法 `maketree`**9 K# d0 Z( ?  T/ M0 H
- **参数**:# b0 K1 G) o1 b9 m6 U$ c2 N$ H- l" v
  - `feature`: 当前特征数据。
' J# F8 F6 b8 ?9 M9 ^% M0 p) X  - `label`: 当前标签数据。) R, N, @5 m0 l9 g; m  L, _1 \( F
- **功能**: 根据特征和标签递归构建决策树。+ B' [/ g3 y3 Y" k) b$ ~+ H1 g$ o
- **流程**:
8 x+ q2 k' b( t0 c  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
8 v  i/ ^5 M# k8 h4 F  - 计算所有特征列的基尼指数,找到最优特征及其值。( `" h$ b- _7 l( C7 k1 E
  - 如果最小基尼指数等于 1,则返回标签。
' `5 [' t' t$ i6 D3 g  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。/ n: J& `& I% z6 @- ~# m) G6 }
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
1 E) G  z# m) ~/ q4 H* S: `( |( _/ i3 A  r& j( j2 |* A) Y  j
#### 5. **方法 `train`**2 o% V9 E7 z% H& a0 v5 m
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。' e4 J, h" d2 G5 n
- **作用**: 结果存储在 `self.train_result` 属性中。
% {0 X+ z% D3 c
7 X& q5 l! L6 c7 o: H$ I; b#### 6. **方法 `prediction`**; |" i; L) ?1 W7 `- ~
- **参数**:8 v+ c4 ~. d: a- D/ h
  - `Mat`: 待预测的特征矩阵。+ o* j$ x7 D0 u2 ^2 `; g0 ^3 k7 j
- **功能**: 根据训练得到的决策树进行分类预测。
9 M) |: _6 r% U3 V$ h" \! u- **流程**:
0 R( u& O% Q. y# t7 s: c! ^( u  - 遍历每个样本,通过树结构进行预测。
2 |) Q! ]$ W5 B. z" j  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。0 J) X. Z& [5 C& \- \
  - 返回每个样本的预测结果。9 h! x: ~9 a  P  t

6 C  T5 q* ?- ?1 K) M. d8 _#### 7. **方法 `isLeaf`**3 A2 W4 P+ `$ n9 W6 y
- **参数**:
4 o, K- p+ S" W; C* p% s  - `tree`: 当前树的节点。
$ y+ n0 [1 s7 d' ]- **功能**: 判断当前节点是否为叶子节点。* V0 y* X4 n: A! [3 e( S
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
9 h& T. b1 u2 r* z+ e1 V$ u
) b. K9 k7 Q& h* Z#### 8. **方法 `getLeft` 和 `getRight`**
2 v- Q2 M, ~5 J/ a9 o$ L- **参数**:% {5 o7 h! p4 P% ?2 I/ K& W' _
  - `tree`: 当前树节点。
1 N, `' u) q  {6 I4 f- **功能**: 分别获取当前节点的左子树和右子树。
; @( Y3 ]5 J. Q. }! A- **返回值**: 返回子树。
, v5 z; k1 M3 w& s  a3 F* i
0 F2 ^# G( p9 {1 x  V! [* C### 总结5 |; V* y1 ]% `1 I) _$ R) I9 m
该代码实现了一个基本的决策树分类器,主要功能包括:) X- ?' K1 K- q4 r+ w
- 计算数据集的基尼指数。6 Y2 x$ D3 x& t
- 根据特征和标签构建决策树。: Y! G5 B; z0 \& A8 T2 r" K( Y
- 利用训练得到的树对新样本进行分类预测。
6 @4 s, V$ s1 U* [* Q4 A" x
# `$ f" H/ u  U3 H, E! m7 X该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。( @) [: `6 h& ?, B" N. u: t

- s" d; J% Y" q6 J9 \
9 ]3 j3 X9 V3 w  J- E, n" X: B. [4 n/ u- E6 J  _2 w+ Y# b9 K  K

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-10 07:06 , Processed in 0.464054 second(s), 54 queries .

回顶部