QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。4 t# Q/ o( u8 X, Y8 d; w

# W4 q% g2 g8 o- p### 类 `tree`
! u  I; {2 Q$ V4 u% a- ?+ O2 {0 U7 l5 q. m0 y9 H) B7 U
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。, ^* Y! ]  ]% H7 t
, f# M+ w) u* l- J
#### 1. **初始化方法 `__init__`**
' |- W/ e. Z& g+ J) F: ]. z9 \- **参数**:
% z' @7 ~9 j! C. w  - `feature`: 输入特征数据。% m6 }3 c2 t1 N) k. ^0 q
  - `label`: 对应的标签(目标值)。7 l4 h  ^0 b  J* N! _9 B' e
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
6 q) n# \' j  h9 L& Q/ e) `2 @% }$ ~, c
#### 2. **方法 `Gini`**' Y2 M! f! {4 X6 C, E$ s; G$ j
- **参数**:% B$ a% F" N9 i$ a" w" N8 I" N; J
  - `dataset`: 一个类别标签数组。
, ~+ k' N7 I! K+ @( V' W- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
6 W  D* v3 W* I6 h5 ~7 J1 A- **流程**:
& B9 v, C. L' S+ H% Q. U1 M  - 首先获取数据集中不同类别(标签)的集合。# B. l) s& ~9 N
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。/ G9 h* q/ X5 D. q; R% x; V
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
9 M$ {$ U, ]& `3 |4 l' {! T& e6 O4 [7 l+ U6 I
#### 3. **方法 `cmpgini`**
7 c  |' t. M" @# H) m& _; p7 }- **参数**:0 ?2 O, z" W5 B8 P) `: Z
  - `feature`: 当前特征列。
: s: Q# e( B. w: p9 k2 E  - `label`: 对应的标签。3 ?; z" {/ i* s
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。) [- N' w. i9 G5 A1 V6 }5 N3 l7 ~
- **流程**:
/ r7 L2 U$ O  t, F  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
* [, H! o1 M1 F0 E9 C- N# |% V* ]  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。$ F$ \) x: e1 ~1 E5 m- I) W
* Y9 K, d. {. F0 i
#### 4. **方法 `maketree`**# m  U! g* a( g- H. u
- **参数**:
4 j6 U2 U, p& X* ]8 q  - `feature`: 当前特征数据。
  H/ P4 [  p9 o$ _' ^  - `label`: 当前标签数据。, H/ \& G1 ~, C$ b' V' [
- **功能**: 根据特征和标签递归构建决策树。
1 a; \) Z0 N8 q- **流程**:0 g, j6 m. g4 m- Z7 Q9 b% y
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
# T' t- {2 Y2 \3 {; J. f- p  - 计算所有特征列的基尼指数,找到最优特征及其值。* x  K% s* N5 N3 y( M/ H
  - 如果最小基尼指数等于 1,则返回标签。1 s% v" Z% P: W; s# S% q
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
6 o( Q! o  _9 b( f' o& ?' R  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。" e# q- I5 [! D1 g4 u  l& [: R

! `: {3 o: p' `8 ?' y. [$ Q# s* w#### 5. **方法 `train`**$ C1 X  _% e7 p* v& h
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
/ _/ d& G( Y; U: k- **作用**: 结果存储在 `self.train_result` 属性中。
( s$ }2 O( |" t) d) }! Q1 z* l: G& d2 i" u
#### 6. **方法 `prediction`**
/ F# f# M  D9 s4 Y" Q- **参数**:
- I- k/ S3 [) G. e& d  - `Mat`: 待预测的特征矩阵。) j/ j4 \, k. g# G8 C# c
- **功能**: 根据训练得到的决策树进行分类预测。
) m$ }9 B% w  E1 G' s- **流程**:
* ^7 Q2 N6 p% {' x! ^$ U  - 遍历每个样本,通过树结构进行预测。9 C; ?' }' \7 y8 G
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。( P: ]& m" {- ^2 B6 K
  - 返回每个样本的预测结果。
4 l9 G' ^% t' z3 t3 c4 z6 X! {( Y) o4 q
#### 7. **方法 `isLeaf`**
$ ?: w9 B( h, J- **参数**:
8 _8 h9 g/ P; W% Z& Q. R2 T, K  - `tree`: 当前树的节点。* e+ B6 p! S- F* Z3 F/ s
- **功能**: 判断当前节点是否为叶子节点。6 Y5 S! h4 j0 w2 S; h
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
: m2 ^6 D/ j$ w3 O  |+ X8 O
% b! i# t8 \0 J0 q9 V, J#### 8. **方法 `getLeft` 和 `getRight`**7 Y$ a- j$ g! ?0 @: e, v
- **参数**:$ e/ q# y! |- j4 X' N4 u
  - `tree`: 当前树节点。
- d' N/ s2 O! _' r9 p- **功能**: 分别获取当前节点的左子树和右子树。, K$ M' o2 z, W4 P9 M7 }4 N
- **返回值**: 返回子树。( l# L) D  i! e( o( t8 w7 F2 P
) Z( j' Y$ W% m
### 总结
& X0 L- V0 i8 y/ i6 U6 F该代码实现了一个基本的决策树分类器,主要功能包括:) e# s, G3 `3 U4 I" i' d( V- C) k0 x  v
- 计算数据集的基尼指数。, ?6 \) z6 q+ K! t0 P
- 根据特征和标签构建决策树。$ v2 `; ]' V4 y- q, b
- 利用训练得到的树对新样本进行分类预测。
# R% @+ a, O& G9 J" f" s
8 L; F& s5 h" f; s. b! ~该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
$ a) E1 `1 T- h- ^& t8 Y& s9 j; t9 d) w2 {
" ~" {0 B# q" a2 A' R6 v5 D
0 R  A- p* F8 G- `( |, ]/ _* 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-5-26 00:01 , Processed in 0.348810 second(s), 55 queries .

回顶部