QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。" A: U8 O# L( x, s# b
3 X7 b  v; E8 A$ V% s! X
### 类 `tree`( H* P8 E; z. I" c4 \
3 A8 }! N9 t  |" l
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。) G: ~8 M" O$ D% H

+ l3 ~: i$ S% A0 V3 E' _#### 1. **初始化方法 `__init__`**- W5 }3 P6 j, I
- **参数**:
2 [" Z* y' S  {# g; A! @/ {  - `feature`: 输入特征数据。
( y0 z5 @- Z1 @1 j  - `label`: 对应的标签(目标值)。
! H, i& i8 X( ^& i2 d8 H- **功能**: 将特征和标签保存为类的属性,以备后续使用。
+ C3 y; a2 q5 v1 o  Z) F- a0 z+ q. F8 x# T3 _
#### 2. **方法 `Gini`**
4 F( L; m5 i& h( n  Q- **参数**:3 Q) W0 h( X+ P% K/ q4 F: {
  - `dataset`: 一个类别标签数组。" s# o; Z7 G9 z! F. `. E- ?
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
$ i% g' ]' b/ d* S  p, a- **流程**:' I  `3 I% [* a$ F
  - 首先获取数据集中不同类别(标签)的集合。1 m4 P" e) a; z/ l% U
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
7 J$ p3 Z+ v! B; V  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
' B$ |( @: p8 U( M
- p& g4 C, L7 _3 ^  t#### 3. **方法 `cmpgini`**6 c3 e# A2 t5 \- H3 m! c2 A
- **参数**:  a  j$ R3 C* c; `0 [- E7 w( O
  - `feature`: 当前特征列。
, s9 J/ {+ T5 {  - `label`: 对应的标签。% f  P0 }. |$ |- K0 V: P
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。; d; F( `* l. m
- **流程**:  g: `" u0 U9 L) S$ I# d. W% s1 U# X
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。/ Q6 V$ ~/ @3 N2 [
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
# |) H# K) n2 s* |. c: b" ?9 }; W+ `/ n
#### 4. **方法 `maketree`**" q/ l) s' S/ f8 C1 h
- **参数**:
4 G7 M* z0 s, s/ ^- ~  - `feature`: 当前特征数据。. E9 M# H# U7 m2 {  K
  - `label`: 当前标签数据。+ W3 i4 @0 I5 e, f+ ~  C4 K
- **功能**: 根据特征和标签递归构建决策树。, o6 O0 L# h/ n4 C
- **流程**:6 }6 o! M. d) t# u0 ?7 L
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。$ S. O7 l" }1 V: @3 K6 D
  - 计算所有特征列的基尼指数,找到最优特征及其值。% D' R5 U- T2 c( K! q* }
  - 如果最小基尼指数等于 1,则返回标签。  o: V  I# i& {$ C9 Q
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。0 X1 h. [/ c& s' {0 v2 @( l4 A
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。5 D* |: H3 d/ I. a/ J0 y1 H

% |7 k: t/ Z; G( I9 k#### 5. **方法 `train`**3 N5 }7 L, e0 i$ B  N! r1 a
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。  I# b2 B# e8 X
- **作用**: 结果存储在 `self.train_result` 属性中。  z2 Z% b* Y5 |1 `

' m1 b/ R- D0 J  `! f% p8 V#### 6. **方法 `prediction`**
8 N4 Q: E( Y. ?- **参数**:6 U* ^$ n1 z, F7 ~4 n
  - `Mat`: 待预测的特征矩阵。9 C7 y/ O. C; n3 [& @. j, Z
- **功能**: 根据训练得到的决策树进行分类预测。
9 m9 N2 i, k# ?( k2 e& k- **流程**:
9 _0 Y! [$ ^- K1 O/ |  - 遍历每个样本,通过树结构进行预测。5 E. V1 |7 w  j0 v* A+ `0 M4 R* ]
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
/ g# Q4 b% M$ v) n3 A  - 返回每个样本的预测结果。
6 Q$ o+ S. u. \+ f/ j6 c% l3 e% I' m; X3 N' Q& Q
#### 7. **方法 `isLeaf`**
/ U1 O: n! K- O# D4 p- **参数**:! }  I+ U: Y& l
  - `tree`: 当前树的节点。
0 ~7 Z# H1 V% o& p- **功能**: 判断当前节点是否为叶子节点。+ X8 {, [6 ]6 X
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
# I3 g! T9 l/ L  _9 Q0 J1 E% I0 W" r8 t0 t" B
#### 8. **方法 `getLeft` 和 `getRight`**7 Q+ H0 c3 m' m" }& x
- **参数**:
+ D, ?9 Q3 N+ |# ^, c6 K) g  - `tree`: 当前树节点。
% `( ]' E6 v/ r* V$ `* ?- **功能**: 分别获取当前节点的左子树和右子树。. m5 k6 }: {- x9 w& e
- **返回值**: 返回子树。; w5 M. s- _( j' r3 m
& r1 q/ g0 o% D9 b. M( l
### 总结" Z0 ?1 b6 r& a3 V* l5 Z
该代码实现了一个基本的决策树分类器,主要功能包括:
6 l* [" [0 ?; }- 计算数据集的基尼指数。% D2 ^8 `1 \1 Q, [. H+ e$ ~9 E( ^& A
- 根据特征和标签构建决策树。
3 E, T, D1 `6 m0 s- 利用训练得到的树对新样本进行分类预测。
* Z& a+ P7 P- g! O! h( s
4 |( m3 K4 [- Z+ n) N- F, `& Q该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
7 B7 S; c- s) K$ x
6 z: x9 c$ c: d2 T! m& q5 J/ R! R* G2 t: j! q- e4 u5 g: E# l3 k
& |' T0 O: M6 i; c

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-8-25 09:28 , Processed in 0.430102 second(s), 55 queries .

回顶部