机器学习入门系列(2)–如何构建一个完整的机器学习项目,第三篇!

该系列的前两篇文章:

  • 机器学习入门系列(2)–如何构建一个完整的机器学习项目(一)
  • 机器学习数据集的获取和测试集的构建方法

分别介绍了确定项目终极目标、选择损失函数、获取数据以及构建测试集,接下来在进入选择算法和训练模型之前,一个很重要的步骤就是特征工程,它包括了对数据的预处理、特征提取、特征分析以及特征构建等几个步骤,可以说能否训练一个好的模型,除了选择合适的算法,准备好数据也是非常关键的!

由于篇幅问题,所以这篇文章先介绍如何处理缺失值和图片数据扩充的问题,下一篇文章会介绍处理异常值和类别不平衡的问题。


3 特征工程

何为特征工程呢?顾名思义,就是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。

本质上讲,特征工程是一个表示和展现数据的过程;实际工作中,特征工程的目的是去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。

特征工程的重要性有以下几点:

  1. 特征越好,灵活性越强。好的特征的灵活性在于它允许你选择不复杂的模型,同时运行速度也更快,也更容易和维护。
  2. 特征越好,构建的模型越简单。好的特征可以在参数不是最优的情况,依然得到很好的性能,减少调参的工作量和时间,也就可以大大降低模型复杂度。
  3. 特征越好,模型的性能越出色。特征工程的目的本来就是为了提升模型的性能。

3.1 数据预处理

首先需要对数据进行预处理,一般常用的两种数据类型:

  1. 结构化数据。结构化数据可以看作是关系型数据库的一张表,每列都有清晰的定义,包含了数值型和类别型两种基本类型;每一行数据表示一个样本的信息。
  2. 非结构化数据。主要是文本、图像、音频和视频数据,其包含的信息无法用一个简单的数值表示,也没有清晰的类别定义,并且每个数据的大小互不相同。

这里主要介绍结构化数据和图像数据两种数据的数据预处理方法。

3.1.1 处理缺失值

数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失,两者都会造成分析结果的不准确。

缺失值产生的原因
  • 信息暂时无法获取,或者获取信息的代价太大。
  • 信息被遗漏,人为的输入遗漏或者数据采集设备的遗漏。
  • 属性不存在,在某些情况下,缺失值并不意味着数据有错误,对一些对象来说某些属性值是不存在的,如未婚者的配偶姓名、儿童的固定收入等。
缺失值的影响
  • 数据挖掘建模将丢失大量的有用信息。
  • 数据挖掘模型所表现出的不确定性更加显著,模型中蕴含的规律更难把握。
  • 包含空值的数据会使建模过程陷入混乱,导致不可靠的输出。
缺失值的处理方法
  1. 直接使用含有缺失值的特征:当仅有少量样本缺失该特征的时候可以尝试使用;
  2. 删除含有缺失值的特征:这个方法一般适用于大多数样本都缺少该特征,且仅包含少量有效值是有效的;
  3. 插值补全缺失值

最常使用的还是第三种插值补全缺失值的做法,这种做法又可以有多种补全方法。

  1. 均值/中位数/众数补全

如果样本属性的距离是可度量的,则使用该属性有效值的平均值来补全;

如果样本属性的距离不可度量,则可以采用众数或者中位数来补全。

  1. 同类均值/中位数/众数补全

对样本进行分类后,根据同类其他样本该属性的均值补全缺失值,当然同第一种方法类似,如果均值不可行,可以尝试众数或者中位数等统计数据来补全。

  1. 固定值补全

利用固定的数值补全缺失的属性值。

  1. 建模预测

利用机器学习方法,将缺失属性作为预测目标进行预测,具体为将样本根据是否缺少该属性分为训练集和测试集,然后采用如回归、决策树等机器学习算法训练模型,再利用训练得到的模型预测测试集中样本的该属性的数值。

这个方法根本的缺陷是如果其他属性和缺失属性无关,则预测的结果毫无意义;但是若预测结果相当准确,则说明这个缺失属性是没必要纳入数据集中的;一般的情况是介于两者之间。

  1. 高维映射

将属性映射到高维空间,采用独热码编码(one-hot)技术。将包含 K 个离散取值范围的属性值扩展为 K+1 个属性值,若该属性值缺失,则扩展后的第 K+1 个属性值置为 1。

这种做法是最精确的做法,保留了所有的信息,也未添加任何额外信息,若预处理时把所有的变量都这样处理,会大大增加数据的维度。这样做的好处是完整保留了原始数据的全部信息、不用考虑缺失值;缺点是计算量大大提升,且只有在样本量非常大的时候效果才好

  1. 多重插补

多重插补认为待插补的值是随机的,实践上通常是估计出待插补的值,再加上不同的噪声,形成多组可选插补值,根据某种选择依据,选取最合适的插补值。

  1. 压缩感知和矩阵补全

