QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-8-9 11:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码实现了一个基本的决策树分类器,下面对代码进行详细解析。
7 }" L1 ^0 ?3 y1 ^) i% C2 C  u. k
+ J' `# _. c9 c( m### 类 `tree`* ]: H6 Q; t& S
2 u' ?& J, W& u. @+ x  h* O+ E
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
) B# z: I, ?: G* n- Q# V
! C* E6 E0 d: T  p4 f' Y#### 1. **初始化方法 `__init__`**) W7 ?: ?+ r& M! P
- **参数**:. D* b* w7 G& E, M& r
  - `feature`: 输入特征数据。+ e) I8 H) j9 T  k
  - `label`: 对应的标签(目标值)。; L- Z2 u, i+ `& j" G
- **功能**: 将特征和标签保存为类的属性,以备后续使用。
. q  e% v( Q- C* D
8 y1 v- f0 s8 `! K" }& C#### 2. **方法 `Gini`**
3 @- b! ]( U3 @4 p. `- **参数**:0 j) {6 z# b% w% i/ U. x3 k/ C
  - `dataset`: 一个类别标签数组。
& _  p3 N* m* U9 X- **功能**: 计算给定数据集的基尼指数(Gini impurity)。
" ~% y  }2 `7 ^9 H( B8 s- **流程**:
" P' F9 c( L" F1 o3 g6 B  - 首先获取数据集中不同类别(标签)的集合。
8 u- J5 }( R* ]: D4 V$ |% ~  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
- h3 k2 u8 u9 J4 ], M% }# ?  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
7 F- I1 ]5 T1 y; {8 V, |; V& _" K6 u- t
#### 3. **方法 `cmpgini`**4 Y9 P! P6 Z. S% U' p6 F) V
- **参数**:
6 U* X$ c3 h6 @  - `feature`: 当前特征列。
2 x! d7 G, x  e# ~  - `label`: 对应的标签。
$ k& `! j+ ^1 U* s- G: P0 L- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
# l4 ?' o: V2 E$ w- `- **流程**:- J" u2 N' h; |1 A, ^3 h
  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
, ?5 C3 d3 T5 s( A8 W- I! |. Q" v, W/ R0 D  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。# g1 e6 q! ]3 b+ V" i! ~! C
/ U) y* `$ @1 M" y* g" ?
#### 4. **方法 `maketree`**
9 K% Q; r5 n3 H+ S4 f* |- **参数**:
+ x2 f" g8 I0 Y  - `feature`: 当前特征数据。$ l" b: l% M% `7 ^/ e
  - `label`: 当前标签数据。
1 ~! S8 q' c$ s6 p3 a$ @1 Q' \  b- **功能**: 根据特征和标签递归构建决策树。" Y& e* n8 n# u4 T2 q
- **流程**:
$ D9 j6 c, ^4 [2 n4 ]  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。* ~. k. p$ X3 R& E& G
  - 计算所有特征列的基尼指数,找到最优特征及其值。: A' F2 p9 m5 f  b3 A' U
  - 如果最小基尼指数等于 1,则返回标签。0 [2 U% Y/ e6 m
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
6 B4 X3 N+ T+ l. _1 Y8 G  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
2 J( j5 H8 p- G
! b' [  `( u9 ]& X* @4 X8 T1 d#### 5. **方法 `train`**
& I" J/ o# O% e- W: k- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。
" q) I0 |  C; W2 k" U3 Z- n2 N- **作用**: 结果存储在 `self.train_result` 属性中。# U8 y( a* i3 S6 l

( g% g4 p) G  t5 I4 x#### 6. **方法 `prediction`**
8 K2 N. ~( ?! Q- **参数**:
% S9 Y% N0 l6 e# ]" w# `  - `Mat`: 待预测的特征矩阵。
( T9 e% j; D$ U7 f. H: f1 E* c5 v- **功能**: 根据训练得到的决策树进行分类预测。5 \6 P# t: f2 o, F
- **流程**:5 r3 M6 [$ r& v2 S- x- c
  - 遍历每个样本,通过树结构进行预测。
5 R+ X1 q( O* g  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
: s# V7 Y+ d" m! [% a6 c  - 返回每个样本的预测结果。
- p# r: B% N7 h* ^4 _2 ?' O" J( ~9 t" Z$ D* M/ E. F. F  [
#### 7. **方法 `isLeaf`**
/ L" x$ R; W6 R( n6 v- **参数**:6 B& w' a" _0 v" M+ E
  - `tree`: 当前树的节点。, j7 \. x2 Q7 P4 ^6 P2 t- z! S
- **功能**: 判断当前节点是否为叶子节点。
3 D! w- E4 x( J, D5 H; }5 m) X- **返回值**: 如果是叶子节点返回 True,否则返回 False。. }. n; I% Y' _

( g% D: e( m* d4 i% S; J4 `#### 8. **方法 `getLeft` 和 `getRight`**
! s3 A. L) |+ g% s2 i: q- **参数**:' H8 r) ]* ^9 w# t
  - `tree`: 当前树节点。
  }+ {5 q) a% S) \& c& {- ~0 M- **功能**: 分别获取当前节点的左子树和右子树。
' H2 v  Y$ k# y/ I1 O- **返回值**: 返回子树。
0 N+ ?0 a$ ~$ @$ N+ G- D2 E
6 d3 p* {: Z3 v6 |( t! w; U### 总结
) G  d0 J# ~5 p  U6 I该代码实现了一个基本的决策树分类器,主要功能包括:
4 u( a" v# ^9 e( {0 T- 计算数据集的基尼指数。
$ Y+ C+ j; [# V1 y  r2 q- 根据特征和标签构建决策树。1 g* ?3 j( h  ^9 |# A& U
- 利用训练得到的树对新样本进行分类预测。
0 W1 Q5 H; B5 N6 m+ I
2 Y' t* A5 u+ @: j7 u  I该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
5 k0 m) o/ L, V( n' n% ?
- s% n$ K% [) y7 N4 f3 I' X. ^; E* Q3 a6 |3 |& Y

$ ?9 T. f8 I/ ^( [3 z8 s% F

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-10-12 05:20 , Processed in 0.489091 second(s), 59 queries .

回顶部