QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。; J8 P, Y( g$ y9 @- o2 o
9 g, R6 I% h3 B! J6 _1 p  O
### 类 `tree`8 W6 V6 H% C$ N- u! r
3 p% P7 m( [& o! e1 s
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
! o5 b) B- v# Q& l$ M# p- h- d0 q8 ^1 L/ h" Y* Z4 L
#### 1. **初始化方法 `__init__`**
* d( M6 c4 R9 }! ~- **参数**:
' ~5 g! e. W/ W$ T- M  a  - `feature`: 输入特征数据。% s9 ?+ J& P7 I' m8 H/ ]8 N  Y
  - `label`: 对应的标签(目标值)。' y- p1 t9 E, T( L1 S
- **功能**: 将特征和标签保存为类的属性,以备后续使用。1 i6 M. d- F0 ~; ^; z
6 k. h6 x* n" X. f. Q
#### 2. **方法 `Gini`**' B: a- u/ l$ Q6 t1 l/ `
- **参数**:
" ?) |  @9 X5 l9 I" J: ]  - `dataset`: 一个类别标签数组。4 l5 b0 D) A+ T  b. {% ]+ l5 O
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。3 ~1 P$ H) S2 `0 K: P
- **流程**:- S) B- O; `& G7 u
  - 首先获取数据集中不同类别(标签)的集合。0 B% \% i# h$ B' u
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
& \  y  s, h  B  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。* Z: x3 _) V( E' T" ^. N1 M

4 B9 v3 K, T% F, p/ |7 i6 f. D#### 3. **方法 `cmpgini`**
, Y* O- L6 i! b! H+ _- **参数**:
. k) B! o$ ]3 k2 L$ a* p  - `feature`: 当前特征列。
, M) q" c; d% a6 b/ @9 w  - `label`: 对应的标签。5 F) Z. Q  F3 z! Q
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。2 K) Y" A4 ?$ c# F8 s
- **流程**:+ _- Q; a& r% z3 f
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。5 B$ i& w8 t# @" Z/ l
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
4 q8 q' R$ N4 C/ t. R8 u( H3 q8 L; A* S  h
#### 4. **方法 `maketree`**. f/ D- Z- t$ F% Z, {
- **参数**:
. T. K( O/ L: k  - `feature`: 当前特征数据。6 B4 m3 }* N0 z. Y* ~1 E5 d
  - `label`: 当前标签数据。
% O& [: V7 Z, P+ P- **功能**: 根据特征和标签递归构建决策树。% D  @: P. s' F6 r. U3 [5 W- c1 ?( \
- **流程**:/ j& O' h) H2 L# M
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。$ d$ R$ i6 N. ~0 v( g
  - 计算所有特征列的基尼指数,找到最优特征及其值。
" D9 j: A; w0 j; D8 K  - 如果最小基尼指数等于 1,则返回标签。* }: Q; n; f' G6 E$ Q5 C
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。4 H7 Z( c. Z& o5 L' B
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。; E9 |2 G4 @$ `" u# s

$ B- E! _! m/ V$ P* o. B#### 5. **方法 `train`**7 E8 t7 X/ F* a7 A
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
+ V- O# m0 t$ o- **作用**: 结果存储在 `self.train_result` 属性中。
% k9 [0 o: A! _  J* ~% f4 L7 t) G% R9 w( w* c6 Q
#### 6. **方法 `prediction`*** t1 N/ W" i) B# {- \0 h" X' `" Y
- **参数**:. g% E1 Q! M1 ^' p- p" `- Z+ F
  - `Mat`: 待预测的特征矩阵。0 T3 X! c, j* t; {0 a1 r$ B! q
- **功能**: 根据训练得到的决策树进行分类预测。
  j" Z2 o6 a' ^& t- **流程**:
% D& x) V8 J( V/ Z( G! `  j  - 遍历每个样本,通过树结构进行预测。
4 S) V. U1 V6 Y( {( g5 P5 [/ ~  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
& m7 V- h% {% m  ^  - 返回每个样本的预测结果。9 e" [+ H2 F$ T$ P0 F" D' O9 G' ^

) ~  X# [; z5 i! F6 G3 w$ M: j: [# ^#### 7. **方法 `isLeaf`**4 q$ F0 i# d. K) \$ A
- **参数**:& u9 k* ]& w7 B  v
  - `tree`: 当前树的节点。- f8 y- k; @; F9 |2 h4 F( I1 e; w
- **功能**: 判断当前节点是否为叶子节点。+ c# T0 p7 E) P: L
- **返回值**: 如果是叶子节点返回 True,否则返回 False。) n8 B4 }$ B7 n! W: N0 N6 B4 Y! p
& l* T6 @# K: b3 ^% o+ g
#### 8. **方法 `getLeft` 和 `getRight`**6 b2 A" y# [9 t6 e' M: M+ I
- **参数**:
$ w. @( `1 ^- N9 Z4 p  \. P$ _  - `tree`: 当前树节点。
; H8 j% W5 X$ @, q" p- **功能**: 分别获取当前节点的左子树和右子树。- U) a" a* X# q) s8 ^; _+ N
- **返回值**: 返回子树。- A* }4 I  A' \0 x6 G1 S, _

+ B1 f# Y/ O) \3 y; \4 R+ k### 总结8 @2 I3 b* ^+ y! x
该代码实现了一个基本的决策树分类器,主要功能包括:: a, |& @6 G. g, @6 z
- 计算数据集的基尼指数。5 y/ `1 ]4 E7 U! o
- 根据特征和标签构建决策树。
5 ?1 X% }, a% ?- s! Q9 w' K- 利用训练得到的树对新样本进行分类预测。
" x7 ~+ P0 l( B. y1 t
$ P: d3 `9 B/ F该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
8 e& C- X! j5 B2 g3 S4 H4 r- w; e! Q$ V# _
, n) U' B$ H7 R- z
" }. @7 x. \0 R/ B: E, x

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-4-16 06:40 , Processed in 0.465872 second(s), 55 queries .

回顶部