压缩感知通过利用信号本身所具有的稀疏性,从部分观测样本中回复原信号。压缩感知分为感知测量和重构恢复两个阶段。

  • 感知测量:此阶段对原始信号进行处理以获得稀疏样本表示。常用的手段是傅里叶变换、小波变换、字典学习、稀疏编码等

  • 重构恢复:此阶段基于稀疏性从少量观测中恢复原信号。这是压缩感知的核心

矩阵补全可以查看知乎上的问题–矩阵补全(matrix completion)的经典算法有哪些?目前比较流行的算法是什么?

  1. 手动补全

除了手动补全方法,其他插值补全方法只是将未知值补以我们的主观估计值,不一定完全符合客观事实。在许多情况下,根据对所在领域的理解,手动对缺失值进行插补的效果会更好。但这种方法需要对问题领域有很高的认识和理解,要求比较高,如果缺失数据较多,会比较费时费力。

  1. 最近邻补全

寻找与该样本最接近的样本,使用其该属性数值来补全。

3.1.2 图片数据扩充

对于图片数据,最常遇到的问题就是训练数据不足的问题。

一个模型所能获取的信息一般来源于两个方面,一个是训练数据包含的信息;另一个就是模型的形成过程中(包括构造、学习、推理等),人们提供的先验信息。

而如果训练数据不足,那么模型可以获取的信息就比较少,需要提供更多的先验信息保证模型的效果。先验信息一般作用来两个方面,一是模型,如采用特定的内在结构(比如深度学习的不同网络结构)、条件假设或添加其他约束条件(深度学习中体现在损失函数加入不同正则项);第二就是数据,即根据先验知识来调整、变换或者拓展训练数据,让其展现出更多的、更有用的信息。

对于图像数据,如果训练数据不足,导致的后果就是模型过拟合问题,即模型在训练样本上的效果不错,但在测试集上的泛化效果很糟糕。过拟合的解决方法可以分为两类:

  1. 基于模型的方法:主要是采用降低过拟合风险的措施,如简化模型(从卷积神经网络变成逻辑回归算法)、添加约束项以缩小假设空间(如 L1、L2等正则化方法)、集成学习、Dropout方法(深度学习常用方法)等;
  2. 基于数据的方法:主要就是数据扩充(Data Augmentation),即根据一些先验知识,在保持特点信息的前提下,对原始数据进行适当变换以达到扩充数据集的效果。具体做法有多种,在保持图像类别不变的前提下,可以对每张图片做如下变换处理。
    • 一定程度内的随机旋转、平移、缩放、裁剪、填充、左右翻转等,这些变换对应着同一个目标在不同角度的观察结果;
    • 对图像中的元素添加噪声扰动,如椒盐噪声、高斯白噪声等;
    • 颜色变换。比如在图像的 RGB 颜色空间进行主成分分析,得到 3 个主成分的特征向量p1,p2,p3以及对应的特征值λ1,λ2,λ3,然后在每个像素的 RGB 值上添加增量[p1,p2,p3]*[a1λ1,a2λ2,a3λ3],其中a1,a2,a3都是均值为 0, 方差较小的高斯分布随机数;
    • 改变图像的亮度、清晰度、对比度、锐度等。

上述数据扩充方法是在图像空间进行变换的,也可以选择先对图像进行特征提取,然后在图像的特征空间进行变换,利用一些通用的数据扩充或者上采样方法,例如 SMOTE(Synthetic Minority Over-sampling Technique)。

此外,最近几年一直比较热门的 GAN,生成对抗网络,它的其中一个应用就是生成图片数据,也可以应用于数据扩充。

最后,还有一种方法可以不需要扩充数据,利用迁移学习的做法,也是如今非常常用的一个方法,微调(Finetuning),即借用在大数据集(如 ImageNet)上预训练好的模型,然后在自己的小数据集上进行微调,这是一种简单的迁移学习,同时也可以快速训练一个效果不错的针对目标类别的新模型。


小结

数据特征缺失和图片数据的不足都是机器学习任务中非常常见的问题,因此需要好好掌握如何处理缺失值,以及扩充图片数据的方法。


参考:

  • 《百面机器学习》第一章 特征工程
  • 机器学习之特征工程
  • [数据预处理(方法总结)]
  • Python数据分析(三)——数据预处理
  • Python数据分析(二)——数据探索
  • 【Python数据分析基础】: 异常值检测和处理

欢迎关注我的微信公众号–机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!

往期精彩推荐

学习笔记
  • 机器学习入门系列(1)–机器学习概览
  • [GAN学习系列] 初识GAN
  • [GAN学习系列2] GAN的起源
  • [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上)
数学学习笔记
  • 程序员的数学笔记1–进制转换
  • 程序员的数学笔记2–余数
  • 程序员的数学笔记3–迭代法
