数据收集

数据收集的关键就是 数据多质量高。其中「数据多」表现在:

  • 更多数据源,例如图像 + 声音。
  • 每个数据源更多样本。
  • 每个样本更多特征。

收集的手段可以是:

  • 现有的数据集,例如 ImageNet、COCO。
  • 爬虫爬取之后人工标注,例如利用 AMT。

数据清洗

数据清洗的目的主要可以分成两方面:

  1. 解决数据存在的问题,保证数据质量
  2. 让数据 更适合被后续利用,例如用于数据挖掘、视觉任务、文本任务。

常见的数据清洗手段如下。

一、检查数据是否缺失

检查数据是否有缺失,例如人的属性中缺少性别、年龄等。解决方案就是 补全缺失的信息。补全的手段一般包括:

  • 通过自身的 其他特征 补全,例如根据身份证补全性别年龄、根据时间序列的前后均值进行补全。
  • 通过 其他样本 的数据补全,例如根据用特征维度大部分相同的其他样本的均值替换。
  • 补不全的,可以用一个 表示缺失值的 value 替代。
  • 实在无法补全的,就丢弃掉。

二、检查数据是否重复、冗余

检查数据是否有重复(样本重复特征维度重复),如果有重复,则进行 合并去重

检查数据是否 字段冗余,例如某个字段可以根据其他字段推算出来,如果存在则进行 合并去冗余

检查数据是否某个 字段无关或无用,例如随机生成的 ID,如果存在则进行 字段剔除

三、检查数据是否异常

检查数据是否异常,这里对「异常」的定义就很广了,常见的数据异常包括:

  • 特征的数据类型不合适,例如:
    • 格式不一的字符串 表示时间数据,应该统一为某个类型与格式;
    • 字符串表示类别变量,应该换成数值变量;
    • 空格连接的字符串 表示标签类型的遍历,应该切割该特征维度;
    • 用 float 类型保存计数特征,应该改为 int。
  • 字符串值有问题,例如字符串中掺杂了乱码、前后有多余空格等,需要进行处理。

  • 单位不统一,例如有些身高用厘米作为单位而有些用米,是的话需要进行单位转换;

  • 不符合正常的范围,例如:

    • 「时间」字段是否在某个范围内;
    • 「性别」字段是否是某几个值中的一个;
    • 「年龄」字段是否小于等于 110。

四、检查数据分布是否异常

分析数据,检查数据的分布,可能存在的问题包括:

  • 数据不平衡,例如某个类别的样本特别多,某个特征字段大部分集中在某一个字段;
  • 存在一些 数据错误的离群点,例如类别标错、收集出错等等;
  • 数据维度过高,例如样本总数只有十万,但特征维度超过百万,可行的解决方案包括 特征聚类PCA 降维 等。

检查的常见手段例如:

  • 数据统计分析
    • 画样本类别分布图;
    • 画每个特征维度的特征分布图;
  • 简单聚类,观察离群点是否正常。

对于数据分布上的问题(例如数据不平衡),应该在后续的利用中加以注意。

数据归一化

数据 归一化(Normalization)的目的是 统一了各个特征的尺度(例如某人的年龄 25,身高 180,年收入 200000,不同特征的量级相差太大),这样的好处有:

  • 不同特征对模型的 影响程度 等同,不受尺度影响;

  • 优化过程中不会过多偏向于尺度较大的特征维度(梯度也不受尺度影响),有利于 优化过程的稳定

归一化 的具体做法一般是 先减均值,再除以方差,从而得到均值为 0、方差为 1 的数据分布。注意以下几点:

  • 此步骤中使用的均值、方差是从 训练集 上统计的的。
  • 对于图像数据,可以每个 channel 分别归一化。

数据切割

  • 切割方式一般分为以下几种:
    1. Hold-out:只切一个验证集。
    2. K 折交叉验证K-fold Cross Validation):切割 K 次,每次都会切一个验证集;最后的模型性能评估是这 K 次训练 + 验证的结果。
    3. Leave-one-out Cross Validation(LOOCV):K 折交叉验证的极限版,每次切的验证集数量都为 1。
  • 切割比例看数据规模(Andrew Ng):
    • 对于小数据集(样本数 ~ 10k):7:36:2:2
    • 对于大数据集(样本数 ~ 1m):99:198:1:1

数据存储&加载

  • 将数据转成快速读取的格式(例如 TFRecordlmdb),存入硬盘。

  • 实现数据加载器 DataLoader

  • 验证数据是否正确:
    • 检查样本数量、维度、批次的数量是否正确;
    • 将图片保存到硬盘中,打开查看是否有误。

补充:不同切割集所表示的误差

Andrew Ng 观点

数据切分:

  1. 人类水平(Human Level);
  2. 训练集(Training Set);
  3. 训练-验证集(Train-dev Set);
  4. 验证集(Dev Set);
  5. 测试集(Test Set);

注意,上面的第 2、3 属于同一分布(训练集分布),第 4、5 项属于另一分布(测试集分布)。

他们之间的误差表示的含义: $$ \text{1.人类水平} \overset{\text{偏差}} \longleftrightarrow \text{2.训练集} \overset{\text{方差}} \longleftrightarrow \text{3.训练-验证集} \overset{\text{数据不匹配}} \longleftrightarrow \text{4.验证集} \overset{\text{过拟合}} \longleftrightarrow \text{5.测试集} $$

Zhi-hua Zhou 观点

数据切分:

  1. 数据集(Dataset);
  2. 事实(Truth);
  3. 期望的预测(Expected Prediction);
  4. 实际的预测(Actual Prediction)。

他们之间的误差表示的含义:

$$ \text{1.数据集} \overset{\text{噪声}} \longleftrightarrow \text{2.事实} \overset{\text{偏差}} \longleftrightarrow \text{3.期望的预测} \overset{\text{方差}} \longleftrightarrow \text{4.实际的预测} \overset{\text{泛化误差}} \longleftrightarrow \text{1.数据集} $$

参考