数据集加载及数据预处理

作者:禅与计算机程序设计艺术

1.简介

关于机器学习领域中的数据集加载及数据预处理一直是个热门话题,无论是监督学习还是无监督学习都需要将原始数据转化成易于机器学习处理的形式,即特征向量、标签向量或结构化的数据结构。本文对这一模块进行详细介绍。

首先,数据集通常是由各种源头产生的,例如文件、数据库、网络接口等。接着,这些数据要经过清洗、转换、标准化、归一化等一系列的预处理步骤,才能得到更加容易处理的训练数据集。其中,数据划分、分层抽样、缺失值补全、特征工程等方法也需要考虑。

此外,深度学习框架中还提供了许多便利的工具函数和类用于数据预处理,比如:

  • DataLoader:用于加载数据集并通过多线程异步加载。
  • Dataset:自定义数据集类,可继承基类实现自己的逻辑。
  • DataAugmentation:数据增强工具,可用于扩充训练集。
  • FeatureExtractor:特征提取工具,可用于提取图片、文本等数据的特征向量。
  • LabelEncoder:标签编码器,用于将类别变量转化成整数形式。
  • Tokenizer:用于对文本数据进行分词,将文本序列转化成向量表示。

本文主要讨论以上技术的原理和用法。

2. 数据集加载

2.1 文件路径匹配

在数据集加载过程中,最简单的情况就是从本地目录下读取文件。直接指定文件的路径列表即可,如:

file_list = ['data/train.txt', 'data/test.txt'] # 假设文件已经存在

2.2 文件夹路径匹配

另一种方式是将整个文件夹下的文件都作为数据集的一部分,这种情况下,可以使用os模块的walk()函数递归遍历目录,找到所有的文件路径。然后再根据实际需求选择是否保留文件夹名或者其他信息(如文件名、类别标签等)。如下所示:

import os

def find_files(path):
    """查找给定目录下的所有文件"""
    files = []
    for root, dirs, file_names in os.walk(path):
        if len(dirs) > 0:
            print('Ignoring directory:', dirs)
        for name in file_names:
            path = os.path.join(root, name)
            files.append(path)
    return files

file_list = find_files('/path/to/dataset')
print(len(file_list), 'files found.')

2.3 HDF5格式

HDF5是一个基于磁盘的通用型数据存储格式,适合于多种类型的数据,包括多维数组、表格、图像、元数据等。对于具有复杂数据组织的机器学习数据集来说,它比纯文本格式更加高效,可以方便地对数据集进行切片、压缩等预处理操作。

当数据集比较庞大时,采用HDF5格式可能会非常有优势。可以先将数据集转换成HDF5格式,然后利用Python提供的API读入数据,以节省内存。写入HDF5格式的方法可以使用pandas库中的to_hdf()函数,读取则可以使用pandas库中的read_hdf()函数。

以下是一个示例:

import pandas as pd

# 将数据集保存成HDF5格式
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df.to_hdf('my_dataset.h5', key='df', mode='w')

# 从HDF5格式读取数据集
df = pd.read_hdf('my_dataset.h5', key='df')

上面的示例展示了如何保存和读取HDF5格式的数据集。

3. 数据预处理

数据预处理指的是对原始数据进行清洗、转换、标准化、归一化等操作,使得数据变得更加容易理解、分析和处理。这里将简单介绍一些常用的预处理技巧。

3.1 数据划分

数据划分是指将原始数据集按照一定比例划分成训练集、验证集和测试集。通常的做法是按照7:1:2的比例划分,即训练集占70%,验证集占10%,测试集占20%。这样能够使模型训练效果最稳定、模型调参和比较更准确。另外,可以将训练集划分成多个子集,分别用于不同目的,如k折交叉验证、迁移学习等。

