当前位置: 首页 > article >正文

第23周:机器学习及文献阅读

目录

摘要

Abstract

一、理论知识

1、逻辑提升

2、分类任务 

3、10倍交叉验证法 

二、文献阅读

1、模型方法——MLT

(1)特征选择

(2)决策树剪枝

2、分类任务——逻辑回归

3、实验部分

数据集的选取 

代码实践

模型评估

实验结果 

总结


摘要

本周围绕着逻辑回归和决策树阅读了一篇论文,主要是一种用于提高多类多标签分类任务精确度的算法,它结合了决策树作为分类器,采用逻辑回归模型实现多分类的任务。回顾复习了逻辑回归的相关知识,还学习了相关的机器学习的理论知识。然后对原论文种给出的数据集进行收集,以及源代码进行逐行分析。 最后经过与其他算法进行横向比较以及与不同数据集的应用进行纵向比较,得到了MMTML显著优势的结论。

Abstract

一、理论知识

1、逻辑提升

逻辑提升logisticboost:结合逻辑回归和提升方法,通过迭代地训练多个弱分类器并组合它们的预测来提高分类性能。 

2、分类任务 

单标签分类

每个实例(或样本)只与一个标签相关联。这意味着每个数据点只能属于一个类别。 比如垃圾邮件检测、手写数字识别

多标签分类

每个实例可以与多个标签相关联。这意味着每个数据点可以同时属于多个类别。比如文本tag分类、 图像处理

多类多标签分类 

每个实例可以与多个标签相关联,但这些标签属于不同的类别。这意味着每个数据点可以同时属于多个类别,每个类别可以有多个标签。比如复杂的文本分类(一篇文章属于多个类别中的多个tag) 

3、10倍交叉验证法 

是一种常用的模型验证技术,用于评估机器学习模型的性能。它通过将数据集分成10个子集(或“折”)来实现,每个子集轮流作为测试集,而剩余的9个子集作为训练集。 

二、文献阅读

目的:提高多个类和标签的多分类任务的准确度

方法:结合逻辑回归和决策树 

为每个数据集构建一个logistic模型树,得到p个不同的树对应于p个目标属性。然后将这些树聚合起来,形成最终的预测模型

LMT算法将逻辑回归与决策树原则集成,形成了一个灵活的树结构,能够很好地适应各种数据类型

MMLMT方法特别适合于标签数量相对适中的场景。

1、模型方法——MLT

逻辑模型树

决策树:从给定的训练数据集中,依据特征选择的准则,递归的选择最优划分特征,并根据此特征将训练数据进行分割,使得各子数据集有一个最好的分类的过程。

(1)特征选择

信息增益ID3:划分数据集的之前之后信息发生的变化,也就是数据集内特征混乱程度得变化

 计算每个特征值划分数据集获得的信息增益,获取信息增益最高的特征就是最好的选择

信息可以用熵来表示, 交叉熵应用在数据集D_{v}中,其中D_{vk}表示D_{v}中分类为k的样本,信息熵的计算公式如下:

由此我们就可以根据信息熵计算信息增益:

 

也就是说,决策树最终的目的是分类分得越清晰明显越好,我们需要比较不同的特征,使得信息熵在相同特征下的分支处差值最大(信息增益)。最终选择信息增益最大额特征。

信息增益率C4.5: 仅仅采用信息增益来划分属性,就会导致当某一个属性的取值种类非常多时,对应每一个属性取值的样本子集,其分类的信息熵可能会变得很小。所以要平衡样本集数据的多少问题。

简单来说,就是在信息增益的基础上增加了惩罚机制 

 

 这个过程类似于对信息熵进行归一化,先从候选划分属性中找出 信息增益 高于 平均水平 的属性,再从中选择 增益率 最高的。

基尼指数CART:衡量数据的纯度或不确定性。基尼指数越小,代表纯度越高

 

(2)决策树剪枝

决策树过拟合的可能性很大,在训练集上面表现的效果当然很好,但在测试集上面的表现会很差,泛化能力很弱。 

预剪枝:在构造决策树的过程中,先对每个结点在划分前进行估计,如果当前结点的划分不能带来决策树模型泛化性的提升,则不对当前结点进行划分并且将当前结点标记为叶结点

发生在决策树的构建过程中。预剪枝就是设定一个阈值,只有在信息增益大于这个阈值的时候(也即是在分类后的信息混乱程度减小程度大于一定标准的时候)才进行分类。如果在信息增益过小的情况下,即使存在信息增益的现象,也不会对其进行分支。 

后剪枝:先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛化性的提升,则把该子树替换为叶结点。

