多标签学习与深度森林学习笔记

article/2025/9/25 20:39:42

周志华老师团队Multi-Label Learning with Deep Forest (MLDF)报道很多,各大机器学习平台也都就这篇文章的亮点给出了分析。近日在准备组会报告时较为详细地拜读了一下,也由此简单了解了一下多标签学习的相关内容。

正如论文作者所述,MLDF的最大优势在于:

  • 限制模型复杂性以防止过拟合

  • 可以根据用户需求进行优化

实验表明,在多个标准数据集(benchmark dataset)上,深度森林在六种多标签学习的评价方法中取得了最佳表现,同时也具有在多标签问题中研究标签之间相关性的能力。

下面就多标签学习问题和深度森林在这一类问题上的应用记录一下学习内容。

 

1. 多标签学习问题

1.1 问题描述

多标签学习 (Multi-Label Learning) 是与单标签学习 (Single-Label Learning) 相对应的概念。对于单标签学习的问题在生活中非常常见,比如判断一张图片中的动物是猫还是狗。而多标签则是一个样本同时具有多个标签,需要人们同时识别出来,比如一张图片中可以同时有天空、湖水、城堡、天鹅等等。

图片来源:Huang and Zhou, Fast Multi-Instance Multi-Label Learning, PAMI, 2013.

这里要注意的是不要把多标签问题和多类别 (Multi-Class)问题 混淆。多类别问题仍然是单标签的,一个样本只对应一个标签。

现阶段多标签学习主要关注多标签分类问题,对于回归的研究相对较少。多标签分类主要关注一下几个方面:

  • 输入一个样本,在全标签集中找到它所对应的标签

  • 对于所有相关的标签,根据相关性加以排序

  • 探索标签之间的关联 (Label Correlation)

1.2 评价指标

多标签分类的评价方法有很多,MLDF文章中用到了下面的六种指标,如果有兴趣了解更多评价指标的朋友们可以查阅文末参考文献[3]和[4],里面有较为详尽的介绍(当然其他综述文献中也都有,个人更推荐这两篇),对于不太理解的概念可以多看几种解释,基本都可以弄懂。这里不展开说明了。

表格来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

表格中  m 是样本数量,  l 是标签数量,  h 表示模型输出结果,上(下)箭头表示指标约大(小)越好。

 

2. 深度森林(gcForest)模型

由于MLDF是基于深度森林构建的,这里对深度森林模型做简要介绍。深度森林(Paper)是周志华老师团队在2017年提出的。出于好奇专门了解了一下为什么叫"gcForest"。这个名称来源于"multi-Grained Cascade Forest",是指多粒度级联森林。

正如要了解随机森林就要先了解决策树一样,这里我们先从深度森林最基本的组成单位——预测聚类树(Predictive Clustering Tree (PCT))开始。PCT的基本思想如下:自顶而下构建一棵树,每次分枝将样本分到各个子节点上,这样PCT构建完成时每个叶子节点就包含了若干个样本,含有多个标签。PCT的构建过程与决策树类似,停止生长、剪枝和其他策略均可相似地应用到PCT上,具体可以参考这篇文章。在测试过程中,一个样本会被分到某个叶子节点上,那么这个样本的标签向量就用这一节点上训练集各个标签的比例来表示,标签向量的每个元素代表这一测试样本属于这个标签的概率。

类似随机森林,多个预测聚类树组成了深度森林的基本模块——基于PCT的随机森林(RF-PCT),如下图所示。需要注意的是在图中每个样本是单标签的,因此每个样本仅有一种颜色(个人认为图中的形状不同是为了更好地加以区分)。

图片来源:Zhou and Feng, Deep Forest, IJCAI, 2017.

深度森林的结构如下图所示,上面提到的RF-PCT成了深度森林中的单一模块。只是深度森林中模块包括两种类型:普通随机森林(黑色)和完全随机森林(蓝色)。两者的区别在于分枝时特征选取的不同,普通随机森林选取 \sqrt n 个特征(n为样本特征数)作为候选,之后再用gini系数选取最佳的特征进行分枝;而完全随机森林是从n个特征中随机选取一个用于分枝。每个森林包含500棵树。

图片来源:Zhou and Feng, Deep Forest, IJCAI, 2017.

深度森林模型包含两个主要部分:多粒度特征扫描 (Multi-Grained Scanning) 和级联森林 (Cascade Forest)。多粒度扫描是在原始特征的基础上用不同大小的滑窗 (Sliding Window) 提取特征(注意:这里不是卷积操作,和CNN中的滑窗是不同的)。例如对于长度为400的特征的三分类任务,用100长度的滑窗扫描原始特征,可以提取到301个长度为100的特征向量,将这些特征分别放到两类森林中会得到两组结果,每组中包含301个长度为3的输出特征向量,拼接后就得到了3*301*2=1806维的输出特征向量。在上图中的深度森林中,特征扫描分别采用了100、200和300长度的滑窗完成。

