QQ登录

只需要一步,快速开始

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

决策树分类器简单实现

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

1189

主题

4

听众

2934

积分

该用户从未签到

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

; m- k7 r" p+ q2 H### 类 `tree`* A, e9 z) m" t
) n% F- K$ J  R) {9 i2 |" M$ d) W
这个类包含了决策树的基本功能,包括计算基尼指数、构建树、训练和预测等。
- a& @3 M* S: m
& N4 L/ ?4 J% q# `3 S) B% U$ c; e#### 1. **初始化方法 `__init__`**
0 @4 C+ a  E  O. E2 L- **参数**:" h7 @0 [# H' p: v) o
  - `feature`: 输入特征数据。: [- J1 _+ Z! k( W9 R
  - `label`: 对应的标签(目标值)。
: w( C$ Q% V: c& ?" R* [' {- **功能**: 将特征和标签保存为类的属性,以备后续使用。
, c2 T$ ^& R2 d. a
. |* b9 B! J! h% c' y+ b#### 2. **方法 `Gini`**7 }% X5 D% q/ v5 {. x) P. {
- **参数**:
& k3 r! b! i8 d: H  M" m  - `dataset`: 一个类别标签数组。
, A$ @, T2 s6 V  A8 X1 j* R% ]8 t- **功能**: 计算给定数据集的基尼指数(Gini impurity)。0 m3 H/ r2 V; X3 o! _
- **流程**:+ E/ m: Z* i% B& {- \2 E
  - 首先获取数据集中不同类别(标签)的集合。: W1 @. a' K9 u7 K7 {
  - 对于每个类别,计算其在数据集中出现的概率,并将其平方后累加。
: O2 [% m; W  G0 j( L" p  - 返回 \(1 - \text{sum}\) 作为基尼指数,值越小表示纯度越高。
% q# W; L. R: e$ E! K4 i! q% B8 C6 `7 |$ p- _( t  k; ]$ t+ R
#### 3. **方法 `cmpgini`**
4 A0 d  l4 C5 P9 }5 e* Y( W- **参数**:/ _2 e/ {# |2 g9 B, ]& z
  - `feature`: 当前特征列。
1 {* L" E& |  A0 U$ d$ q  - `label`: 对应的标签。- d# F6 B. R& @% q8 a" Q
- **功能**: 计算当前特征对标签的基尼划分,选择出可以最小化基尼指数的特征值。
) i, N* g8 Q  F. N4 r4 i; J- **流程**:
$ g6 U0 f& \) H- b9 c  u' y' q; |  - 遍历特征列中的唯一值,计算每个特征值的基尼指数。2 b; F7 ]) q" E3 A8 l% G
  - 根据特征值划分数据集,计算各自的基尼指数并加权求和,找到最小的基尼,加上特征对应的值返回。
0 \& Z2 p8 [( G5 Z3 o# A& [2 l8 p9 I3 i
#### 4. **方法 `maketree`**
6 W/ m$ ]: }* d, x$ i* x' s  \$ G6 d- **参数**:
* _# D- @- u$ Y4 ^& G; t  - `feature`: 当前特征数据。# A  F. x6 D! C7 z' g- Y' i; }. t7 ~. }
  - `label`: 当前标签数据。% y$ Q$ S* ^, V9 N- B
- **功能**: 根据特征和标签递归构建决策树。) H0 F/ F' R! E8 b6 |. G
- **流程**:* ]4 x/ |, b; N* v) h6 s
  - 首先判断当前标签是否单一(即所有标签相同),如果是,返回该标签。" ?" F! s7 S; p/ _( o& ^+ A) d
  - 计算所有特征列的基尼指数,找到最优特征及其值。1 g/ d/ z5 e7 }6 C8 d  A
  - 如果最小基尼指数等于 1,则返回标签。
* ^4 n# J$ H  o$ J$ k  N  - 将数据集按照最优特征值分为左右子集,并递归调用 `maketree`。
- d/ \9 z3 l9 R( h' Q  - 返回树的结构:[(特征索引, 该特征的最优值), 左子树, 右子树]。
, Q' c( l( l+ R
) H$ a4 c1 Y8 `& U6 X0 b#### 5. **方法 `train`**
; z9 p1 |  ^$ L+ q- **功能**: 训练决策树,调用 `maketree` 方法构建树,并保存最终结果。+ [5 ]# ?& l. r
- **作用**: 结果存储在 `self.train_result` 属性中。
* \: S, \% ~4 e2 n# E0 B% V
% Z- [; J* a, l+ ?) O4 T#### 6. **方法 `prediction`**' ^' z5 H- Z4 l0 N+ r5 j
- **参数**:0 P* c. l, D6 f8 q: m/ B. J
  - `Mat`: 待预测的特征矩阵。
* ~, r  S7 h: k% t- **功能**: 根据训练得到的决策树进行分类预测。( H$ B2 q- O* d( h( x5 y
- **流程**:1 D+ ~$ [  j& g) p- n& a4 R! v
  - 遍历每个样本,通过树结构进行预测。& I. u* l, N# u. f
  - 在树的每一层,根据特征值值进行左右子树的选择,直到到达叶子节点。
( F9 O4 y+ \$ h' V  - 返回每个样本的预测结果。
; v# M0 U8 Y) H6 C; n
! y+ [$ _1 k# F0 \#### 7. **方法 `isLeaf`**3 ~# H9 \. f- g- D4 F) a0 m% K
- **参数**:6 o/ M$ }. U( U& |% n- M, ~! t  S
  - `tree`: 当前树的节点。$ v- D/ Y( q% x8 b. Y
- **功能**: 判断当前节点是否为叶子节点。
1 g- S, `  F- u- A+ ~- **返回值**: 如果是叶子节点返回 True,否则返回 False。* M0 ?/ ?8 h1 f
  Q0 Y# ]. {) g5 U
#### 8. **方法 `getLeft` 和 `getRight`**
8 r0 v: t  ~& x0 Y+ t/ I  C' b- **参数**:8 Y2 z/ _: @  W8 j# j; }
  - `tree`: 当前树节点。: U8 I) v$ ?  \' r/ @3 z
- **功能**: 分别获取当前节点的左子树和右子树。
4 U! U/ A' N/ y1 q- **返回值**: 返回子树。
, h; {% \2 i# N- z
( q- c: U1 w4 \( U### 总结2 n: r  Q# ?+ A; ^* a' s' p
该代码实现了一个基本的决策树分类器,主要功能包括:
  f9 G0 l4 C  [- R- 计算数据集的基尼指数。) y3 D, R  M3 f% I' q+ ]
- 根据特征和标签构建决策树。5 u3 i. [, K- B
- 利用训练得到的树对新样本进行分类预测。5 [7 T; @7 j% [  H+ C4 t/ i
0 P. w; h; e& ?) {$ x6 J
该决策树是通过递归的方法构建的,将数据集根据特征进行分割,最终形成由节点和叶子组成的树形结构。叶子节点代表最终的分类结果。这个实现是决策树算法的基础,适合用于分类任务。
6 `  U9 d3 L) P3 G  H3 ~
/ u3 {) s8 y+ Y6 r/ p
* f4 i& v6 W7 G9 d6 R
! Z- B' [6 ?0 {. a4 k/ ^

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-8-4 10:24 , Processed in 1.705445 second(s), 55 queries .

回顶部