数学建模社区-数学中国

标题: 决策树分类器简单实现 [打印本页]

作者: 2744557306    时间: 2024-8-9 11:18
标题: 决策树分类器简单实现
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。9 [: f; F  p6 w0 e& }' r0 O0 P

  H, y$ T- p8 ^9 N: d### 类 `tree`: {2 L% U. d0 H  U2 S5 h
/ _, @: I% ]' \3 w2 `$ N3 t
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
& C! b4 r4 V+ {- O: K9 E
& f0 @: w% `7 k6 ~#### 1. **初始化方法 `__init__`**+ d0 P1 H8 J2 e# c
- **参数**:
! a5 E2 ~# f5 V- W% P( B" K$ V  - `feature`: 输入特征数据。
; k: C6 _: i" C4 V5 t% A& a  - `label`: 对应的标签(目标值)。9 c2 I( G* a8 w! i: @7 n
- **功能**: 将特征和标签保存为类的属性,以备后续使用。( F" a) V7 j' N" l! a
# I1 x5 z: J. `
#### 2. **方法 `Gini`**- l" ^4 u6 b+ u* o3 ]4 u, w5 n0 T
- **参数**:; ]# F1 U" k, u: c4 O, O% K- I* ?
  - `dataset`: 一个类别标签数组。  Q1 S& p* U2 h0 C& W
- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
* z7 L2 W1 y) `! J& E  X- **流程**:
6 f6 \: Q2 N: Y& {3 T  - 首先获取数据集中不同类别(标签)的集合。
$ J1 ^! \, O/ ~, K# B  I, X3 ]/ G- L  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。2 T8 |* u5 o8 v- l; f( b
  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。/ T2 @8 R; w0 u- A
8 o" o* U+ @; o( D  _; n2 H
#### 3. **方法 `cmpgini`**" o/ \2 }4 K7 D- s
- **参数**:+ g* V; x  Q% y
  - `feature`: 当前特征列。2 t9 j$ }* U+ j  W# ~
  - `label`: 对应的标签。
$ X5 a& m' I; ?) C- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
' g4 d. U) |0 w- **流程**:( l; ]9 N/ a; k
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
) n5 M2 x( d; `4 K  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。7 ~8 b0 w- d) {+ `! W: ^2 E

' h7 d) U( J. m#### 4. **方法 `maketree`**0 `' K3 u* c# `4 ~) e; p
- **参数**:
& z" U% Y: D+ j0 m0 T  - `feature`: 当前特征数据。; I( [, o9 j9 P4 p1 s& \# c5 L
  - `label`: 当前标签数据。/ P  ]0 ^1 n) M! I  j3 _
- **功能**: 根据特征和标签递归构建决策树。
# P" C- Q1 H  B/ P9 ]2 K- C; I- **流程**:
0 ?* Y2 V4 I/ W# y, J  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。
9 H  t& ?* R/ Q$ n  - 计算所有特征列的基尼指数,找到最优特征及其值。
7 ?5 S* L! A0 g6 G  B3 @6 g1 n  - 如果最小基尼指数等于 1,则返回标签。7 a9 Q, c9 J5 K3 c3 \
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
' o  I; h! i. A1 |4 Z- S! I  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
" C% R& n  Z6 z5 a$ z2 x' r0 l) w/ o9 d' e$ k
#### 5. **方法 `train`**- S. x5 g0 \8 P* p6 N
- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。' O2 O8 {$ q0 b) d# f
- **作用**: 结果存储在 `self.train_result` 属性中。& ?( b- h  W! W/ }

3 t& A& D- \" P#### 6. **方法 `prediction`**
0 j) M+ q# h7 h- S2 d4 c/ Z- **参数**:8 v) g0 c2 q  }4 \! W
  - `Mat`: 待预测的特征矩阵。
4 ~2 K% \  r' ]2 E& k! f6 E- **功能**: 根据训练得到的决策树进行分类预测。% V+ h' j$ I% K2 J* z# u0 b
- **流程**:
& y/ z6 y( ^# G6 m; U  - 遍历每个样本,通过树结构进行预测。; I- c9 H! ^* k) N' B6 z6 t
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。, {7 }3 |" [8 c
  - 返回每个样本的预测结果。. O7 F3 ?  q7 ]- k- [6 a8 e1 Q
3 C$ w8 ?% n' l2 I6 r/ n9 v( W
#### 7. **方法 `isLeaf`**
8 @: K1 ?' x3 ?) O  w8 v- **参数**:
. @  y) e+ Y2 ]/ l  - `tree`: 当前树的节点。
; _2 `2 P# p- n; B( R$ M2 i! {4 q' w, n- **功能**: 判断当前节点是否为叶子节点。3 w, O% `6 v/ r: g
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
" f0 o2 d. V9 K: b& s/ ~! i' c' ], H# n! w! {  C/ p6 ^7 b9 J6 w
#### 8. **方法 `getLeft` 和 `getRight`*** F  s2 b3 W  C7 i( ^( X, X* u
- **参数**:
  T* f' m  s" H' a; k- O) k4 e  - `tree`: 当前树节点。
' S" s' ~4 p; ]  k% n: e- **功能**: 分别获取当前节点的左子树和右子树。
3 M& Q# M+ Y: G+ U5 i- **返回值**: 返回子树。
9 W  C8 v8 V/ N* m- |% H6 M3 g% C
### 总结
, A' n; b4 K+ @' e2 ]/ W该代码实现了一个基本的决策树分类器,主要功能包括:
# m& I' [5 ~" q  Z- 计算数据集的基尼指数。0 I7 p0 {) L' {8 d7 V0 l# O/ c
- 根据特征和标签构建决策树。
* Y( d/ ~7 t- r2 h# Y- 利用训练得到的树对新样本进行分类预测。: b4 r7 L5 L/ l
, S% d# I: y" W7 J
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
! v8 L0 H4 q  j
% Y* H) e, U. c* X4 E$ h, T, H8 {/ b" ^2 n" G7 X, R# o9 S. d% q
. g7 K/ t9 P' `' Z& k4 [# w, _5 |

test.py

1018 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

cart_Classification_tree.py

2.85 KB, 下载次数: 0, 下载积分: 体力 -2 点






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5