发生在决策树构建完成后。剪枝的过程是对拥有相同父节点的一组节点进行检查,如果将其合并,熵增小于某一阈值,那么这一组节点可以合并一个节点。如果将其合并后熵增大于这个阈值,那么说明将其分枝是合理的。 

数据集包含N各样例。将数据集划分为p各子数据集并且设定p个目标属性,k个特征(每个数据集都包含k个特征和一个目标属性)。这p个子数据集是作为单独训练的小数据集,应用于p个LMT(逻辑模型树) 进行分类任务;接着将分类的结果进行聚合和评估;最后形成预测模型。

2、分类任务——逻辑回归

逻辑回归主要是处理二分类的问题,也可以拓展为非线性的多分类问题的基础模型。具体实践见周报(22)CSDN 

也就是说,在完整的实验过程中,决策树承担了分类器的生成部分,多个决策树就能生成多个分类器,从而解决了多标签分类问题。接着, 多分类问题需要逻辑回归模型来解决,即为多个分类器作为逻辑回归的输入部分。最终的输出是多类多标签分类的结果向量。

3、实验部分

数据集的选取 

本研究利用8个真实世界的多类多标签数据集来展示所提出的MMLMT方法的功能。每个数据集——毒品消费、安然、黑客地球收养伙伴、音乐情感、场景、太阳爆发2、甲状腺l7和酵母。这些数据集包含了广泛的特征,范围从10到1001,实例从593到18,834不等,标签编号从2到53。它们起源于不同的领域,包括药物、文本、动物、音乐、图像、物理学、医疗保健和生物学。这些数据集包含分类值、数值值和混合类型的值,反映了它们的不同的性质和对不同的分析机器学习技术的适用性。 

代码实践

MMLMT方法 

public static PerformanceMeasure MMLMT(string f, int numLabels)   #执行多类多标签逻辑模型树分类,参数包含“数据文件名”和“目标属性的数量”
{
            int folds = 10;      //0折交叉验证

            PerformanceMeasure pm = new PerformanceMeasure();               
            double accuracy = 0;           
            double sensitivity = 0;            
            double PRC = 0; 

            for (int i = 0; i < numLabels; i++)  //循环每个目标属性
            {
                java.util.Random rand = new java.util.Random(1);   //设置随机种子
           
                weka.core.Instances insts = ReadInstances(new java.io.FileReader("datasets\\" + f));     //读取数据集文件
 
                for (int j =0; j < numLabels; j++)  //处理属性:删除多余的属性,保留单个目标属性
                {
                    if (j > i)
                       insts.deleteAttributeAt(1);
                    else if (j<i)
                       insts.deleteAttributeAt(0);
                }

                insts.setClassIndex(0);  //设置目标类属性的索引

                weka.classifiers.trees.LMT classifier = new weka.classifiers.trees.LMT();          //创建逻辑树模型分类器

                weka.classifiers.Evaluation eval = new weka.classifiers.Evaluation(insts);

                eval.crossValidateModel(classifier, insts, folds, rand);   //使用10叉折叠评估模型

                // 累加性能指标
                accuracy = accuracy + eval.pctCorrect();
                sensitivity = sensitivity + eval.weightedRecall();
                PRC = PRC + eval.weightedAreaUnderPRC();
            }
                 
            // 计算平均性能指标
            pm.Accuracy = Math.Round(accuracy / numLabels, 2);
            pm.Sensitivity = Math.Round(sensitivity / numLabels, 3);
            pm.PRC = Math.Round(PRC / numLabels, 3);
            return pm;
        }
  
        

ReadInstances 方法 

 public static weka.core.Instances ReadInstances(java.io.FileReader fr)  //从数据文件中读取实例,参数是文件读取器
{
    weka.core.Instances instances = new weka.core.Instances(fr);   //创建实例对象
    instances.setClassIndex(instances.numAttributes() - 1);     //设置类索引

    return instances;
}      

main方法

static void Main(string[] args)
        {
            string[] filenames = { "Drug-Consumption", "Enron", "HackerEarth-Adopt-A-Buddy", "Music-Emotions", "Scene", "Solar-Flare-2", "Thyroid-L7", "Yeast"  };  //各数据集文件的名字 
            int[] numLabels = { 18, 53, 2, 6, 6, 3, 7, 14 };   //目标属性的数量

            //打印表头
            Console.WriteLine("MMLMT \n");
            Console.WriteLine("Dataset                     Accuracy     Sensitivity     PRC");

           //计算每个数据集并且打印性能指标
            for (int i = 0; i < filenames.Length; i++)
            {
                Console.Write(filenames[i]);      
                PerformanceMeasure pm = MMLMT(filenames[i] + ".arff", numLabels[i]);
                Console.SetCursorPosition(28, i + 3);
                Console.WriteLine( pm.Accuracy + "\t    " + pm.Sensitivity + "\t " + pm.PRC);         
            }
            Console.ReadLine();
        }

