机器学习笔记(3.1)

机器学习笔记系列文章目录


文章目录

  • 机器学习笔记系列文章目录
  • 第三节
    • 标准库
    • 第三方库
      • 基础模块
      • 机器学习
      • 深度学习平台
    • 使用 pip 安装扩展包
    • 常用镜像源
    • 什么是 Anaconda
    • 为什么要用 Anaconda
    • 如何使用 Anaconda
  • 第四节
    • 思想问题
      • 1. 避免对业务的轻视
      • 2. 明白可以为和不可以为
    • 业务背景与目标
    • 把握数据
      • 1. 是否有数据
      • 2. 有多少数据
      • 3. 是什么样的数据
      • 4. 标签
    • 总结
  • 第五节
    • 找到数据
    • 数据探索
    • 数据清洗
      • 1. 缺失值的处理
      • 2. 异常值的处理
      • 3. 数据偏差的处理
      • 4. 数据标准化
      • 5. 特征选择
    • 构建训练集与测试集
    • 思想准备
    • 总结


第三节

你好,欢迎来到数据挖掘的第三课,今天要讲的内容是 Python 中与数据挖掘有关的扩展包,以及其环
境。
在 02 课时,我简单介绍了 Python 的数据结构和基本语法,让你对其有了一个基本的认识。本课时,
我将从 Python 标准库和第三方扩展库,以及如何搭建 Python 环境入手,让你可以更加顺畅地学好数
据挖掘。
这部分内容有很多知识点可以讲,但详细介绍这些并不是本专栏的目的,我希望你学会的是建设数据挖
掘 Python 环境的基本思路,这样当你遇到对应的问题时,就不必冥思苦想,而是能快速找到适合自己
项目的工具。

标准库

Python 的标准库是其核心的扩展,其中包括了操作系统接口、文件操作、输入输出流、文本处理等功
能。
这里先推荐两个能帮助我们学习常用包的方法:
比如,对 math 模块使用 dir(math) ,可以看到 math 模块里所有方法的名称,结果如下

import math
dir(math)

math 模块里面所有方法的名称图
使用 help(math),可以看到 math 模块的描述,以及各个方法的介绍, 结果如下:

import math
help(math)

math 模块的描述图
在写代码的时候如果忘记某个功能的名字或者不知道有哪些功能,就可以通过上面两个方法去查看。
接下来,我要介绍一下数据挖掘中常用的 6 个模块,及其应用场景,请见下表:

  • 数学模块
  • 日期时间模块
  • 随机模块
  • 文件操作模块
  • 正则匹配模块
  • 系统接口模块

第三方库

除了有应用广泛的标准库,Python 的魅力之一就是拥有庞大的第三方库,代码之丰富,大大简化了大
家开发的过程。这里我列出了在数据挖掘、机器学习项目中一些常用的项目库,如果你对某一个库感兴
趣,想要深入学习,可以先从官网入手了解。当然,第三方库的内容远远不止这么一点,随着工作的深
入,你将会接触到各种各样的第三方库,感受到什么是众人拾柴火焰高。

基础模块

我将给你推荐 4 款常用且功能强大的科学运算基础工具包,请见下表:
名称 含义

  • NumPy Python 语言扩展程序库,支持大量的维度数组与矩阵运算。
  • SciPy
    集成了数学、科学和工程的计算包, 它用于有效计算 Numpy 矩阵,使 Numpy 和
    Scipy 协同工作。
  • Matplotlib 专门用来绘图的工具包,可以使用它来进行数据可视化。
  • pandas 数据分析工具包,它基于 NumPy 构建,纳入了大量的库和标准数据模型。

机器学习

机器学习常用的库也有 4 个,包含了基础数据挖掘、图像处理与自然语言处理常用算法。它们可以支撑
日常工程中的常见算法处理方案,所以非常推荐你使用,请见下表:
名称 含义

  • scikitlearn
    基于 SciPy 进行延伸的机器学习工具包,包含大量的机器学习算法模型,有 6 大基本
    功能:分类、回归、聚类、数据降维、模型选择和数据预处理。
  • OpenCV
    非常庞大的图像处理库,实现了非常多的图像和视频处理方法,如图像视频加载、基
    础特征获取、边缘检测等,处理图像通常都需要其支持。
  • NLTK
    比较传统的自然语言处理模块,自带很多语料,以及全面的传统自然语言处理算法,
    比如字符串处理、卡方检验等,非常适合自然语言入门使用。
  • Gensim
    包含了浅层词嵌入的文本处理模块,以及常用的自然语言处理相关方法,如 TF-IDF、
    word2vec 等模型。

