第一章:喂什么数据给我的模型吃?

1. 简介

作为系列博客的第一章,笔者首先想和大家谈的是深度学习中十分重要的一个组成部分——“数据”。很多讲解深度学习的文章都重点关注了神经网络的结构,以及其参数配置,然而对数据的部分讲解不够充分。这经常会导致学习的朋友陷入误区,算法至上而不是数据至上。这里笔者想对各位学习者解释的一点是,不论是在深度学习,或是机器学习,“数据”永远是最重要的。当你的模型或者算法不work,首先要检查的内容便是你的数据。因为我们最初目的是希望通过分析数据,找到其中的潜在特征和规律,并对其进行分析和应用。那些很高端很优秀的算法,他们也只是挖掘潜在规律的不同手段和角度,最终的目的仍然还是要落回到数据上。那么数据的质量,数据的结构,以及什么样的数据能够被我们的学习模型接受,就成为了至关重要的问题。因为数据形式的多样化,我在这里只介绍几种基本的,初学过程中常见的几种数据组织形式,以便初学者在学习的过程中有所参考。

2. 数据的通用解释

如大家所感受到的,我们在学习人工智能的过程中,所使用的数据并不是统一的形式或结构。我们手头拿到的数据,可能是一个音频文件(mp3, wav等),也可能是图像文件(png, jpg, png等),也可能是视频文件(mp4, avi等),或者是一些文本文件如csv, xlsx, txt等。那么通常来说,从数据的角度出发,我们一般关注的几个点是:数据的量,数据的维度,数据的标签形式,数据集的划分等。

这里简单做解释:

1)数据的量,一般是用来选择算法的重要依据之一。我们经常讲,深度学习就像小孩子学习和考试:学习对应着训练的过程,而考试则对应着验证和测试的过程。那么我们在学习的过程中,有多少往年考题给我们做,很大程度上,决定了我们是刷题,搞“题海战术”,还是举一反三地进行推理学习,或者先学学其他相关领域的东西用于参考等。这些不同的学习方法,人类适用,学习机也同样适用。由此可以看出,数据的量,对于算法的选择有着很大的影响。

2)数据的维度。这个概念简单一点理解就是,在我们已有的认知中,这个要被学习的事物是怎样被表达的,或者说是以怎样的形式在计算机中存在的。具体来说,一个音频文件在被读入计算机后,它的数据形式是一维信号。在这里简单为大家验证一下:

                       

                                                                              图1. 音频数据的读取和波形可视化

 

通过以上的输出情况我们可以看出,一个mp3音频文件,在以采样率 (sample rate, sr) 8000的条件下被读入计算机后,变成了一个一维的数据,1590475是它采样后保留的有效数据,具体波形如图1右边所示。那么对应的,我们要选择1D信号的处理方式来分析和挖掘有用的信息和规律。由此我们可以看出,我们需要先将外部待处理文件,导入到计算机的内存中,检查它是以怎样的形式存在的,然后我们根据读取后信号的维度,对数据进行对应的处理。学者可以对不同信号进行导入,观察他们在计算机中的存在形式,并学习对应的处理算法。很多类似的文章讲解这一问题,我在这里就不多赘述了。

3)数据标签。数据标签也是对算法选择起到了决定性作用的因素之一。在机器学习中,我们首先了解到的概念就是监督学习,半监督学习和无监督学习,那么这三种分类的依据,就是我们所分析的数据是否具有标签,以及是否全部具有标签。关于数据标签的例子,我想以各位学者最常听到的MNIST数据集进行举例说明,同时我们也来讨论一下图像数据。MNIST数据集 [1],又叫手写体数字识别数据集,是由NYU的著名学者Yann LeCun教授等学者提出的标准数据集。它由60,000 个训练样本和10,000个测试样本构成,同时每个样本都具备样本标签。读取入计算机后的基本情况如下所示:

图 2. MNIST数据集的读取 

 

这里我们可以看出,读取后的MNIST数据集,训练集x_train维度是(60000, 28, 28),测试集x_test维度是(10000, 28, 28),与我们先前所讲一致。那么他们对应的数据标签是y_train和y_test,可以看到维度是(60000,)和(10000,)。这里的60000和10000,便是我们的数据集中一共有多少个样本,因为每个样本对应一个标签,所以数量自然是相同的。通常在一次性送入所有数据的训练中,我们处理好的数据的第一个维度,所表达的含义就是样本量。后面的(28, 28)是图像的长宽,因为MNIST是由二值图像构成的,因此不具备彩色通道。如果是彩色图像数据集,则应为(60000, 28, 28, 3),或者如果你使用channel first的数据组织形式,那么它的shape就变成了(60000, 3, 28, 28),这里的3就是彩色图像的三个通道了。我们送入神经网络训练的x_train,也应该遵循这样的数据结构。如果我们使用自己的数据集,我有一堆图像在一个文件夹下,通常会将图像一张张读取,并按照顺序将图像append到一个list中(一般我会叫他x_train),最后使用numpy的array函数统一转换成ndarry的数据类型。这样我们就可以把我们自己的数据重新组织起来,并送入神经网络进行训练了。

