QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1186

主题

4

听众

2923

积分

该用户从未签到

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

( K' P8 [; R( C3 n6 a### 类 `tree`
, Z" D% N- Y: k& X1 [5 l3 D
1 f5 y5 R: c! }# V) y7 f这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。4 a1 e6 \( X8 L' H* S& c% {6 h
& p  d7 Y' P) M$ Y' a% y8 z
#### 1. **初始化方法 `__init__`**
' s' n' G, P# v8 L( s- **参数**:) @& J- C# a' m) V
  - `feature`: 输入特征数据。
2 `% T7 ?' b: k) c  - `label`: 对应的标签(目标值)。- ~% i! ?% N2 S0 M, O
- **功能**: 将特征和标签保存为类的属性,以备后续使用。( b4 o# U* }6 A) k7 O
! a7 D8 P; q* q4 _
#### 2. **方法 `Gini`**/ W; j# g# f( h( P
- **参数**:
$ u' N1 R& u8 [( Z  - `dataset`: 一个类别标签数组。
; d+ O1 _" p0 X0 W- **功能**: 计算给定数据集的基尼指数(Gini impurity)。2 B  f* N8 w4 B6 ], u
- **流程**:  I& \: K  V! j4 t$ E
  - 首先获取数据集中不同类别(标签)的集合。$ N) j/ X* n" U( G/ X, J2 t
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
$ G  }/ }+ a& g% a& W  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
& }7 j" b' N1 B# Y3 a( W7 R
3 @( H9 f5 e  ?/ k2 A2 d& u* p#### 3. **方法 `cmpgini`**, j' n, g0 W% Y1 U4 l
- **参数**:( K7 i. t/ V# E) `( W5 r3 r& l
  - `feature`: 当前特征列。+ j, b7 G% x" \" p5 Y+ n
  - `label`: 对应的标签。+ s6 f' d( v. m4 U) X- T- z
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。0 Y+ J% D& B! Z0 t8 D
- **流程**:
8 l' }, X( E/ ]  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。
* {$ n- B) K$ C; g6 i# @: u2 p2 {0 R  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
$ j! G3 O) |. }; n
# b) F% F, ^: b  i#### 4. **方法 `maketree`**! s4 x, g* \4 f, y# c0 x
- **参数**:4 ]  @7 a" U/ {# X4 F
  - `feature`: 当前特征数据。* {) A( n0 h# Q8 E# x. N# D
  - `label`: 当前标签数据。
% f3 ^# @' W: D, n3 _* k- **功能**: 根据特征和标签递归构建决策树。
+ R0 a+ I1 O4 m8 F6 i- **流程**:
  j/ ]: z& X; R6 B( G( K  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。% u. H  P! k7 z6 H4 S4 x
  - 计算所有特征列的基尼指数,找到最优特征及其值。
" t1 D6 i' D7 y  - 如果最小基尼指数等于 1,则返回标签。4 q" z8 }( @6 O% I  g0 ?' O
  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
. P: R5 L3 j6 P. d  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
! ~3 r( s8 b! r& `9 W; e& m% L, r0 P: j
#### 5. **方法 `train`**
( u: b* I5 B2 F  g# I- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。( I3 w8 y6 A4 z
- **作用**: 结果存储在 `self.train_result` 属性中。% _! D9 d. k& f" B3 ^
# F8 I' o, R! M5 ?4 C3 Z
#### 6. **方法 `prediction`**
) g* q" F! `( |0 S- ?0 s  p  Q1 a" u+ P- **参数**:' B. {% p& C) c4 h
  - `Mat`: 待预测的特征矩阵。
/ T- q0 |( g! @! `- **功能**: 根据训练得到的决策树进行分类预测。
% T* d- ?) O% q% g% t$ h1 ?' z- **流程**:# q9 j, b2 w2 n" [( H, `# c
  - 遍历每个样本,通过树结构进行预测。" @& T, M2 L  R! Y( s
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
3 q9 w5 w7 \0 S- T- r5 B* E4 D  - 返回每个样本的预测结果。
* h3 y( V$ H: l% ^% l
9 z4 I' a, W  H; e, f0 D% V, X6 @#### 7. **方法 `isLeaf`**, J9 `, C8 S% X* u' t
- **参数**:
8 ]6 B, ~9 ^! {* Q  - `tree`: 当前树的节点。: R! `, p+ d) h4 @2 H( M
- **功能**: 判断当前节点是否为叶子节点。# H) b' |2 K3 m! |$ S" Y5 o" e: s
- **返回值**: 如果是叶子节点返回 True,否则返回 False。
' S; G* A9 a3 W6 ~/ t3 b3 q2 h) J/ U+ |( G) Z
#### 8. **方法 `getLeft` 和 `getRight`**
+ t1 Y" q  `  }3 @( F. N- **参数**:
# w, a! b2 R# Q) ]  - `tree`: 当前树节点。  O1 Z. z* s  \
- **功能**: 分别获取当前节点的左子树和右子树。( d* r/ q" S  O% G1 H/ f
- **返回值**: 返回子树。8 I1 c  i; [: i8 ]5 M
8 f7 u! ~( s( M3 {  J
### 总结! {: [3 u9 F6 e
该代码实现了一个基本的决策树分类器,主要功能包括:9 G) S3 N, [5 x- M5 m; s7 |
- 计算数据集的基尼指数。( W8 f2 k: c" M$ {# l
- 根据特征和标签构建决策树。4 Q4 c: E3 A9 J( |$ u' ?
- 利用训练得到的树对新样本进行分类预测。- P! ?2 f6 ~5 D+ @6 _$ h
- d+ Q8 @" S- A
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
) {$ a: ~# H$ k7 X+ d8 A2 `0 V& S6 A' Z5 t1 k

( A2 s/ e9 Q, U9 t- D$ T6 G2 r/ E

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-21 21:53 , Processed in 0.309319 second(s), 54 queries .

回顶部