深度学习平台

这里我再介绍 3 个深度学习的平台,你可以根据自己的需求进行了解,请见下表:
平台名称 开发平台 优点

  • TensorFlow 谷歌 相对成熟、应用广泛、服务全面、提供学习视频和其认证计划。
  • PyTorch Facebook 支持更加快速地构建项目。
  • PaddlePaddle 百度 中文文档全面,对于汉语的相关模型比较丰富。

使用任何一个框架都可以构建深度学习项目,在实际的应用中,根据自己的需要进行选择即可。
除了上面介绍的模块,还有很多相关的模块,在这里我就不一一介绍了,等到具体应用时我会针对相应
的算法再讲一些其他的模块。接下来,我们介绍一种模块的安装方法。

使用 pip 安装扩展包

pip 是一个特殊的模块,可以用它来安装扩展包。使用 pip 可以对 Python 扩展包进行查找、下载、安
装、卸载等。在 Python 3.6 中,pip 已经成为一个自带的模块,如果你不确定你的 Python 中是否有该
模块,可以执行以下命令:
升级 pip 到最新版,命令如下:
用 pip 安装扩展包,以安装 TensorFlow 为例,命令如下:

pip install tensorflow 
pip install tensorflow==1.14
pip install tensorflow>=1.14

用 pip 卸载某个模块,命令如下:
在 pip 库中搜索某个模块,命令如下:
用 pip 显示已安装的包,命令如下:
由于某些原因,使用 pip 自带的镜像源可能会出现让你抓狂的下载中断问题,我们可以自己配置成国内
的镜像源。在安装某个模块时,如需临时切换镜像源,命令如下:

pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple

用 pip 更新配置文件,修改默认源,命令如下:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

常用镜像源

镜像源在数据挖掘中也比较常用,我列举了一些常用的,就不一一介绍了,如果你感兴趣可以去了解一
下,请见下表:
镜像名称 网站地址

  • 阿里云 https://mirrors.aliyun.com/pypi/simple/
    中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  • 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
  • 豆瓣 http://pypi.douban.com/simple/
  • 华中理工大学 http://pypi.hustunique.com/simple/
  • 山东理工大学 http://pypi.sdutlinux.org/simple/

由于 Python 方便、好用,所以在机器学习、数据挖掘领域受到了广泛的追捧。但是各种资源代码包层
出不穷,更新的包多、频率快,就会出现缺少对应代码包、版本不兼容等问题,因此选择一款好用的编
辑器就变得非常重要了。
为了避免不必要的问题,我为你推荐一款叫作 Anaconda 的软件。

什么是 Anaconda

Anaconda 是包管理器,也是环境管理器,更是 Python 的编辑器。其致力于为用户提供最便捷的方式
来使用 Python,进行数据科学计算和机器学习。这个免费的软件安装起来非常方便,涵盖的源码包、
工具包之多,以及适用的平台之广,使得该软件在安装、运行和升级等复杂的科学数据运算和机器学习
环境方面变得极其简单。
当前流行的三个开源软件库 sklearn、TensorFlow 和 sciPy 都支持 Anaconda,不仅如此,你还可以在
网上找到该软件的 免费交流论坛,随时进行讨论学习。
因为这是一个开源的工具,所以它拥有众多用户。许多数据科学运算工程都在使用 Anaconda,其中不
乏一些大公司的项目,例如 Amazon Web Services’ Machine Learning AMIs、Anaconda for
Microsoft on Azure and Windows,等等。

为什么要用 Anaconda

当我第一次接触到 Anaconda 的时候,就被它深深地吸引了,它很大程度上解决了我之前提到的
Python 资源更新多且快的痛点。

  • 依赖包安装方便
    预装 150+ 依赖包,提供 250+ 可选开源依赖包,可以直接使用命令 conda install,也可以使用
    pip install 命令安装,非常方便。甚至可以使用 conda build 来构建你自己的依赖包,之后把它上
    传到 anaconda cloud、PyPi 或者其他的资源站上面,分享给大家使用。
  • 多平台支持
    在日常使用的 Linux 系统、Windows 系统和 MacOS 系统上都有对应的 Anaconda 版本,不管是
    32 位还是 64 位都是可以的。不光如此,还有图形界面版本,对使用图形桌面系统的同学很友好
  • 多环境切换
    使用 Anaconda 可以依据不同的项目依赖构建多套互不干扰的环境,随时切换,而不用担心各个
    环境之间的冲突。