在最初学习人工智能的时候,给我困扰最大的就是这个数据标签到底该怎么打。或者这个数据标签到底是啥样的,为什么这样的标签就能计算损失了?其实数据标签(label) 的真正作用,就是在计算模型的损失时的参考,而模型的损失最终会被用于更新网络模型的参数。或者通俗点讲,数据标签就是你平时刷题时候的习题答案。你做完题对答案,知道错了,你就要改正你脑子里错误的想法。这个过程本质上,就是计算损失和更新梯度的过程。我们的学习模型最终的输出,需要有一个比较,才能回答“铁子们,我做的对吗?”因此,标签的作用就是用来告诉模型,你做的对不对。


那么数据的标签到底是什么样?从上述现象其实你就可以发现,标签的形式其实是多种多样的。道理很简单,证明题和画图题和计算题答案能一样吗?肯定不一样啊。那同理,数据标签在不同的任务中,也不尽相同。它可能是一个one-hot编码的向量,常用于分类任务;也可能是一个数字标签,常用于回归任务;也可能是一张图片,比如你要增强一张图,你需要告诉模型最后增强到什么样子才可以停止;或者有可能是一个不规则形状,通常在图像分割领域经常能遇到。因此,标签的本质是为了引导模型的输出,通过更新模型的参数来最小化和标签的差距,得到我们期望的答案。

图 3. MNIST数据集的数据标签

如图3所示,在MNIST中,他的标签就是一个数字1,2,3,4等等,这个数字最后会被one-hot编码后送入网络模型,主要原因是模型最后一层分类使用了Softmax函数,这个函数对应的输出是每个类的概率,这个我们在后续博客中再讲解,这里就不多赘述了。

小建议:如果你实在不知道你的数据标签是什么样,你就想想你期待你的网络模型的输出是什么样的。那么你把标签做成对应的样子,能够找到指标衡量输出和标签的距离,就可以了。

3. 数据集的划分

细心的学者已经发现,在前述的MNIST数据集中,他们对数据划分成了训练集和测试集。那么究竟为什么和怎么样划分呢?数据集的划分通常有三部分构成,训练集(Training), 验证集(validation)和测试集(Test)。如果说训练集是平时学习的习题,那么验证集则是模拟考试。在训练的过程中,每一代训练结束,都最好在验证集上跑一下,并检查输出结果的指标。验证集能够尽早帮助我们发现现阶段模型训练的问题,并及时做出对应的修整。设想,你有一个需要训练50000个Epoch的模型,你在训练了50000代后测试发现在训练过程中出现了过拟合,那么在过拟合后你所花费的训练时间是完全浪费的无效的。如果有验证集的话,我们可以在过拟合的那个epoch处停止训练并做相应的检查,可以节约时间。这里要注意的一点是,验证集和测试集都不可以参与到训练和模型参数更新的过程中,不然就是“作弊”,或者说提前看了考卷,这就自欺欺人了。

数据集的划分方法多种多样,常见的有留出法,K-折交叉验证法,自助法,滑窗法。在周志华教授所著《机器学习》一书第2章第2.2节评估方法中,有非常详细的解释和例子。因为篇幅问题笔者在这里就不多阐述了。其中,交叉验证的方法是被广泛使用的,且公认较为科学有效的一种数据集划分和模型评价方法,感兴趣的学者可以重点学习这一方法。在sklearn的Document中第3.1节 [2],也对相应的划分方式和计算方法进行了解释,重点关注train_test_split这一函数。这里要强调一点的是shuffle这个布尔参数,它默认值为True。如果不进行手动修改,那么划分数据之前,将会先随机打乱数据。这意味着如果在处理时间序列数据的时候,使用默认的shuffle可能会导致时间泄露问题。比如,我们知道事件12345的情况下估计6和7,是很合理的。但是如果shuffle后,那模型的预先数据可能是62154,预测3和7。这样的评价反而与我们的预期和实际情况背道而驰,同时评价出的模型性能也未必是很科学地反馈。K-Fold Cross-Validation默认是不使用shuffle的,因此在使用函数处理数据的时候一定要多注意这类细节。同时,stratify这个参数也要注意。它在划分的时候考虑了标签信息。举个例子解释一下:

图4 Stratify参数的解释

如图4所示,我们的训练数据x有100个元素,y标签对应前50个是0,后50是1,那么我们这里的标签类下的样本比例是1:1。那么在划分数据集时,如果stratify指定y(如图所示),那么按照8-2分出测试集之后,测试集的标签中,对应0和1样本的比例仍旧为1:1。换言之,也就是在20个测试集的标签中,0有10个,1有10个。