级联森林的思想和深度神经网络类似,每一层由若干个(这里为4个)随机森林块组成,包括普通随机森林块和完全随机森林块。样本用上面提到的特征扫描得到的输出特征(记为X)表征,分别输入级联森林的第一层中,输出结果再连接输出特征X输入下一层......经过若干层后,在输出层将结果取平均,得到最终的预测结果。需要注意的是这里使用了三种“粒度”的特征扫描方案,级联森林的每一层是包含三个子层的,相邻两层的各子层采用“一对一”连接,即Level1A连接Level2A。

 

3. 多标签深度森林模型(MLDF)

3.1 MLDF模型结构

做了一堆铺垫,终于来到了MLDF文章中的模型,其实理解了之前的各个模型这里就会显得很简单,MLDF的结构与gcForest类似,如下图所示,但不同在于没有强调特征扫描(查阅了原文没有明确说明要预先做gcForest里面那样的多粒度特征扫描,应该是都可以),并且融合了两种基于评测指标的优化方案,使模型更优。

图片来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

3.2 度量感知特征重用(Measure-aware Feature Reuse)

第一种基于评测指标的优化方案是度量感知特征重用 (以下简称MAFR),对应模型结构图中  G^t, H^t 相关部分。正如原文中所说,MAFR的核心思想是在当前层输出特征的置信度小于阈值时,部分重新使用之前层相对较好的特征来替代当前层特征。算法细节如下图所示,首先选取一个合适的评价指标  M ,获得当前层  t 的输出特征 H_t 后,计算一个阈值  \theta_t,对于每个标签(或每个样本),计算其对应的置信度 \alpha ,如果置信度小于阈值,则该标签(或样本)对应的特征表示 G^t_{.j} (或者 G^t_{i.}) 用前一层的特征表示 G^{t-1}_{.j} (或者 G^{t-1}_{i.}) 替代;否则仍使用当前层的输出特征表示H^t_{.j} (或者 H^t_{i.})。置信度的计算方法与模型采用的评价指标有关,例如使用hamming loss,置信度可以用每一标签取正/负的正确性来计算,对于预测结果

 p_{.j}=[0.9,0.6,0.4,0.3]

置信度为

 \alpha=\frac{1}{4}(0.9+0.6+0.6+0.7)=0.7

(例子来源于论文)

基于标签的评价指标和基于样本的评价指标可以参考文末的参考文献[4],有较为详细地讲解。

图片来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

关于阈值 \theta_t的计算的算法如下图所示,对于每个标签或者每个样本,计算其在 H^t 上的置信度,同时根据选定的评价指标  M 计算输出 H^t_{.j} 和真实答案 Y^t_{.j} 的度量  m^t_{.j},若 m^t_{.j} 比 m^{t-1}_{.j} 要差,就把 m^t_{.j} 加入到阈值集合  S 中,根据  S 获得阈值  \theta_t(比如对  S 中的值取平均)。

图片来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

3.3 度量感知层增长(Measure-aware Layer Growth)

第二种基于评测指标的优化方案是度量感知层增长 (以下简称MALG),MALG算法如下图,简单来说就是设定并初始化一个评价指标 p_{best}(比如前面提到的hamming loss),模型每加一层(记为t层)时先计算这一指标 p_t,如果 p_t 优于 p_{best} 则更新 p_{best} 并记录对应层索引 L ;如果 p_{best} 在最近三层都没有更新则退出层增长过程;只要没有退出,就在现有模型基础上加一层(来到了t+1层),但注意只要没有更新 p_{best},最佳层索引  L 就不会发生变化。层增长过程结束后模型只取前  L 层,这意味着模型后端那些没有更新 p_{best} 但临时添加的层在最后的深度森林模型中是被删去的。

图片来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

 

4. MLDF实验结果

通过与其他5种多标签学习算法的比较,MLDF在9大标准数据集 (benchmark datasets) 上采用6种评价指标均取得了更好的效果。用于比较的算法分别为:RF-PCT[Kocev et al., 2013], DBPNN[Hinton and Salakhutdinov, 2006; Read et al., 2016], MLFE[Zhang et al., 2018a], RAKEL[Tsoumakas and Vlahavas, 2007], ECC[Read et al., 2011].

