QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。; t& O9 K$ h' I8 Q% `( {( F

1 x& q9 ~: F: B' @3 B; w### 类 `tree`1 x- V( b& j$ L% l- w5 X8 Z+ r
1 T9 x5 ^5 _) T. m% Z! {
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
" o5 m7 |" X5 M, B. h8 W* u" `5 e  |: o" g6 w4 Y, G$ x
#### 1. **初始化方法 `__init__`**1 y- h* K+ m0 Q) `: |
- **参数**:7 {/ j6 J. T; e: S
  - `feature`: 输入特征数据。1 M- v. p3 l- b! Z3 U; I& P
  - `label`: 对应的标签(目标值)。0 }% q& G% k5 @7 W) t1 G9 i- D! I
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
- l6 {% B( t5 z: F! n7 }5 a  K3 [" t  P7 }# T
#### 2. **方法 `Gini`**
* {0 ^$ m' ^+ O- r4 ]7 L- **参数**:
( Q0 @) [9 ]( g- a1 n  - `dataset`: 一个类别标签数组。. ^, u) R, T; ~, i1 z
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
" v: I2 E- o* T' k& m" g- **流程**:3 B1 n" A3 ^% D6 y) X. n; Y$ Z
  - 首先获取数据集中不同类别(标签)的集合。, @4 V+ r4 O5 v* S
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。+ v; W7 [5 C; {
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
. ?6 w) m0 [1 b4 E$ g( ?+ x5 V: ^5 A( s3 A9 D
#### 3. **方法 `cmpgini`**; L( E- K, Y8 L+ Q
- **参数**:
' Z$ ~7 N% v6 [5 N  - `feature`: 当前特征列。
1 G2 _- R: f" k0 N. T7 |. ]  - `label`: 对应的标签。- q% @* D0 G- w
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
! V+ l+ J. R9 `/ u* c- r% p- **流程**:
8 |5 r2 A6 M& E2 S+ o6 K$ k  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
/ g) }: h0 F& f9 g  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。, x# b+ {5 m9 T1 O

5 m4 o4 Y" L3 [. f4 \, a0 ^+ n, {#### 4. **方法 `maketree`**& F2 c+ ]  W7 ?! `
- **参数**:
. ]4 H; W' ?- i& m- g0 d  - `feature`: 当前特征数据。
6 o# U( H# f) @$ _  - `label`: 当前标签数据。; S# r0 F6 `) k8 j  Q0 p
- **功能**: 根据特征和标签递归构建决策树。: k5 z- M+ \: U, ~6 Y
- **流程**:
" Z6 H. F" p# u  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。" d. z8 [( o0 Z0 y
  - 计算所有特征列的基尼指数,找到最优特征及其值。0 ]% l& a2 k- _* ]4 u5 i: K6 m
  - 如果最小基尼指数等于 1,则返回标签。% ^) T6 \* J( P* t: B
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
5 R: x  _. L4 b! d  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。: ~# @! k& g8 x- G" q" A! h: G

4 r2 E  K" n$ C* ]2 O#### 5. **方法 `train`**
$ r# n) N6 w$ g7 W) Y$ d- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
. I8 r% ^+ R( A, @. ~2 e  b- **作用**: 结果存储在 `self.train_result` 属性中。
. p# e7 R" q; h
) F7 ?7 M/ a0 f6 P#### 6. **方法 `prediction`**
. z, M- }# A5 T* f8 O- **参数**:
' B& L  R7 e- x. V% y5 D+ n4 h) C' T  - `Mat`: 待预测的特征矩阵。
+ \" T3 H) x8 k* U- **功能**: 根据训练得到的决策树进行分类预测。
! N( g9 O& e) U  G; ]. H- K; f  ^- **流程**:0 V1 k' q7 R4 U. H0 }
  - 遍历每个样本,通过树结构进行预测。9 Z6 H7 h/ t, V" V3 C
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。' [& @1 P# q1 d0 _1 \5 K0 j1 j
  - 返回每个样本的预测结果。3 e7 j7 t# o8 i0 P  \  g3 n

* V; k; |: }" k& _! h#### 7. **方法 `isLeaf`**+ L) i& Y, u( l( y8 N" b5 w
- **参数**:
0 [% E+ r- F& g+ p  O' i  - `tree`: 当前树的节点。0 _* D6 p6 L% l& @2 W1 v+ Q
- **功能**: 判断当前节点是否为叶子节点。- O2 O8 k2 L' H1 u; M/ H2 h
- **返回值**: 如果是叶子节点返回 True,否则返回 False。" @  L8 M  f0 \: T& b  M
5 S- B+ y, q% K; W1 V9 S
#### 8. **方法 `getLeft` 和 `getRight`**
# x- t  c. p+ x4 `. @- **参数**:
- x9 R: D& p, S7 F9 p+ [8 T- a  - `tree`: 当前树节点。
6 ?+ G& T9 p* G7 d8 f! }- **功能**: 分别获取当前节点的左子树和右子树。
4 ^1 e% S4 d/ H( o; w* [! I2 d- **返回值**: 返回子树。9 v8 u6 ]( R9 Z7 P' f1 N: I: c

3 @. Q; M. q7 D" i- o2 `4 d3 X% B### 总结
! c3 ?7 b, u- z( M  q1 Z# l: U9 a* @该代码实现了一个基本的决策树分类器,主要功能包括:  V$ D# e- w0 X5 h6 E) N
- 计算数据集的基尼指数。
  C% }5 P. I/ I2 J! d- I2 y* h- 根据特征和标签构建决策树。) [$ D7 {' x( K9 v
- 利用训练得到的树对新样本进行分类预测。7 D+ ?1 \- Z% |5 U

* |" N$ R# B. u' c9 d; a$ ]该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。+ @: t3 S7 B0 }+ R: l: C  f2 t
5 T; S$ ]3 l$ f  h4 {. D4 d

# d' `4 C: ?7 `! P1 L! y" x
* G/ ?0 R) y# v3 b7 T* k+ B: j

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-7-10 05:08 , Processed in 0.415201 second(s), 55 queries .

回顶部