以上这三段代码实现了一个多类多标签逻辑模型树分类器,使用 Weka 库中的逻辑模型树(LMT)分类器进行分类。它通过读取数据文件、处理属性、执行交叉验证和计算性能指标来完成分类任务。

用于存储和管理分类器的性能指标

namespace MMLMT
{
    class PerformanceMeasure
    {
        public double Accuracy { get; set; }
        public double Sensitivity { get; set; }
        public double PRC { get; set; }
    }
}

成员变量

static final long serialVersionUID = -1113212459618104943L;  //序列化
  
protected ReplaceMissingValues m_replaceMissing;   //替换缺失值的过滤器
    
protected NominalToBinary m_nominalToBinary;   //名义属性转换为二进制属性
     
protected LMTNode m_tree;  //逻辑模型树的根节点
    
protected boolean m_fastRegression;  //是否快速回归启发式方法

protected boolean m_convertNominal;  //是否将名义属性转换为二进制属性

protected boolean m_splitOnResiduals;   /是否基于残差进行分割
    
protected boolean m_errorOnProbabilities;   //是否在 LogitBoost 的停止准则中使用概率误差

protected int m_minNumInstances;   //节点可以分割的最小实例

protected int m_numBoostingIterations;   //LogitBoost 的固定迭代次数
    
protected double m_weightTrimBeta;   //用于 LogitBoost 的权重修剪阈值。
  
private boolean m_useAIC = false;  //是否使用 AIC 来选择最佳迭代
  

构造LMT函数

public LMT() {
  m_fastRegression = true;
  m_numBoostingIterations = -1;
  m_minNumInstances = 15;
  m_weightTrimBeta = 0;
  m_useAIC = false;
}

模型评估

在实验中,该篇论文使用了10倍交叉验证的方法来训练和评估分类模型。在评估步骤中,我们采用了一系列全面的标准指标来评估MMLMT方法在不同维度上的。包括准确性灵敏度精度召回曲线(PRC)区域。

该篇论文的8个数据集分别采用了8种多标签分类的算法进行训练,最终与MMTML算法的各个性能进行比较,发现MMTML算法果然优势突出。8种算法的精度比较如下:

实验结果 

MMTML模型在不同数据集上的精确度 

 MMTML模型在不同数据集上的PRC区域

总结

本周阅读了一篇文献,巩固了前几周的机器学习中逻辑回归模型的学习。并且学习了决策树,并将二者融合来解决多类多标签分类任务。下周继续完善该文献得阅读以及完成吴恩达机器学习得下一个实验。 


http://www.kler.cn/a/428918.html

相关文章:

  • 使用 Java 和 FreeMarker 实现自动生成供货清单,动态生成 Word 文档,简化文档处理流程。
  • Linux-性能分析top
  • OODA循环在网络安全运营平台建设中的应用
  • Word2Vec中的CBOW模型训练原理详细解析
  • 于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)
  • Linux网络 TCP socket
  • 【postgresql初级使用】在表的多个频繁使用列上创建一个索引,多条件查询优化,多场景案例揭示索引失效
  • WEB_星河飞雪_Windows(全)
  • HCIA-Access V2.5_2_2网络通信基础_TCP/IP模型结构
  • Unity引擎UI滚动列表——滚动复用基础介绍
  • Javascript Clipper library, v6(介绍目录)
  • 六、隐语PIR功能及使用介绍
  • 漫画之家:基于Spring Boot的漫画社交网络平台
  • C# WPF抽奖程序
  • 如何在UI自动化测试中创建稳定的定位器?
  • 笔记:在WPF中BitmapSource都有哪些派生类,他们主要功能,使用方法,使用场景
  • SpringBoot实现前后端传输加密设计
  • php项目的sdk封装成composer包的创建与发版
  • 【光电融合集成电路制造与封测】第四讲:扩散工艺,扩散的类型,恒定表面源扩散,限定表面源扩散,硼扩散
  • 分享一个您在汽车软件安全性测试中发现严重漏洞的案例,以及如何处理
  • 30天学会Go--第6天 GO语言 RESTful API 学习与实践
  • Tomcat(基础篇)
  • <router-view> 中key和name属性的用法详解以及案例
  • 试题转excel;pdf转excel;试卷转Excel,word试题转excel
  • 力扣 对称二叉树-101
  • 如何利用Python爬虫获得商品类目