文章也分析了度量感知特征重用 (MAFR) 机制对结果的影响,如下图所示。每张子图是一个数据集上的结果,每个顶点代表一种多标签学习的评价指标,越靠近顶点表示这种指标下模型表现越好。图中浅色部分表示深度森林使用MAFR机制的表现,深色部分表示深度森林没有使用MAFR的表现。可以直观的看出MAFR对模型性能提升的作用。

 

图片来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

文章还分析了度量感知层增长 (MALG) 机制对结果的影响,如下图所示。评价所用数据集为yeast数据集,每张子图对应于6种评价指标中的一种。实验中当模型达到MALG机制所规定的停止增长条件后,仍增加模型的层数,计算各个指标来测试MALG机制的有效性。红色圈代表MALG机制记录下的最佳层数,可以发现MALG几乎可以确定模型的最佳层数。当层数大于红色圈标记后模型表现几乎不变或者增长不显著。绿色三角形代表RF-PCT的实验结果,在所有评价指标下MLDF表现均优于RF-PCT。

图片来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

另外文章利用MLDF模型分析了标签的相关性。实验中在模型第一层表示中删除掉某个特定的标签,然后继续训练后面的层,观察结果中其他标签准确性的变化,由此可以分析标签相关性。文章中的分析结果如下图所示。

图片来源:Yang et al., Multi-Label Learning with Deep Forest, aXiv, 2019.

总结一下!MLDF文章的主要贡献为(来自原文):

  • 首先将深度森林方法用于多标签学习

  • MLDF模型在多个标准数据集用多种评价指标的表现优于其他多标签学习模型

 

5. 多标签学习综述文章

最后给出一些我在准备组会报告时查阅的多标签学习综述文献,内容相近略有不同,供大家参考。

[1] Tsoumakas and Katakis, Multi-label classification: An overview, Int. J. Data Warehousing Mining, 2007.

[2] Tsoumakas et al., Mining multi-label data, Data Mining and Knowledge Discovery Handbook, 2010.

[3] Zhang and Zhou, A Review on Multi-Label Learning Algorithms, IEEE Transactions on Knowledge and Data Engineering, 2014.

[4] Gibajaand Ventura, A Tutorial on Multi-Label Learning, ACM Computing Surveys, 2015.

[5] Xu et al., A Survey on Multi-output Learning. IEEE Transactions on Neural Networks and Learning Systems, 2019.

[6] Borchaniet al., A survey on multi-output regression, Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery, 2015. (这篇是介绍多标签回归问题的,虽然这类问题出现的不多,但有兴趣的朋友们可以关注一下).


http://chatgpt.dhexx.cn/article/qkD1lHnW.shtml

相关文章

论文阅读:Deep forest/深度森林/gcForest

最近组会汇报了这篇文章,简单把思想梳理下来了,对了搜索深度森林的时候可能会看到Deep Forest: Towards an Alternative to Deep Neural Networks,这两篇文章的内容基本上是一致的,只在叙述方面有一些很小的不同。 下面是我做的p…

【冰糖Python】深度森林 DeepForest

此文为记录DeepForest的简单使用 原文《Deep Forest: Towards an Alternative to Deep Neural Networks》 “A key advantage of deep forest is its adaptive model complexity depending on the dataset. The default setting on hyper-parameters enables it to perform r…

使用深度森林(Deep Forest)进行分类-Python

一、什么是深度森林? 传统DNN的不足: 1、需要大量的数据集来训练; 2、DNN的模型太复杂; 3、DNN有着太多的超参数 gcForest的优势: 1、更容易训练; 2、性能更佳; 3、效率高且可扩展、支持…

深度森林浅析

深度森林 深度学习最大的贡献是表征学习(representation learning),通过端到端的训练,发现更好的features,而后面用于分类(或其他任务)的输出function,往往也只是普通的softmax&…

深度森林原理及实现

目录 背景 级联森林 多粒度扫描 代码 总结 背景 深度森林(Deep Forest)是周志华教授和冯霁博士在2017年2月28日发表的论文《Deep Forest: Towards An Alternative to Deep Neural Networks》中提出来的一种新的可以与深度神经网络相媲美的基于树的模型,其结构…

论文阅读:深度森林

论文地址:https://arxiv.org/pdf/1702.08835.pdf 相关代码:https://github.com/kingfengji/gcForest 深度森林是南大周志华老师前两年提出的一种基于随机森林的深度学习模型。 当前的深度学习模型大多基于深度学习神经网络(DNN)…

Deep Forest(gcforest)通俗易懂理解

DeepForest(gcforest)深度森林介绍 1.背景介绍 当前的深度学习模型主要建立在神经网络上,即可以通过反向传播训练的多层参数化可微分非线性模块,周志华老师希望探索深度学习模型的新模式,探索不可微模块构建深度模型的可能性。从而提出了一…

