QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
; Q' y& B% J3 j5 o- _
  H  h8 {- }3 e### 类 `tree`
9 v5 c2 I  X2 t2 V: ~
' O0 D$ c/ ^: e5 c这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
& v4 [# o. @( K5 @
0 w& i/ ^8 ?' H, w2 {#### 1. **初始化方法 `__init__`**
: P  ]% R" b" W3 w7 ~1 d$ f3 f) H- **参数**:
) p4 t3 x) ^3 h0 k' Q8 Q  - `feature`: 输入特征数据。3 \0 a9 D% ]# e, y2 N' O) v
  - `label`: 对应的标签(目标值)。) g+ a" ~; J6 l1 I3 }  B% P
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
+ d& _) I  @: n* y; T! z3 k- @" b; o0 O9 y% J
#### 2. **方法 `Gini`**
. a3 e; \0 ?, o3 G+ k$ _- **参数**:
: A) x, |+ b0 j' k( ]  - `dataset`: 一个类别标签数组。7 ~' Q- Q. }" I' D
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。, @8 _4 ~( M8 ]$ x3 T$ u4 P2 Z
- **流程**:0 s- u, E* l/ O2 }. e$ d
  - 首先获取数据集中不同类别(标签)的集合。8 P& X; A- S4 z% B4 Y( Z2 h
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。- ]* H# ~3 ^$ ?2 c( F" e3 c. \8 _
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。/ L* k, T# c9 {* n

: p8 W) `/ U; O2 F  }) E, a. T#### 3. **方法 `cmpgini`*** N' j1 Z" E  L; X
- **参数**:* I. ?& z# [. T
  - `feature`: 当前特征列。2 @( l' k5 i& ^
  - `label`: 对应的标签。
% k$ G, O3 H9 M- d6 v6 Q2 Y+ G- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。3 E' p. W: I2 _0 d
- **流程**:0 c- r7 }9 ]; ]* K* n4 t
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。- w7 }2 i& N- w9 W1 a+ G# s3 }# l1 \
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。& p, _; Y+ i. q2 e
  D, X4 E. _8 X4 i
#### 4. **方法 `maketree`**7 i& T1 C/ W% q
- **参数**:
6 S+ f, ^# S' R, g/ j, z% t  - `feature`: 当前特征数据。4 o5 |- h- m# Z! `
  - `label`: 当前标签数据。8 l/ ]' s4 {% j
- **功能**: 根据特征和标签递归构建决策树。
) O3 W$ k. D. C* A- **流程**:' o1 s7 b2 O# P# @# ^
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
6 I/ Z% a9 D- y* L1 H' @# y! Q# b  - 计算所有特征列的基尼指数,找到最优特征及其值。0 q/ O& R9 Q* H, a  B
  - 如果最小基尼指数等于 1,则返回标签。% d9 Y, x5 a1 r: ]
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。/ n6 e( E1 ?8 S. R  ~7 O8 F
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
! M/ C( S4 A. q/ N& x
3 X* p0 o5 I% u9 {* s#### 5. **方法 `train`**3 D* G7 `8 Y+ c
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。4 ~, j$ Q9 E; J, t' M  l
- **作用**: 结果存储在 `self.train_result` 属性中。( N- q  H  z% f' u- _
; z% y) s8 e, p. C. P, L1 b
#### 6. **方法 `prediction`**. y6 y% w9 v' V+ d  a
- **参数**:
) K# Q. W% e0 `! q7 I, h$ i  - `Mat`: 待预测的特征矩阵。8 {/ `4 X7 @5 M0 @( o- l
- **功能**: 根据训练得到的决策树进行分类预测。. ^7 {, S, Z' }
- **流程**:  d) ^/ M8 ^! T" ~! D* g
  - 遍历每个样本,通过树结构进行预测。
& X& v8 N, C+ z- M% y: S  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
/ q/ w( R2 K. \$ u  - 返回每个样本的预测结果。! O# S  G  l! x/ j' P% J" Y
2 ?8 \" a/ D  b
#### 7. **方法 `isLeaf`**
0 k5 f( c% L& L- **参数**:5 R& M; e2 j" o% p! T/ _
  - `tree`: 当前树的节点。' b" s, K0 u; X8 K7 v1 J
- **功能**: 判断当前节点是否为叶子节点。
5 b% c5 Y& I$ M; r) A- **返回值**: 如果是叶子节点返回 True,否则返回 False。
# I# I7 S  c) R" D* I. l( K7 X% S. @( K2 s' q& {- F: W: M- S: w
#### 8. **方法 `getLeft` 和 `getRight`**
1 o9 ^8 z# y# c' a( y- **参数**:$ E, i- B& A( {; s3 W$ n; y
  - `tree`: 当前树节点。
* _2 b5 A  c1 i0 T3 E- **功能**: 分别获取当前节点的左子树和右子树。6 }, K5 k3 i6 }8 B- T
- **返回值**: 返回子树。* O* h9 d8 k! y+ W$ A9 k& o2 t

& o# m* T& X* ]" B& g7 V: l! [1 h* q### 总结
. z6 |" k. N, x3 O1 `该代码实现了一个基本的决策树分类器,主要功能包括:. {8 b- b( m* ?2 |# W3 I
- 计算数据集的基尼指数。( K+ o0 Y- G. K
- 根据特征和标签构建决策树。& K! Z3 |, i* C5 s. P0 b
- 利用训练得到的树对新样本进行分类预测。
5 s4 t) r3 o! x5 |7 a( s) o2 x6 T9 M$ w( {) ^- t5 R% O0 c
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。4 y' I5 ^* U& e+ ?" i0 ?( J
7 u1 b9 X+ y7 s2 d% l
0 j: r) y0 J# x2 P( R6 d* L  R
* M% m$ l" ?) N: A% C: t1 Q

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-6-16 13:27 , Processed in 0.554530 second(s), 55 queries .

回顶部