QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。1 f% Z+ }% s- D) j+ X; r5 c# K

0 n! Q* [+ w( d& f7 j* z& _### 类 `tree`
8 I5 R8 h8 ^# G; g& x* R/ W7 E/ d
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
4 F# B" G% R3 d3 ?
, r5 Y, C8 P% F- G# W#### 1. **初始化方法 `__init__`**
. g: v. F" F1 }6 O) T" E- **参数**:7 l; D; V' u, b
  - `feature`: 输入特征数据。" t1 G2 h7 @: k2 }% T
  - `label`: 对应的标签(目标值)。- j0 W3 R0 U7 i5 _, G1 [
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
1 G# I2 m- t2 r% S( `7 ^  L5 O+ [. L- q% F
#### 2. **方法 `Gini`**# I5 Y. U2 u2 d0 j, o: I
- **参数**:: H6 V/ Y8 }; K7 i$ ~* `3 @1 Z
  - `dataset`: 一个类别标签数组。9 q( h, c( S$ l7 O" X+ i
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
# C0 A7 n$ o/ ?/ Q* h; X- **流程**:
  r! O& O% h7 Z3 \/ ^  - 首先获取数据集中不同类别(标签)的集合。2 Y* w! i1 N  _7 Z6 ~0 q/ D
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。+ W: e# B: _6 h; J: j- K
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。' `. R+ f) Y3 F; M8 @( M" |* J5 q
$ l) ^# D- v1 C) T+ t0 h4 y7 _7 R
#### 3. **方法 `cmpgini`**
2 ~2 N& R1 ^% J1 J- **参数**:
! P, F' E2 ^7 p  - `feature`: 当前特征列。
7 g% i# E+ j% ~/ ^  - `label`: 对应的标签。
! z# Q1 v+ v1 {- E- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。, |4 M" c- ~# d6 W6 y9 U9 o
- **流程**:
" q7 g/ @1 B' c5 H  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。* ^) Q- U' z6 D+ ^1 e6 Z$ n" }8 J
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。' }; f; X" F$ c: E8 J

0 o% O3 E# x# f4 Y( y#### 4. **方法 `maketree`**& K: f# p- e& n; G2 P
- **参数**:8 _9 X  m# Y  K
  - `feature`: 当前特征数据。
7 S0 a; U# @6 ~2 T  B" f3 {# k  - `label`: 当前标签数据。6 v% a7 L/ B, A
- **功能**: 根据特征和标签递归构建决策树。5 E: S0 ?- }, h- Q7 y7 T2 W
- **流程**:$ n3 Z/ N4 ~4 l9 d
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
; x/ C- w' P' d1 X  - 计算所有特征列的基尼指数,找到最优特征及其值。
2 E4 @3 ~- r- r0 F' I1 o6 R, }  - 如果最小基尼指数等于 1,则返回标签。3 G; o  u8 J/ ^. P
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。1 v& T9 s+ I" f% i- t2 n& Y1 p2 O
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
3 X& p3 P, |! I# w
. Y. G+ D/ Z, }5 k, `% T; L  y#### 5. **方法 `train`**  Q# z8 |# b. H: a9 V
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
& H; m9 D) R: X& ~3 W- **作用**: 结果存储在 `self.train_result` 属性中。
& c2 k1 ~- N4 @- V& {$ }2 A/ a
/ J2 {6 c5 w$ |#### 6. **方法 `prediction`**+ a" P  U) n( ?
- **参数**:
- H: I! R  o. R9 G- \) T  - `Mat`: 待预测的特征矩阵。
, B; y6 o% n: v, C2 _4 b3 v- **功能**: 根据训练得到的决策树进行分类预测。& U8 R+ k2 |# ^; N8 a
- **流程**:* v7 ^, l' v  o
  - 遍历每个样本,通过树结构进行预测。
/ K: P! H( K1 M: q0 j  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。1 e  d% |2 |0 n0 P: F9 j4 W1 }
  - 返回每个样本的预测结果。# K( x& Q3 n! t- A" K7 {

+ t( U5 L- w. Y; s, _#### 7. **方法 `isLeaf`**3 F& f+ }7 ?" b; R
- **参数**:
4 l, h1 h! D) ~( a  - `tree`: 当前树的节点。3 R( Z$ U) U/ [
- **功能**: 判断当前节点是否为叶子节点。0 o1 ~: @3 P$ O) |$ X. g6 v
- **返回值**: 如果是叶子节点返回 True,否则返回 False。9 q, E; R2 {3 {  M9 g. q, K
/ a: C- n3 y+ a/ B8 R1 M3 l' R/ C( d
#### 8. **方法 `getLeft` 和 `getRight`**, C- x# Q& M6 R) H: a, Y
- **参数**:/ s. I  Z& ~$ f1 _& K  X& v
  - `tree`: 当前树节点。4 f2 {* X: r9 X1 k3 B
- **功能**: 分别获取当前节点的左子树和右子树。
' t, q9 Y+ s( t* `- **返回值**: 返回子树。, O1 G: P+ S& a# X6 {
, [4 n! u" W1 z9 s$ b3 G' o
### 总结9 V& H! b, ^0 f% i) `, s2 Q
该代码实现了一个基本的决策树分类器,主要功能包括:  y, E! g: ]: f2 X4 E
- 计算数据集的基尼指数。
; Z) e' ^7 W0 X; v" D/ E- 根据特征和标签构建决策树。5 J, E' K# \5 C0 d: m; ^) _
- 利用训练得到的树对新样本进行分类预测。( T8 p4 B) w) ]2 L: Z

- f+ L# _; o2 v. F' k" {该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
( R' ]+ S: d  }! |- e1 Q; b+ a
1 _7 g. l4 L% U. f' \' M& O+ w2 M! k/ Y4 ]+ S/ r: |( ?

; C; D; ?- f. h, Y3 h

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-3 20:21 , Processed in 0.437534 second(s), 55 queries .

回顶部