QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
0 @) U; X6 o$ y3 l2 u9 r0 L# }- |' t8 j
### 类 `tree`
8 l7 F1 ]" A( y, q) k/ {2 G# j7 ]8 `' q
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
2 c0 b7 i" t1 R7 m, i1 D
" a& E$ `$ B9 X- R8 g! x* E0 a#### 1. **初始化方法 `__init__`**; X+ I7 L9 W- K. s
- **参数**:# u/ z/ r  ^# L$ O0 b5 H
  - `feature`: 输入特征数据。3 j- b0 y) M  L! v
  - `label`: 对应的标签(目标值)。
: O# Q+ {0 z9 J- **功能**: 将特征和标签保存为类的属性,以备后续使用。% G7 c6 m9 j* ], H! ]/ c1 G8 P
! B9 G2 H2 T% S
#### 2. **方法 `Gini`**
8 D* H2 P' B" Y* e/ n9 i+ w9 t& P- **参数**:
/ W9 u3 H5 L% q6 m8 {  - `dataset`: 一个类别标签数组。' t& x! M. X/ f# e* l. h
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。: J3 ?! z. Q# G2 s/ Z3 P
- **流程**:
; D1 g' W& x! y( W  Q/ l( ^. f  - 首先获取数据集中不同类别(标签)的集合。- i. n- K& W2 _. J
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。' U: h) B$ W# E9 ?/ k' N6 X
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。* G- Y- ]7 K7 i  F
. k! e) }# L5 E  e& n; t2 l
#### 3. **方法 `cmpgini`**. h# ~+ w, E; Z- @1 ?
- **参数**:) L  f4 M! `/ w; y/ d
  - `feature`: 当前特征列。
9 P) V% \/ I7 ~9 O  - `label`: 对应的标签。% D, T% P. k4 |7 e" m& E% t
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。9 v5 l5 V- w* H/ W  d
- **流程**:
! K" ?- o) m* b( f6 {  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
' C$ \2 \' G# t; l  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
  h5 n7 w( a2 [* [$ |7 y& U5 V3 I1 ^5 y. d8 v
#### 4. **方法 `maketree`**
6 g5 B, I3 W3 o- O- **参数**:
) M" w( U, g- D8 d6 Y  - `feature`: 当前特征数据。3 P) V  Q% \2 k, [
  - `label`: 当前标签数据。
7 e: p* S  @; Q. E- **功能**: 根据特征和标签递归构建决策树。
& Z: J; D- o% W* e0 W2 }$ H: a- **流程**:
! [+ M. ?3 o! l" H) b4 t  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
3 t% {/ ^  ~8 w" @4 {3 q$ O3 J  - 计算所有特征列的基尼指数,找到最优特征及其值。, \& Y# I3 h. i7 I, t  R
  - 如果最小基尼指数等于 1,则返回标签。: P5 k* Z; u+ e' C: i' m
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。$ c3 S$ J/ u7 s& R9 ~
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
* t9 K- j4 _% t. E# {6 C5 }" L/ o
8 ?8 m; E3 e, R; a: g#### 5. **方法 `train`**$ F3 i' ^+ S( v
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。. B* C1 I$ g, X" O/ L
- **作用**: 结果存储在 `self.train_result` 属性中。) R+ z) n; U( \* C& a2 d
$ {% G% z9 h9 ^8 t
#### 6. **方法 `prediction`**
$ w5 ?0 W, |; B, [* X( J- **参数**:- B! x- L, A) F! l  G! m" ?
  - `Mat`: 待预测的特征矩阵。
& B% q, j: |3 y( n  |2 D& h$ C- **功能**: 根据训练得到的决策树进行分类预测。
4 k4 ?. p* H+ f  k! D- **流程**:
, X# W) p$ R+ z  - 遍历每个样本,通过树结构进行预测。
7 {2 B' ~$ L# g5 ~$ G  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。8 e9 H, t# w+ g! w  n
  - 返回每个样本的预测结果。
& u9 P! e9 d/ l) U
: ^  `/ s5 k0 V4 F#### 7. **方法 `isLeaf`**
4 M/ {+ Z& |0 F, ?+ c/ N- **参数**:. F/ F  Y4 g$ v- s/ K
  - `tree`: 当前树的节点。) M  ^; N) E: c5 f- b: @& r& y; {
- **功能**: 判断当前节点是否为叶子节点。
  h( G9 X) a* x7 d3 K0 ^$ D- **返回值**: 如果是叶子节点返回 True,否则返回 False。
+ }5 f. u* H) R) q$ d8 Q2 e; U0 w
#### 8. **方法 `getLeft` 和 `getRight`**8 B0 k+ l( n% b" y7 p0 L) u
- **参数**:
& o( N0 d/ J2 l* P  - `tree`: 当前树节点。
5 l3 ]  v0 f. X8 U- **功能**: 分别获取当前节点的左子树和右子树。7 S: m1 h2 j3 x3 t. q) C' P% |
- **返回值**: 返回子树。5 T) L8 g3 a; |+ @; k0 J" a

; }  O3 M+ Y) C  q& f### 总结
. b2 n9 S' R* K该代码实现了一个基本的决策树分类器,主要功能包括:
1 I9 P2 L. G- [- 计算数据集的基尼指数。
( h6 e# a% p% n1 V0 }7 N" a- 根据特征和标签构建决策树。& C) a" Z$ D. g7 U2 Y
- 利用训练得到的树对新样本进行分类预测。
1 j' y9 j/ A/ z0 o! F
7 `; D3 G# J5 P5 v7 n- k4 Z该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
  y. n: q+ F# M5 I4 @% g& ]% E
- `# Q, O" K7 S" J7 ?: y4 X, m
5 ^0 ?& R: a; U! N+ [2 @# a0 j1 K
% E( {6 A) u6 L: c6 Z

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 04:52 , Processed in 0.519917 second(s), 55 queries .

回顶部