QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。( M& o0 c. W0 J0 n* H

0 }5 C) M+ d( a; |; S- ?  ^4 |### 类 `tree`9 \* x) N' i4 U) a1 b) [

! @1 a- |* u, \$ A) W这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。, x! i& i0 r3 c

  B& e7 P5 X2 H  j" \& g) O8 q#### 1. **初始化方法 `__init__`**/ F' `9 K! R% h  i0 g7 h5 X2 r
- **参数**:) e  {! d6 Y, B$ h! e3 Q
  - `feature`: 输入特征数据。. |9 F  V5 y# m' ^" g4 z& S6 ^
  - `label`: 对应的标签(目标值)。
$ V' U2 h8 E: d; u: _/ c0 f/ N- m- **功能**: 将特征和标签保存为类的属性,以备后续使用。2 C! o) o  G7 S, r
1 i! V+ s9 E  r: p3 x
#### 2. **方法 `Gini`**
* V1 G* h+ ?* u- **参数**:
3 H' ?. W/ K0 U* f* `  - `dataset`: 一个类别标签数组。
1 x) O; @2 [) x1 \- **功能**: 计算给定数据集的基尼指数(Gini impurity)。4 P+ d5 g6 s8 V' t& T
- **流程**:) R/ F4 y8 y( x: a
  - 首先获取数据集中不同类别(标签)的集合。
, u( R  c! q1 }. |" Q" b1 k  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。' ^1 T* B' x  y# `' H4 s
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。; j5 \% H8 r( u/ M" B$ k5 |
8 j9 P7 Z9 I& O0 K8 a4 E2 j; B
#### 3. **方法 `cmpgini`**; m8 t7 [6 L; k  ]- I9 `
- **参数**:8 @& y! e' @" z* G
  - `feature`: 当前特征列。
2 Q" z7 n; @& R- @) Z$ \  - `label`: 对应的标签。# p% S6 |6 a- j! }  X/ R. q- L% T
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。/ v; R9 p0 j. T$ ^* X& d
- **流程**:
6 V. A1 g3 l" c6 l8 l) r! ~  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。9 U/ |1 O  _4 q! R7 T  W
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
5 L0 a& E3 n0 h* H! U, t% n$ S) [2 m4 l2 U: M& f8 K8 q7 F
#### 4. **方法 `maketree`**
. }9 r' Y5 K' J0 I; V8 ]- **参数**:
3 {$ P2 b! b* i# D. O  - `feature`: 当前特征数据。7 t. O. y9 M1 _* |. [& f% s
  - `label`: 当前标签数据。
* r. y/ c, ?+ X) Y. L5 k( H- K- **功能**: 根据特征和标签递归构建决策树。  B2 l3 w/ \: |) {4 ]2 _+ B4 B
- **流程**:
' q: h: O" o+ e' h% [8 s- C6 `3 K  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。" P7 f) A5 a9 s9 }! W
  - 计算所有特征列的基尼指数,找到最优特征及其值。( l$ B( p# {1 P+ ]+ d
  - 如果最小基尼指数等于 1,则返回标签。8 |# j/ o1 |# u: H
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。' f2 P' ~( Z) C) r
  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。4 O9 L- G% x( c0 \6 h: t: E

& W' e; Y) j- |5 Y- N# P#### 5. **方法 `train`**
! T% |( H  E6 f( b( q0 j- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。. _6 A  o& x* z* m7 Y
- **作用**: 结果存储在 `self.train_result` 属性中。
* c$ N5 U& K; d
( O* c) a0 Q' G6 f& I2 s#### 6. **方法 `prediction`**
5 c5 L3 R0 b5 @; R$ [$ h- c7 O8 l  U- **参数**:+ G1 l; {. A/ U$ m# D% F5 l
  - `Mat`: 待预测的特征矩阵。
3 j+ S7 C" W" Y* f4 Q  @+ ^$ b- **功能**: 根据训练得到的决策树进行分类预测。
* C  s; H$ d# f7 d+ e. ^1 g+ e; A- **流程**:; L4 m9 S- y8 C
  - 遍历每个样本,通过树结构进行预测。1 S) a2 Q5 J* h! m4 A9 O
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。; \  H* W# N: j9 m$ F
  - 返回每个样本的预测结果。
  B+ ]! `( B) V/ m8 C: S
2 x: _7 {, k' N% T$ h1 Q#### 7. **方法 `isLeaf`**& r& Y1 u0 M! Q
- **参数**:" G; ?  s$ b. M5 M/ b
  - `tree`: 当前树的节点。
3 V7 Y9 q; W" W- **功能**: 判断当前节点是否为叶子节点。, {- L  q  C- `
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
% v& R' E: o8 @* }0 G) o4 V- J9 l1 c- |$ g. R. L- w
#### 8. **方法 `getLeft` 和 `getRight`**
9 S% D3 b, u& k4 ^  @. Y! [- **参数**:9 y* e; b/ U/ A- t- ~' n: c( g1 ?
  - `tree`: 当前树节点。! G( T8 C0 N" A. s
- **功能**: 分别获取当前节点的左子树和右子树。- o: B% c' I& a4 [% _  _6 l
- **返回值**: 返回子树。
5 y! W8 [. M/ N* v. j0 Z) d  v, {/ r' n
### 总结1 m* I; _  s4 z5 L6 y4 j! n0 O- z
该代码实现了一个基本的决策树分类器,主要功能包括:5 O/ u; N  t7 {+ A7 K/ n
- 计算数据集的基尼指数。! k% f5 ^. v  T, n
- 根据特征和标签构建决策树。$ R* H% `& l3 h0 d! Y( W* |$ I" J$ r
- 利用训练得到的树对新样本进行分类预测。
" d$ v7 T+ \- ?' A! m/ v$ j/ r) C
7 c" s$ ~5 b0 \5 _& S1 ?! S- k0 Y该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
- [& b0 [0 G6 B3 H( f; z' |' a8 _3 A* U
2 i4 Q# L, H9 n9 y
8 L: T; V8 F! \( \( m" w: J" L0 O

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

回顶部