【深度学习】Deep Forest:gcForest算法理解

一、相关理论 本篇博文主要介绍南京大学周志华教授在2017年提出的一种深度森林结构——gcForest(多粒度级联森林)。近年来,深度神经网络在图像和声音处理领域取得了很大的进展。关于深度神经网络,我们可以把它简单的理解为多层非…

从深度学习到深度森林方法(Python)

作者 |泳鱼 来源 |算法进阶 一、深度森林的介绍 目前深度神经网络(DNN)做得好的几乎都是涉及图像视频(CV)、自然语言处理(NLP)等的任务,都是典型的数值建模任务(在表格数据tabular …

深度森林(gcforest)原理讲解以及代码实现

GcForest原理 gcforest采用Cascade结构,也就是多层级结构,每层由四个随机森林组成,两个随机森林和两个极端森林,每个极端森林包含1000(超参数)个完全随机树,每个森林都会对的数据进行训练,每个森林都输出结…

有关 -fPIC 选项的编译问题

嵌入式 Linux 上基于 makefile 的编译,执行编译出现如下错误: error: test/fake_blemgr_test.o: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC 这个问题涉及到生成位置无关代码的机制,在我这里的情况是&#xff0…

-fpic 与-fPIC的区别

-fpic 与-fPIC的区别 前言 在编译动态库的时候,我们应该需要使用-fpic 或-fPIC参数。如下所示: 然后,使用gcc或g 命令生成动态库 pic 与PIC的异同 相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT&…

在字符串中删除指定的特定字符

使用C语言,编写一个尽可能高效的函数,删除字符串中特定字符。 思路:要求尽可能高效,定义一个256的int数组,将需要删除的字符ASCII作为数组下标,要删除的置1,注意点:处理后的字符串要…

实现一个删除字符串中的指定字符的简单函数

做出此函数只需将函数分步运行 第一步&#xff1a;确定函数接口和定义变量 因为是要删除字符串中的指定函数&#xff0c;所以要定义出字符串以及字符&#xff0c;即str[]和c。函数接口为void delchar&#xff08;char*str&#xff0c;char c); #include<stdio.h> int …

删除字符串某一指定子字符串

文章目录 功能&#xff1a;删除字符串某一指定子字符串业务场景实现方法1、Java实现 功能&#xff1a;删除字符串某一指定子字符串 业务场景 在数据库中有一个String类型的字符串&#xff0c;该字符串通过逗号进行分割&#xff0c;现在前端传过来字符串中的一个子字符串&…

删除字符串中指定的字符C语言详解

问题描述&#xff1a; 从键盘输入一个字符串和一个字符&#xff0c;删除字符串中所指定的字符&#xff0c;将结果保存到一个新的字符串中并输出 编译环境&#xff1a;vc 6.0; 代码 #include <stdio.h>int main() {char str1[80], str2[80], ch;int i,j0;printf("…

C语言删除字符串中的指定字符

一、函数方法&#xff08;推荐使用这个方法&#xff09; 只需要进行一次对目标字符串的遍历即可完成删除目标字符的功能&#xff0c;具体的代码如下所示&#xff1a; void delchar( char *str, char c ) {int i,j;for(ij0;str[i]!\0;i){if(str[i]!c)//判断是否有和待删除字符一…

C++ 删除指定字符串中的某些字符

C 删除指定字符串中的某些字符 题目 输入URL前缀和后缀&#xff0c;删除字符串中的“,/”&#xff0c;把URL拼接在一起且后边有“/”。 用例&#xff1a; 输入&#xff1a;/abhdsjvf/,/afsggfd 输出&#xff1a;/abhdsjvf/afsggfd/ 程序实现&#xff1a; #include<iostrea…

Windows server 2012 R2安装教程

镜像下载地址&#xff1a; ed2k://|file|cn_windows_server_2012_r2_vl_with_update_x64_dvd_6052729.iso|5545527296|BD499EBCABF406AB82293DD8A5803493|/ 1&#xff0c;语言&#xff0c;键盘输入法&#xff0c;默认&#xff0c;点击下一步 2&#xff0c;点击 现在安装 3&…

SQL Serevr 2012 安装教程

需要的工具 SQL Server 2012R2 镜像 ISO WINDOWS SERVER 2012R2 操作系统 安装过程 1、打开安装文件&#xff0c;打开 setup 应用程序图标 2、在 SQL server 安装中心窗口中&#xff0c;点击安装– 点击全新 SQL Server 独立安装或向现有安装添加功能 3、点击确定 4、输入产…