这个有什么意义呢?在分类问题中,样本标签均衡是一个非常重要而且有意义的话题,何凯明研究员在[3]中也对样本类别不均衡问题进行了分析,同时也给出了著名的Focal loss用于平衡样本不均衡带来的训练困难。常见的现象是,有些模型对个别标签的分类效果好,对其他标签分类效果差。如果我们按照类别对数据进行划分,那么能够保证测试机的标签分布和训练集的标签数量分布是一致的。这样的好处是能够迅速检查出训练的模型是否存在标签的bias。笔者这里给出的介绍都是一些相对直白简单的讲解,具体的使用特点和完整的信息,感兴趣的读者还是要仔细阅读sklearn的Document [4]并亲自上手编程实现。

4. 数据的泛化误差

所谓数据的泛化误差是指,除了训练的数据之外,你的模型在未见过的数据上表现怎么样。这里我们要讨论的一个经典问题问题是:你的数据集够不够格反馈整个数据域情况?我引用了Adam教授在机器学习模块课件[4] 中的图, 来解释这一问题。

               

这里的假设空间是我们的训练集T的表达范围,而目标域则是代表整个问题空间下的潜在数据域X。那么对应的误差公式是:

                                                     

那么我们可以清楚地看到这里存在的问题,你的训练集无法表达完整的目标域空间所对应的潜在数据。那么这个时候就产生了泛化误差。这里的p(x),是指在全集X域中x出现的概率。

                                                                \centering E_G(D)=\sum _{x \varepsilon X}p(x)(\hat{f}(x|D)-f(x))^{2}

泛化误差对于模型的影响某种程度上,是不可避免的,同时这一现象和数据的方差,偏差,欠拟合以及我们常说的过拟合判断有着紧密的关系。由于篇幅问题,这里我们暂时不做叙述。在后期的博文中,我们会逐渐对这一概念进行分析。

结束语

那么是否这样重新组织好了的数据就可以喂给我的神经网络了呢?答案是:NO。因为我们还需要一个很重要的步骤,数据的预处理。一个好的,合理的预处理能够帮助你的模型顺利度过学习阶段并且提升模型的表现。由于篇幅问题,我们放在后期的博文中进行讨论和解释。

到此,我们对于数据方面的一些基本问题的讨论就告一段落。通过这一章节,我简单分析了一些常见数据读取后的数据类型情况,同时也对如何加载MNIST等常见数据集,以及如何使用自己的图片建造数据集,以及数据类型进行了解释。同时我上传了一些关于csv文件的数据分析,以及我个人高级机器学习的课程设计到GitHub上,其中很大一部分内容是关于使用sklearn和matplotlib进行数据分析和可视化的,感兴趣的读者可以查阅我的个人Github [6]。因为笔者希望尽可能简单通俗地解释一些科学的概念,如果有表达不清楚的地方,欢迎留言讨论!谢谢。

Reference

[1] LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.

[2] https://scikit-learn.org/stable/modules/cross_validation.html

[3] Lin T Y, Goyal P, Girshick R, et al. Focal loss for dense object detection[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2980-2988.

[4] https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

[5] https://secure.ecs.soton.ac.uk/notes/comp6208/lectures/biasVariance.pdf

[6] https://github.com/YuzheYang

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当涉及到燃煤发电厂或工业锅炉时,智慧配煤模型是一种利用人工智能和数据分析技术来优化煤炭配比的模型。这个模型旨在通过分析煤炭的物理和化学特性,以及燃烧过程中的要求,来确定最佳的煤炭配比,以提高燃烧效率、减少污染物排放和降低能源成本。 智慧配煤模型通常基于以下步骤运行: 1. 数据收集:收集与煤炭相关的各种数据,包括煤炭样品的物理和化学特性、燃烧过程中的要求和目标、以及历史运行数据等。 2. 数据预处理:对收集到的数据进行清洗、转换和整理,以便后续分析使用。 3. 特征提取:从原始数据中提取有用的特征,例如煤炭的灰分、挥发分、硫分等特性。 4. 模型构建:使用机器学习或其他数据分析技术构建一个预测模型。这个模型可以学习历史数据中的模式和关联,并根据输入的特征预测最佳的煤炭配比。 5. 模型验证和优化:使用验证数据集评估模型的性能,并对模型进行调整和优化,以确保预测结果的准确性和可靠性。 6. 预测和优化:使用训练好的模型来预测最佳的煤炭配比,并根据预测结果进行优化,以满足燃烧过程中的要求和目标。 通过智慧配煤模型,燃煤发电厂或工业锅炉可以更加智能地选择煤炭配比,以提高燃烧效率,减少排放污染物,并降低能源成本。这种模型的应用可以帮助提高能源利用效率,减少环境影响,并实现可持续发展的目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值