不仅如此,使用 Anaconda 配置好的环境还可以进行打包储存,迁移项目到其他机器上的时候,只需要
把打包的环境一并移到新的服务器上,就可以一键安装整个已经配置好的环境,不需要再重新建设了,
非常方便。
你现在一定迫不及待地想要使用 Anaconda,下面我就来介绍一下它的常用功能。

如何使用 Anaconda

进入 Anaconda 的官网,根据自己的需求下载对应的 Anaconda 版本。
本课时我就以 64 位的 Windows 版本为例,给大家演示如何安装 Anaconda。
安装的过程是傻瓜式的,基本上是一路 “Next” 和“I agree”就可以结束了。如果你想使用命令行安装模
式,那么可以选择 shell 命令来进行控制,也是十分简单的。
安装完成后,我们打开 Anaconda 的 Navigator,可以看到如下的界面。
这里会有一个初始化的环境 base。除了环境配置以外,内部还搭载了很多实用的模块,包括 Jupyter
Notebook、Spyder、Qt Console 等,对这些内容我就不再做详细介绍了,感兴趣的同学可以去官网了
解学习。
如果我们想使用这个界面工具去创建环境,可以切换到 Environments 的 tab 页:
Environments 的 tab 页图
你可以使用页面下方的 Create 按钮去创建一个新的环境,也可以用命令行的方式创建,具体操作如
下:
(1)在命令行中配置 Anaconda 环境;
(2)在 Windows 中打开命令行工具 CMD; (3)使用 conda 创建一个环境,执行命令如下。

conda create --name python-my python=3.7

接下来就是自动安装环节,静静等待安装完成,然后来激活这个环境,命令如下:
激活之后,这些配置环境变量的内容就生效了,命令也都可以直接使用。如果要安装一些包,可以直接
使用 Anaconda 的命令代替 pip,比如:
如果我们想要切换到其他的环境,可以使用下面的命令来注销当前环境:
完成注销之后再使用激活方法来激活新的环境。
如果你想看一下电脑上有没有其他的环境,可以使用以下命令:
在环境已激活的情况下使用 conda 导出已有环境,导出命令如下:

conda env export > environment.yaml

在创建环境的时候,直接使用移到其他服务器上的 yaml 文件即可:

conda env create -f environment.yaml

激活环境,然后打开 Spyder 试试前面是否已经安装成功了,执行命令如下:

import numpy as np 
import matplotlib.pyplot as plt 
labels = ['G1', 'G2', 'G3', 'G4', 'G5'] men_means = [20, 35, 30, 35, 27] 
women_means = [25, 32, 34, 20, 25] 
men_std = [2, 3, 4, 1, 2] 
women_std = [3, 5, 2, 3, 3] 
width = 0.35 
fig, ax = plt.subplots() 
ax.bar(labels, men_means, width, yerr=men_std, label='Men') 
ax.bar(labels, women_means, width, yerr=women_std, bottom=men_means, label='Women')

如果成功运行,将在界面右侧的输出框显示一个柱状图:
柱状图
总结
这一课时,我主要介绍了 Python 的标准库和扩展库中常用于数据挖掘的功能模块,然后讲了使用
Anaconda 来搭建环境的方法。
整个内容涉及的东西比较多,对每一个知识点的介绍也都比较粗略,但是希望大家能够在脑海中有一个
印象,就是我们使用 Python 可以做什么,这样就不会在遇到问题的时候没有想法了。如果你在日后的
工作中遇到了问题,知道去哪里寻求解决问题的方法,我觉得本课的目的就达到了。
如果你对里面的某些模块很有兴趣,可以去他们的首页上进行详细的了解,也可以在网上找一些学习资
料,如够买相关书和课程,也欢迎你在留言区写下你的问题,与我和其他同学一起讨论。

第四节

从这一课时开始,我们就要学习数据挖掘的具体步骤了。
这里面的每一个步骤看似都是循规蹈矩的,但是在实际的工作中,通常都会有各种各样的限制,遇到各
种各样的问题,我会尽量把自己工作中的一些惨痛经历和教训总结出来。如果你看后能有一点点感悟或
者收获,甚至可以给你带来一点点快乐,那我的痛苦就没有白费。
根据 CRISP-DM(Cross-Industry Standard Process for Data Mining,跨行业数据挖掘标准流程)这
个前人总结的方法论,我们在开始做数据挖掘的时候需要有一些前置的准备。