数据划分的方法有两种:

  1. 随机划分:最简单的方法是将数据集按行随机排序后,选出前面70%、后面10%作为训练集、验证集,前面10%作为测试集。
  2. 普通划分:也可以根据某个特征(如时间戳)或目标变量,将数据集划分成多个子集。例如,将数据集按照年份划分,每一年对应一个子集,也可以按照用户ID划分,每个用户对应一个子集。这样做有助于使各个子集分布尽可能均衡,防止出现某些子集过于偏向某一类。

3.2 分层抽样

分层抽样(stratified sampling)是一种常用的技术,用来保证每个类别被采样到足够多的数量。通常情况下,训练集应该是完全平衡的,也就是说,每个类别都有相同的数量的样本。然而,现实世界的数据往往并不是完全满足该条件。分层抽样可以帮助解决这个问题。

分层抽样的基本思想是将原始数据集划分成若干子集,每一个子集包含同一类的样本。然后,对每个子集进行普通的随机采样,使得每个类别被抽样到足够大的比例。这样就保证了训练集和验证集之间的类别分布相似。分层抽样的方法有多种,常见的有以下几种:

  1. 不均匀分层采样:这是一种经典的分层采样策略。其基本思想是,首先按比例将原始数据集划分成K个子集,然后对每个子集按照均匀的概率采样,使得每个类别被抽样到足够大的比例。这种方法的优点是生成的子集之间不存在偏斜,但缺点是不允许每个子集独立地反映真实的数据分布。
  2. 一致性分层采样:一致性分层采样是一种较为复杂的分层采样方法,其基本思想是,对原始数据集中的每个类别进行抽样,使得每个类别的样本数量在K个子集中的比例与原始数据集中相同。该方法避免了不均匀分层采样存在的问题,但由于每个子集都包含相同数量的样本,因此无法反映出真实的数据分布。
  3. 单调分层采样:单调分层采样是一种新的分层采样方法,其基本思想是,首先按比例将原始数据集划分成K个子集,然后对每个子集按照同一类别的样本数量和顺序进行排序,确保训练集中各类的样本数量的变化范围没有超过1。

3.3 缺失值补全

数据集中经常会有缺失值,这时候可以使用缺失值补全的方法填补缺失的值。常见的有以下三种方法:

  1. 删除含缺失值的样本:这是最简单、直接的一种方法。但是,如果样本过多,会影响数据集的质量。
  2. 众数填充法:对于离群值较少的变量,可以用众数填充缺失值。例如,用众数(出现频率最高的样本值)填充缺失值。
  3. 插值法:对于连续变量,可以使用插值法进行缺失值补全。比如,线性插值法、最近邻插值法等。

3.4 特征工程

特征工程是指从原始数据中提取有效特征,用作机器学习模型的输入。常用的特征工程技术有以下几个方面:

  1. 组合特征:将多个低维的变量组合成新变量,可有效地增加样本容量并提升模型性能。例如,计算两个变量的和、积、差、比值等。
  2. 多项式特征:对于数值变量,可以通过一组多项式函数将其扩展为多个指标。例如,可以计算变量的平方、立方等幂。
  3. 交互特征:将不同特征组合起来,构成更丰富的特征空间。例如,计算两个变量的乘积、除法之商、余数等。
  4. 文本特征:对于文本数据,可以通过统计、分类、聚类等手段提取有效的特征。例如,计算词频、TF-IDF、关键词、主题模型等。
  5. 图像特征:对于图像数据,可以通过不同的特征提取方法提取有效的特征。例如,计算边缘、纹理、HOG描述符等。

3.5 归一化与标准化

归一化和标准化都是数据预处理的重要环节,用于将数据分布映射到同一尺度或范围内。常见的归一化方法有MinMaxScaler、StandardScaler等;常见的标准化方法有Z-score normalization、Min-max normalization等。

归一化和标准化的区别在于标准化会让数据均值为0,标准差为1,而归一化只是缩放到特定区间,并不会改变数据分布。在实际应用中,可以结合多种方法一起使用,以达到更好的效果。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133504593
今日推荐