2_2_数据集#

作者: ZhouLong
创建日期: 2026 年 02 月 04 日
版本: 1.0

浏览量:

1. 数据存储方法#

数据存储的方法分为基本文件存储和数据库存储两大类。

特征

基本文件存储

数据库存储

数据结构

通常非结构化或半结构化

高度结构化,有明确模式

数据关系

难以建立和维护数据间关系

支持复杂的关系和关联

查询能力

简单查找,效率较低

强大的查询和检索功能

并发控制

有限,需自行实现锁机制

内置完善的并发控制

数据完整性

需手动保证

通过约束、事务保证

扩展性

垂直扩展为主

支持水平和垂直扩展

1.1 基本文件存储#

基本文件存储是什么?

  • 以文件形式直接存储在文件系统中

  • 常见格式:文本文件(.txt, .csv, .json)、二进制文件、XML等

  • 通过操作系统API进行读写操作

适合使用文件存储的场景

  • 简单的配置文件和日志文件

  • 多媒体文件(图片、视频、音频)

  • 文档和静态内容

  • 数据量小、结构简单的应用

  • 需要直接访问原始文件的应用

CSV#

特点:纯文本格式,易于人类阅读,兼容性极佳

id,name,age,score
1,张三,25,85.5
2,李四,30,92.0
3,王五,28,78.5

适用场景

  • 中小型数据集

  • 数据交换和共享

  • Excel兼容需求

JSON#

特点:结构化格式,支持嵌套。但存储效率低下。一般不作为大量数据的存储方式。

[
  {
    "id": 1,
    "name": "张三",
    "attributes": {
      "age": 25,
      "score": 85.5
    }
  },
  {
    "id": 2,
    "name": "李四",
    "attributes": {
      "age": 30,
      "score": 92.0
    }
  }
]

适用场景

  • API数据交换

  • 配置文件和元数据

  • 嵌套结构数据

FASTA#

特点:专用于生物信息学,简单序列表示。可在名字处添加简单标签。

>seq1 | label1
ATCGATCGATCG
>seq2 | label2
TAGCTAGCTAGC

适用场景

  • DNA/RNA/蛋白质序列

  • 生物信息学研究

  • 标签较为简单的场景

1.2 数据库存储#

数据库存储

  • 通过数据库管理系统(DBMS)组织、存储和管理数据

  • 使用结构化查询语言(SQL)或特定API进行操作

适合使用数据库存储的场景

  • 需要复杂查询和数据分析

  • 多用户并发访问的系统

  • 数据之间有复杂关系

  • 需要保证数据一致性和完整性

  • 需要频繁更新和事务支持

MySQL#

特点:关系型数据库,支持复杂查询,适合结构化数据

-- 创建表
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    score FLOAT
);

-- 插入数据
INSERT INTO users VALUES (1, '张三', 25, 85.5);

适用场景

  • 大规模结构化数据

  • 需要事务支持

  • 复杂查询需求

SQLite#

特点:轻量级嵌入式数据库,单文件存储

-- SQLite使用类似SQL语法
-- 数据存储在单个.db文件中

适用场景

  • 移动应用和桌面应用

  • 小型项目原型

  • 无需独立数据库服务器的场景

2. 数据特征类型#

2.1 离散型特征#

定义:取值有限且不连续的特征,通常表示类别或状态。

示例

  • 性别:{男, 女}

  • 颜色:{红, 绿, 蓝}

  • 产品类别:{电子, 服装, 食品}

嵌入方法

  1. 独热编码(One-Hot Encoding)

原始数据:颜色 = [红, 绿, 蓝, 红]
编码后:
红: [1, 0, 0]
绿: [0, 1, 0]
蓝: [0, 0, 1]
  1. 标签编码(Label Encoding)

颜色 → 数字映射:
红: 0, 绿: 1, 蓝: 2
  1. 嵌入层(Embedding Layer)

  • 深度学习中常用

  • 将离散值映射到低维连续向量

2.2 连续型特征#

定义:取值在某个范围内连续变化的特征

示例

  • 年龄:0-120岁

  • 温度:-50℃到50℃

  • 收入:0-100万元

嵌入方法

  1. 直接输入

  • 适用于数值范围合理的特征

  • 模型直接学习原始数值

  1. 标准化(Standardization) 标准化可以减少不同特征下数据的量纲大小对结果的影响

公式:z = (x - μ) / σ
其中:μ是均值,σ是标准差

示例:
原始数据:[1000, 2000, 3000]
标准化后:[-1.22, 0, 1.22](假设)
  1. 归一化(Normalization) 归一化和标准化的目的是一致的,只是另一种数学实现。

公式:x' = (x - min) / (max - min)
结果范围:[0, 1]

示例:
原始数据:[10, 20, 30]
归一化后:[0, 0.5, 1]
  1. 分箱(Binning) 将连续值转换为离散区间,把无穷的连续空间转化为有限的分类空间,这样的好处是使得训练更加稳定。

年龄分箱:
0-18: 儿童
19-35: 青年
36-60: 中年
60+: 老年

3. 不同模态的数据#

数据有各种各样的模态,不同的模态有对应的特征,以及对应的处理方法。