这些准备有两个方面:业务理解和数据理解。
数据挖掘是一种方法,在这个方法中虽然说技术是一个重点,但归根到底,你的方法要去解决问题,空
有技术而没有问题是没办法去实施方法的。所以,在开始数据挖掘的时候,要确保你对业务及其数据有
充分的理解。如果你仅仅按照自己的想法,而没有对业务与数据进行充分理解,很可能导致你的理解与
业务有较大的偏差,所做出的结果与业务的需求不符合导致返工,或者是因为对数据的了解不全面导致
缺乏关键数据而影响最后的结果,甚至是任务难以进行,最后项目流产。
经过这一步的准备,要明确你对于要解决的问题的所有可知信息。但是,要想真的理解业务、理解数
据,我觉得还有一个更重要的,那就是思想准备,所以,在这里我把前置准备分成了三项:思想问题、
业务背景与目标、把握数据。

思想问题

1. 避免对业务的轻视

要做什么样的人,要先去按照那样的人去思考,而不是要先像那样的人。比如,你要健身减肥,很多人
都是先去买一套健身服装、健身器材,然后办一张健身房卡,但是自己的思想并没有转变成一个健身人
士的思想,那么最终健身减肥的效果也就可想而知了。所以你做数据挖掘,一定要避免这样的思想问题
——我学了很多的算法,穿着程序员的衣服,背着程序员的电脑,我就是一个优秀的数据挖掘工程师
了。
这个事情看起来好像很容易,很多人会说:“我当然知道业务的需求是什么样的,不然我干吗要做数据
挖掘呢?”
在实际的公司组织中,有些公司的数据分析师或者算法工程师是与业务部门在一起的,而有些则是分开
的。其实不管是否在同一个部门,如果数据挖掘人员没能够真正理解业务场景与挖掘需求,很有可能会
与业务人员产生分歧,以至于你觉得做了很多的工作,每天都加班加点,你的挖掘项目充满了技术含
量,数据充分、算法丰富、结果翔实,最后业务却不认账,说你做得不好,效果没有达到预期,做出来
的东西对业务的价值不大。

轻视业务是很容易犯的问题。
我在刚做这些工作的时候也犯过不少类似的错误。一个业务方提需求,而我也没有仔细去询问业务的真
正想法,按照我自己对业务的理解去做模型。最后呢,如果拿准确率这样的线下指标去看似乎效果很不
错,但是放进业务去做测评却无法满足业务的需要,导致不得不推倒重做。
所以要始终牢记,数据挖掘的本质是一种方法,这个方法要去解决问题,一定要源于业务需求,服务业
务需求。如果脱离具体业务去做,那做得再好、再漂亮也没有太大的价值。
如果要做一个成功的数据挖掘项目,你就要去深入学习业务,明白业务的关键点,在项目的需求阶段与
业务方进行充分的沟通,在发现偏差时及时调整,甚至在制定 OKR 的时候也与业务方来共同制定,这
样在做项目的时候才不会出现南辕北辙的问题。不要觉得你是一名技术人员,学习业务对你帮助不大。

2. 明白可以为和不可以为