Github项目 & 资源教程推荐
  • [Github 项目推荐] 一个更好阅读和查找论文的网站
  • [资源分享] TensorFlow 官方中文版教程来了
  • 必读的AI和深度学习博客
  • [教程]一份简单易懂的 TensorFlow 教程
  • [资源]推荐一些Python书籍和教程,入门和进阶的都有!

特征工程之数据预处理(上)相关推荐

  1. 特征工程之数据预处理(下)

    机器学习入门系列(2)–如何构建一个完整的机器学习项目,第四篇! 该系列的前三篇文章: 机器学习入门系列(2)–如何构建一个完整的机器学习项目(一) 机器学习数据集的获取和测试集的构建方法 特征工程之 ...

  2. 机器学习笔记六——特征工程之数据预处理

    特征工程之数据预处理 1. 处理缺失值 2. 处理异常值 2.1 异常值检测 2.2异常值处理 3.离散特征的连续化处理 4.连续特征的离散化处理 5. 处理类别不平衡问题 6. 图片数据扩充 数据预 ...

  3. 【数据平台】sklearn库特征工程之数据预处理

    1.背景: 通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题: 不属于同一量纲:即特征的规格不一样,不能够放在一起比较.无量纲化可以解决这一问题. 信息冗余:对于某些定量特征,其包含的 ...

  4. 多特征值数据预处理_「人工智能」No.6 特征工程之数据预处理

    [导读:当今人类即将或者已然了进入智能时代,这是·情报通·人工智能科普系列第[6]篇文章,欢迎阅读和收藏!] 1 基本概念 "数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 ...

  5. 机器学习 | 特征工程(数据预处理、特征抽取)

    所谓特征工程即模型搭建之前进行的数据预处理和特征提取.有时人们常常好高骛远,数据都没处理好就开始折腾各种算法,从第一开始就有问题,那岂不是还没开始就已经结束了.所以说啊,不积跬步无以至千里,生活中的每 ...

  6. 机器学习系列(3)_特征工程01数据预处理

    参考链接: 1.scikit-learn官网 2.sklearn提供的自带的数据集 3.Kaggle官网 4.数据挖掘--无量纲化 文章目录 一.数据中台 二.sklearn中的数据预处理与特征工程 ...

  7. 机器学习实战——特征工程之数据预处理

    机器学习实战的特征工程主要包含数据预处理.特征构建.特征选择三步,首先来介绍数据预处理. 我选择python作为工具,并将主要用到pandas.numpy等数据工具库.加载库: import pand ...

  8. 特征工程和数据预处理常用工具和方法

    import pandas as pdtrain_data = pd.read_csv("train.csv")train_data.shape #应该是给了property (8 ...

  9. 特征工程之数据预处理与可视化

    文章目录 前言 一.数据导入与查看 二.数据操作 三.可视化 1.显示两个特征的关系 2.热力图 前言 对于数据处理,我们可以运用python的一些库来完成和实现,下面是一些常用的程序代码总结 一.数 ...

最新文章

  1. FPGA之道(79)静态时序分析(五)外部接口的相关时序分析
  2. 九坤投资投身基础科研,携手IDEA成立联合实验室
  3. 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
  4. 前端小问题1——(最近好久没有发博客。。。待续)
  5. ASP 代码给 ASP 页加密码保护
  6. 快速入门 Python 数据分析实用指南
  7. 那些侵占我碎片时间的“强盗”
  8. express 随笔
  9. 油价创6个月新高,石油石化板块还能追吗?
  10. StreamWriter类的一般使用方法
  11. Git与GitHub学习笔记(一)如何删除github里面的文件夹?
  12. 太阳能充电调节代码_永不插电!这款薄膜太阳能动力汽车可连续行驶一个月
  13. 程序员面试金典——1.8反转子串
  14. 用c#算成绩的总和_用c#编写输出成绩的总分和平均分
  15. 计算机网络阶段,计算机网络发展的四个阶段
  16. HTML5在客户端存储数据的方式
  17. matlab 浮动波动率,Matlab计算股票价格波动率
  18. linux mysql免安装版配置_Linux下MySQL免安装版安装配置记录
  19. php原生检测用户,php代码在线测试_php检测用户在线状态的实例代码
  20. 剑指offe【31-67】

热门文章

  1. php如何拼接数组,PHP怎么合并数组
  2. hive安装需要安装mysql区别_HIVE安装系列之一:在Linux中安装mysql,为其作为hive的metastore做准备...
  3. 使用@Autowired注解警告Field injection is not recommended
  4. chart.js绘制精美的数据化图形--入门示例
  5. 为Mac安装homebrew
  6. 正则表达式:去掉数字(整数、小数)前面多余的零
  7. 前端学习(3295):清除effect
  8. react学习(64)--简单的锚点封装
  9. [css] 说说你对table-layout的理解,它有什么运用场景?
  10. [css] 你有用过animation-fill-mode属性吗?它有什么应用场景