3.1 图像数据#

特点

  • 高维度(像素矩阵)

  • 空间相关性(邻近像素相关)

  • 颜色通道(RGB, 灰度)

  • 常见格式:JPEG, PNG, BMP

  • 常用模型:CNN, GAN, DDPM(Diffusion)等

3.2 文本数据#

特点

  • 序列数据

  • 语义丰富

  • 长度可变

  • 编码多样(ASCII, UTF-8)

  • 常用模型:RNN, Transformer等

3.3 音频数据#

特点

  • 时间序列数据

  • 频率特征丰富

  • 采样率影响质量

  • 常见格式:WAV, MP3

3.4 表格数据#

特点

  • 结构化行列

  • 混合数据类型

  • 缺失值常见

  • 关系明确

4. 数据预处理#

4.1 缺失值处理#

统计方法

  1. 删除法

  • 删除缺失值所在行/列

  • 适用于缺失比例较小的情况

  1. 填充法 填充法需要根据特定场景来选择合适的方案,没有固定的方法。

常用填充策略:
- 均值填充(数值型)
- 众数填充(类别型)
- 中位数填充(有离群值时)
- 前后值填充(时间序列)
  1. 插值法 插值法同样需要根据特定场景来选择合适的方案,没有固定的方法。

  • 线性插值

  • 多项式插值

  • 时间序列插值

模型生成方法

  1. KNN填充:使用最邻近样本的值填充

  2. 回归填充:用其他特征预测缺失值

  3. 深度学习填充:使用自动编码器等模型

4.2 异常值处理#

检测方法

  1. 标准差法:超出均值±3σ视为异常

  2. 箱线图法:超出1.5倍IQR视为异常

  3. 孤立森林:专门检测异常的算法

  4. DBSCAN聚类:将稀疏点视为异常

处理方法

  1. 删除:直接移除异常样本

  2. 替换:用边界值或统计值替换

  3. 分箱:将异常值归入边界箱

  4. 保留:某些场景下异常值包含重要信息,不需要处理

5. 数据集划分#

5.1 训练集、验证集、测试集解释#

  • 训练集(Training Set) 作用:用于模型训练和参数学习 比例:通常占总数据的60-80% 特点:模型直接从中学习规律

  • 验证集(Validation Set) 作用

  • 用于监测模型训练过程 比例:通常占10-20% 特点:不参与训练,用于模型训练过程的评估

  • 测试集(Test Set) 作用

  • 最终模型的评估

  • 估计泛化能力

  • 报告最终性能 比例:通常占10-20% 特点

  • 只在最终使用一次

  • 模拟真实场景

  • 必须与训练集/验证集无交集,即无数据泄露的情况

一般比例按8:1:17:1:2或者其他都可,没有强制固定

5.2 K折交叉验证#

  • 原理: 将数据集均分为K份,进行K次训练和验证

  • 流程:

  1. 将数据随机打乱并分为K等份

  2. 进行K轮训练验证:

    • 每次用K-1份作为训练集

    • 用剩下的1份作为验证集

  3. 计算K次验证结果的平均值

  • 优点:

  • 充分利用数据

  • 减少随机划分的影响

  • 更可靠的性能评估

K=5折交叉验证示例:
原始数据:100个样本

第1轮:训练集=折2-5,验证集=折1
第2轮:训练集=折1,3-5,验证集=折2
第3轮:训练集=折1-2,4-5,验证集=折3
第4轮:训练集=折1-3,5,验证集=折4
第5轮:训练集=折1-4,验证集=折5
  • 选择K值:

  • 小数据集:建议K=5或10

  • 大数据集:K=3可能足够

  • 计算资源充足:使用较大K值

5.3 比例分割方法#

简单随机分割#

适用场景:数据分布均匀,无特殊要求

# 伪代码示例(仅展示逻辑)
# 假设data包含所有样本和标签

total_samples = len(data)
indices = 随机打乱(range(total_samples))

train_end = int(0.7 * total_samples)
val_end = train_end + int(0.15 * total_samples)

train_indices = indices[:train_end]
val_indices = indices[train_end:val_end]
test_indices = indices[val_end:]

分层采样分割#

适用场景:类别不平衡,需要保持分布一致

保持每个集合中各类别比例与原始数据相同

原始数据:类别A占60%,类别B占40%
→ 训练集:A占60%,B占40%
→ 验证集:A占60%,B占40%
→ 测试集:A占60%,B占40%

时间序列分割#

适用场景:时间相关数据,防止未来信息泄露

按时间顺序划分:
最早70%时间点 → 训练集
中间15%时间点 → 验证集
最近15%时间点 → 测试集

分组分割#

适用场景:同一对象有多个样本,需保证同一对象不在不同集合

同一患者的多张医疗影像:
患者1的所有影像 → 训练集
患者2的所有影像 → 验证集
患者3的所有影像 → 测试集

6. 注意事项#

  1. 随机种子:一般需要设置固定随机种子保证可复现性

  2. 数据泄露:确保三个数据集是无交集的,数据无重复

  3. 备份原始数据:始终保留原始数据副本

  4. 记录划分信息:记录划分方法和参数