做技术,有一个很容易进入的误区,那就是相信 “技术万能”,技术可以解决一切问题。一个业务需求来
了,你明白了业务的要求以及目标,还需要明白数据挖掘要解决的点在哪里。 “技术万能” 的工程师会相信数据挖掘或者说算法可以解决任何问题,对于各种各样的难题,认为只要有
数据就可以解决。
然而事实上,技术在业务上绝不是万能的,甚至由于公司不同、业务不同、流程不同,所做的数据挖掘
流程和数据挖掘目标也千差万别。
比如说你在做一个 OTA 酒店消歧的项目,在酒店业务中有一个痛点就是不同的供应商提供的酒店信息
可能存在一些区别,以至于需要消耗大量的人工去做比对决策。
这个问题场景看似很符合数据挖掘的解决范畴,然而实际上却有各种各样的情况:

  • 数据可能是残缺的导致无法使用算法处理;
  • 不同供应商提供的同一家酒店名称可能是中文,可能是英文,甚至是日文、法文、泰文,不同语种
    间无法使用同样的模型来解决,而如果每一个语种都做一个模型又没有足够的数据做支撑;
  • 不同的供应商提供的信息可能是不对等的,有的供应商会提供电话和邮件,有的则没有这个字段,
    然而这些对准确率影响也很大,这也无法使用一套解决方案来完全解决所有问题
    总结一下,说数据挖掘不是万能的主要有两个原因。
    第一个是数据不完美。
    虽然数据挖掘的理念很美好,但现实总是残酷的,完美的数据是不存在的,至少现在是不存在的。每一
    个公司都只是掌握了部分数据,有些甚至没有多少数据,还需要去外面爬取数据来进行处理。从总体上
    来看,似乎我们的数据量很大、很充足,但数据的真实性、准确性、完整性具体到每一条数据的时候或
    者某一个需求的时候,是不完美的,甚至是匮乏的。你要解决这些问题需要付出大量的工作,甚至超出
    了业务本身,这就会造成入不敷出的情况,这个项目开展的必要性可能就要受到质疑了。
    第二个是业务条件不完美。
    数据挖掘项目通常都是跨团队的协作项目,譬如说我带领的数据挖掘部门既不生产数据,也不存储数
    据,但是我们却是对数据处理应用最多的部门,这当然有赖于业务部门以及其他技术部门之间的配合和
    协作。
    再说上面那个酒店业务的例子,如果我们投入大量的人力,比如说经过长达一年的研究和调试,当然可
    以产出一个效果更好的模型,甚至是直接输出结果。然而这个周期对于业务来说太久了,业务没有办法
    等待一年以获得一个足够好的结果。况且由于数据的限制,这一年后半段时间的努力可能只有很小幅度
    的提升。所以我们又跟业务进行了更深入的讨论,以更改目标,最后确定了目标是提升酒店运营人员的
    效率,而不是直接输出一个完整的结果。
    这样我们就可以在三个月甚至是更短的时间内产出一个效果还不错,而业务也可以使用的模型方案,同
    时加入业务开发的一些流程,最后我们的项目降低了酒店运营 60% 的人力成本。
    所以说,数据挖掘只能在有限的资源与条件下去提供最大化的解决方案,不要忘记我们的初衷,去解决
    业务需求,而不是以 “技术万能” 为导向,最终导致项目陷入泥潭消耗过大,甚至是项目流产,而偏离了
    我们解决业务问题的初心。
    要避免这种问题的产生,需要与业务方进行深入的沟通,同时对你所掌握的数据有充分的认识,对业务
    的难点和重点有明确的区分。建立需求多方评估机制,让业务专家与技术专家参与进来,评估需求的合
    理性以及你的数据情况,确认问题是否可以通过数据挖掘得到有效解决;或者是对需求进行拆解,以最
    大化在数据限制和业务限制前提下的项目效果。

业务背景与目标

解决了上面两个想法上的误区后,要明确你的业务需求就变得相对简单了。因为你的思想已经发生了变
化,你已经是一个具备业务视角的数据挖掘工程师了。
自然而然的,你在进行数据挖掘之初就要去明确业务背景和业务目标,更好地契合业务的需要。
数据挖掘是一种方法,需求的产生必然是因为某种分析需求、某个问题或者某个业务目标的需求。如果
你一开始就不能对问题进行准确的定位,那么后面该如何使用合适的数据选择合适的算法,都是无稽之
谈。
假设你现在是一个自媒体平台,自媒体作者会在上面发布文章,很多用户会来看这些内容,从而产生互
动行为,比如说点赞、收藏、分享、评论等。这些会刺激作者继续创作,而作者持续发布好内容又会吸
引更多的用户来浏览,在这个环节中,作者的贡献是一个重要的部分。
所以这里业务提出了一个需求,要对发布内容的自媒体做一个贡献度评级模型。这个目标虽然确定了,
但是这个贡献度到底该如何去衡量?对于一个作者来说,他的贡献度体现在他的内容上,但是 CTR(点
击率)高的内容贡献度高,还是有独特观点的内容贡献度高?或是能引发讨论的内容贡献度高,还是技
术深度更深的内容贡献度高?是发布内容的频率高贡献度高,还是发布的内容够长贡献度高?这里面还
有很多需要思考的事情。
如果数据挖掘工程师自行去理解业务,那很可能出现偏差,和业务方的需求产生分歧。所以这时你就应
该展开沟通,并成立专家小组来对目标进行评审。
在沟通的过程中了解到,我们的业务背景是在打造品牌影响力的时候,发现很多用户对我们的内容产生
了质疑,因为有些作者为了提升自己的点击率,故意使用一些标题、低俗图片等手段,并且频繁地生产
无意义的内容,造成了用户的反感。在这样一个背景下,你的业务方希望能够对作者形成一种分级制
度,让那些写有深度、有内涵内容的作者能够被评为更高的级别,而那些标题党作者的级别则会降低。
那么接下来,我们对数据的收集就要围绕着这个点去展开了

把握数据

在核对好需求之后,紧接着你就要对数据来进行了解,这一步有点类似可行性分析。巧妇难为无米之
炊,如果你的数据无法支撑挖掘需求,那这件事也就没办法解决了。
所以作为一个数据挖掘工程师,还需要对你要用到的数据了如指掌。收集、存储、转换数据都是十分重
要的环节,如果这些环节存在问题,那么整个项目的进度都会被拖慢。
在这个步骤中,你要考虑所有可以用到的数据,哪些可以用来做你的模型,可以用来回答业务的问题,
哪些对这个需求来说是没有什么价值的。
数据的质量、数量、可靠性、完整性,以及部分数据缺失是否会导致模型的效果不好,某些关键数据是
否会严重影响业务问题等,这些问题都是你需要搞清楚的。
从粗粒度到细粒度,你对数据的认知应该有这样几个层级。

1. 是否有数据

是否有这样一个数据集来支持你做这样一个模型,来完成这样一个需求,来回答业务的问题。

2. 有多少数据

光有数据还不行,还得看到底有多少数据,是一条、十条,还是一万条、一亿条,数量的不同也会影响
你的处理方式。

3. 是什么样的数据

亦或者说,你的数据都有哪些属性可以被用到。比如上面的例子,一条数据就是一个作者所写的一条内
容、各种互动指标等信息。到了这一层,你需要考虑的是这些维度是否可以支持完成业务需求,是否与
所提出的问题有关系。

4. 标签

这个是针对特定的项目,比如说有监督学习任务,那么每条数据都需要有结果的标注,这也是你的模型
或者算法要学习的结果。如果只有数据,而没有对应的标签标注,那机器学习也是比较困难的。
确认了这些数据的问题后,你才可以说对数据有了初步的了解,接下来,可以按部就班地进行下一步:
准备数据了。
看完了这一课时的内容后,不知道你是不是改变了对数据挖掘的看法?想想自己做的业务需求是什么样
子的,你是否能做好对应的准备呢?如果你是业务方,那又该如何跟工程师做好沟通呢?

总结

这一课时讲解了数据挖掘步骤的第一步,如果用一个词来总结的话,那就是 “做好准备”。这里所讲的准
备分成三个方面:

  • 思想准备,确保自己已经具备了一个专业的数据挖掘工程师的思维模式;
  • 理解业务,确保与业务需求方的充分沟通,对业务需求的充分理解,知道什么可以做,什么不可以
    做;
  • 理解数据,确保对可以掌握的数据有全面的了解,知道哪些数据有用,哪些数据没用。

第五节

本课时,我将为你介绍数据挖掘操作流程的第二个环节,准备数据。
在对业务和数据有了清醒的认识之后,你就要开始收集、处理数据了。这个环节看起来好像是一个非核
心环节,实际上在整个过程中却是最重要、最耗时的环节。
就如 2008 年北京奥运会的成功离不开城市规划、场馆建设、志愿者招募等一系列准备工作一样,数据
准备在数据挖掘中同样也承担着这样一个重要的角色。原始的数据通常不可能跟你的算法所适配,而且
其本身也存在着各种各样的问题,如不够准确、格式多样、部分特征缺失、标准不统一、特殊数据、错
误数据等,这些问题都将在一定程度上影响你后续算法模型的训练和实施。
为了避免上述麻烦,我将带你一步步避坑,准备出合适模型的数据。

找到数据

在一个公司中,数据往往会有很多的存在形式,比如它们所属的业务部门不一样,使用的数据库类型就
可能不一样,存储数据的方式也有可能不一样等问题。所以,对于你要做的项目来说,就可能需要很多
不同来源的数据。你要知道每个项目需要什么数据,并从哪里获取。尽管在一些大的公司存在数据平台
部门、数据仓库部门,但这仍然不能保证你所需要的数据只用一种方法就能获取到。所以在这一步,可
能需要你掌握一些数据库的使用技巧,如常用的关系型数据库 MySQL、大数据使用的 Hbase、Hive、
搜索引擎数据库 ES、内存数据库 Redis,还有图数据库,如 Neo4j 或者 JanusGraph 等,甚至还要跟
各种业务部门沟通协商以获取数据。数据库的内容我就不在本课时中一一介绍了,如果感兴趣你可以去
官网深入了解。
当你从各种地方收集到所需要的数据之后,最好是能够把它们进行简单的整理,如用统一的 id 把数据
整合在一起等,以便后面查询和使用。
准备好需要的数据后,就要对它们进行一系列的加工,从而达到后期训练模型的要求。

数据探索

在该阶段,为了尽可能获得足够多的特征,你要对数据进行分析、预处理以及转换等基础工作,以构建
出更加贴合你所要预测结果的特征,这使得数据维度大量扩展,所以我把这个环节叫作把数据变多或者
数据升维。
假设你要做一个给新闻内容分类的项目,已经从数据仓获取了新闻内容、新闻标题、新闻发布时间等数
据,并从运营部门获得了运营给这些新闻标注的分类数据。这时候你要做的就是把数据变多,可以进行
如下操作:

  • 把内容进行分词,这样就获得了一个分词后的字段;
  • 把分词后的内容进行词语的统计,看看哪个词出现得更多;
  • 同样地把标题进行分词,进行词语的统计;
  • 还可以对词语的词性进行标注,获得一份词性数据;
  • 你可以找到一些特殊的词,比如名人的名字、机构的名字、地点的名字等一些信息。
    通过这些处理,可以看到你的数据是否存在问题,比如异常值、数据的偏差、缺失,等等。如果是数值
    型的数据,还可以通过计算均值、方差、中位数、标准差、最大值、最小值等去探索、扩展。
    有了足够多的数据,接下来就要对其进行整理,提取对项目最有用的部分。

数据清洗

终于讲到了这个,在整个数据准备,甚至是整个数据挖掘过程中,最烦琐、最头疼的步骤——数据清
洗。如同你打扫卫生时,会把不需要的东西扔掉,需要的东西留下来摆放整齐一样,数据清洗步骤就是
要做这样一个工作,处理扩展后的数据、解决所发现的问题,同时又要顾及处理后的数据是否适合应用
于下一个步骤,所以我也把这一步骤称作把数据变少。
数据清洗主要包含如下 5 个方面的内容:

1. 缺失值的处理

在美好的童话世界中,我们的数据都是完完整整的,拿来即用。实际上,在工作中最常见的一个问题就
是数据的缺失,比如一条新闻可能只有正文没有标题、发布地点、发布时间等任意数据。你需要区分这
些数据缺失的情况,因为有些是业务所允许的缺失,而有些则是错误情况导致的。通过分析,了解数据
缺失的原因以及数据缺失的影响范围,这会关系到你后面如何来处理缺失值。
关于缺失值的处理,一般就 3 种情况:删掉有缺失值的数据;补充缺失值;不做处理。当然这些处理方
式也依赖于数据是否可以被补充、缺失值是否重要,以及你所选用的算法能否处理缺失的情况等因素。

2. 异常值的处理

异常值通常说的是那些与样本空间中绝大多数数据分布差距过大的数据,这些数据的产生通常有 2 种情
况:

  • 错误的情况,比如医院录入病人病历的时候,忘了给数字输入小数点,导致某个人的身高显示为
    173 米,等等;
  • 正常的情况,就需要重视了。比如在平均充值为 100 元的游戏中,有人充了 100 万元,这是一个
    真实的结果,但是如果直接使用到模型中可能会影响到平均值的计算,影响模型训练的效果;再比
    如只有 1000 万在线用户的 App ,突然拥有十亿的在线用户,这就有可能是应用网络受到了攻
    击,等等。
    不同情况的异常值有不同的处理办法:
  • 数据本身的错误,需要对数据进行修正,或者直接丢弃;
  • 数据是正确的,需要根据你的业务需求进行处理。如果你的目标就是发现异常情况,那么这种异常
    值就需要保留下来,甚至需要特别关照。如果你的目标跟这些异常值没有关系,那么可以对这些异
    常值做一些修正,比如限定最大值和最小值的标准等,从而防止这些数据影响你后面模型的效果。

3. 数据偏差的处理

这也是非常常见的问题。没有什么数据是非常对等和均衡的,越是天然的数据越是符合正态分布的规
律。比如 UGC 内容(User Generated Content,用户生成内容)的质量,质量较差的内容占大多数,
质量好的占少数,质量非常好的是少之又少。这是一种正常的现象,但是对于算法模型来说,有些算法
会倾向于预测占比较大的数据,比如说质量好的内容只占 2%,而质量差的内容占到了 98%,模型倾向
于给出质量差的结果。如果给出所有的结果都是 “差”,那该模型的准确率也能达到 98% 了,可这并不
是我们想要的结果。
数据偏差可能导致后面训练的模型过拟合或者欠拟合,所以处理数据偏差问题也是你在数据清洗阶段需
要考虑的。如果你需要比较均衡的样本,那么通常可以考虑丢弃较多的数据,或者补充较少的数据。在
补充较少的数据时,又可以考虑使用现有数据去合成一些数据,或者直接复制一些数据从而增加样本数
量。当然了,每一种方案都有它的优点和缺点,具体的情况还是要根据目标来决定,哪个对目标结果的
影响较小就采取哪种方案。

4. 数据标准化

在处理完数据的问题之后,你就该对数据的标准进行整理了,这可以防止某个维度的数据因为数值的差
异,而对结果产生较大的影响。在有些算法中,每一个维度的数据标准都需要进行统一;而在另外一些
算法中,则需要统一数据的类型。比如在预测一个地区的房价时,房屋的面积可能是几十到几百的数值
范围,房屋的房间数可能是个位数,而地区平均单价可能是以万为单位的。一个处理方法是你把这些维
度的数据都进行标准化,比如把这些数据都规范到 0~1 的区间,这样使用不同的单位来衡量的数据就变
得一致了

5. 特征选择

特征选择就是尽可能留下较少的数据维度,而又可以不降低模型训练的效果。一个项目中,数据的维度
可能会有成百上千,比如一个文本中,每一个词或者每一个字都是一个维度,那么要用一个向量去表示
一篇文章,这个向量可能需要有上万个维度,所以你要排除掉那些不重要的部分,把重要的部分保留下
来。
也许你会认为数据的维度越多越好,但实际上,维度越多,数据就会越稀疏,模型的可解释性就会变
差、可信度降低。过多维度还会造成运算的缓慢,尤其是一些运算量较大的算法,同时那些多余的维度
可能会对模型的结果产生不好的影响,如某个维度的数据跟结果实际上并没有什么关系,数据也呈现出
一种随机的情况,如果没有把这部分数据排除掉,就可能会对某些算法产生影响。
这个时候就需要用到特征选择的技巧,比如自然语言处理里的关键词提取,或者去掉屏蔽词,以减少不
必要的数据维度。对于数值型的数据,可以使用主成分分析等算法来进行特征选择,如果你对这部分内
容有兴趣,可以在网上找一些资料进行更深入的学习。

构建训练集与测试集

在数据进入模型之前,你还需要对其进行数据采样处理。如果说前面的部分是为了给模型提供一个好的
学习内容,那么数据采样环节则是为了评估模型的学习效果。
在训练之前,你要把数据分成训练集和测试集,有些还会有验证集。

  • 如果是均衡的数据,即各个分类的数据量基本一致,可以直接随机抽取一定比例的数据作为训练样
    本,另外一部分作为测试样本。
  • 如果是非均衡的数据,比如在风控型挖掘项目中,风险类数据一般远远少于普通型数据,这时候使
    用分层抽样以保障每种类型的数据都可以出现在训练集和测试集中。
    当然,训练集和测试集的构建也是有方法的,比如:
  • 留出法,就是直接把整个数据集划分为两个互斥的部分,使得训练集和测试集互不干扰,这个是最
    简单的方法,适合大多数场景;
  • 交叉验证法,先把数据集划分成 n 个小的数据集,每次使用 n-1 个数据集作为训练集,剩下的作
    为测试集进行 n 次训练,这种方法主要是为了训练多个模型以降低单个模型的随机性;
  • 自助法,通过重复抽样构建数据集,通常在小数据集的情况下非常适用

思想准备

准备数据可能是数据挖掘所有环节中,最苦、最累、耗时最长的一环了。由于实际生产中的数据,会存
在各种各样的问题,一如我上面说的,数据缺失、异常、偏差等,而对于数据的准备其实没有一个统一
的标准算法去解决。所以在这个环节,一定要保持认真仔细的态度以及平和的心态,做好数据准备工作
是获得一个好结果的必由之路。
准备数据不是独立存在的过程。不是说,你一次性做完数据准备工作就结束了,后面的模型训练和模型
评估环节与数据准备紧密相关,当你的模型出现错误,结果达不到预期,往往需要重新回到数据准备环
节进行处理,反复迭代几次最终才能达到你期望的目标。

总结

写到这里呢,关于数据准备的工作已经进行得七七八八了,不知道你看完之后是否对准备数据有了一个
比较全面的认识呢?在该环节,我们将走下象牙塔,走进实际的工作当中,处理在现实中数据存在的各
种问题以使得数据达到我们模型算法的要求。
通过这些步骤,可以说数据准备已经比较充分了,数据挖掘中最困难、最烦琐的一个步骤已经结束,接
下来我们就要进入到模型训练的环节了。

你可能感兴趣的:(算法,数学建模,机器学习,python,数据挖掘)