Chordia / src /data /README.md
Corolin's picture
first commit
0a6452f

数据预处理模块 (Data Preprocessing Module)

本模块实现了情绪与生理状态变化预测模型的数据预处理功能。

功能特性

  • 数据集类: 处理7维输入和5维输出的数据
  • 数据加载器: 支持训练/验证/测试分割
  • 数据预处理: 标准化、清洗和异常值处理
  • 合成数据生成: 生成符合要求的模拟数据

数据格式

输入特征 (7维)

  • User PAD: Pleasure, Arousal, Dominance (3维) [-1, 1]
  • Vitality: 生理活力值 (1维) [0, 100]
  • Current PAD: 当前状态 Pleasure, Arousal, Dominance (3维) [-1, 1]

输出标签 (5维)

  • ΔPAD: PAD状态变化量 (3维) [-0.5, 0.5]
  • ΔPressure: 压力变化 (1维) [-0.3, 0.3]
  • Confidence: 预测置信度 (1维) [0, 1]

使用示例

1. 生成合成数据

from src.data import generate_synthetic_data, SyntheticDataGenerator

# 便捷函数生成数据
features, labels = generate_synthetic_data(num_samples=1000)
print(f"Features: {features.shape}, Labels: {labels.shape}")

# 使用生成器类
generator = SyntheticDataGenerator(num_samples=1000, seed=42)
features, labels = generator.generate_data()

# 生成特定模式的数据
features, labels = generator.generate_dataset_with_patterns(
    patterns=['stress', 'relaxation', 'excitement'],
    pattern_weights=[0.3, 0.4, 0.3]
)

2. 数据预处理

from src.data import create_preprocessor

# 创建预处理器
preprocessor = create_preprocessor()

# 拟合并转换数据
features_scaled, labels_scaled = preprocessor.fit_transform(features, labels)

# 获取统计信息
feature_stats = preprocessor.get_feature_statistics()
label_stats = preprocessor.get_label_statistics()

# 保存预处理器
preprocessor.save_preprocessor('preprocessor.pkl')

# 加载预处理器
preprocessor = DataPreprocessor.load_preprocessor('preprocessor.pkl')

3. 创建数据集

from src.data import EmotionDataset

# 从numpy数组创建
dataset = EmotionDataset(features, labels)

# 从文件创建
dataset = EmotionDataset('data.csv')

# 获取单个样本
sample_features, sample_labels = dataset[0]

# 获取统计信息
stats = dataset.get_feature_statistics()

4. 数据加载器

from src.data import create_data_loader

# 创建数据加载器
loader = create_data_loader(batch_size=32, shuffle=True)

# 获取所有数据加载器
train_loader, val_loader, test_loader = loader.get_all_loaders(
    data=features, labels=labels
)

# 获取单个加载器
train_loader = loader.get_train_loader(data=features, labels=labels)
val_loader = loader.get_val_loader(data=features, labels=labels)

# 使用合成数据
train_loader, val_loader, test_loader = loader.get_synthetic_loaders(
    num_samples=1000
)

5. 从配置文件加载

from src.data import load_data_from_config

# 从配置文件加载数据
train_loader, val_loader, test_loader = load_data_from_config(
    'configs/training_config.yaml'
)

配置选项

数据预处理配置

config = {
    'feature_scaling': {
        'method': 'standard',  # standard, min_max, robust, none
        'pad_features': 'standard',
        'vitality_feature': 'min_max'
    },
    'missing_values': {
        'strategy': 'mean',  # mean, median, most_frequent, constant, knn
        'knn_neighbors': 5
    },
    'outliers': {
        'method': 'isolation_forest',  # isolation_forest, z_score, iqr
        'contamination': 0.1
    }
}

preprocessor = create_preprocessor(config)

数据加载器配置

config = {
    'batch_size': 32,
    'num_workers': 4,
    'train_split': 0.7,
    'val_split': 0.15,
    'test_split': 0.15,
    'normalize_features': True,
    'normalize_labels': False
}

loader = create_data_loader(config)

数据验证

模块包含完整的数据验证功能:

  • 范围检查: 验证PAD值、Vitality值和置信度在合理范围内
  • 缺失值检测: 自动检测和处理NaN值
  • 异常值检测: 使用多种方法检测异常值
  • 维度验证: 确保数据维度正确

文件结构

src/data/
├── __init__.py              # 模块导出
├── dataset.py               # EmotionDataset类
├── data_loader.py           # 数据加载器工厂
├── preprocessor.py          # 数据预处理类
├── synthetic_generator.py   # 合成数据生成器
└── README.md               # 使用说明

依赖要求

  • torch >= 1.12.0
  • numpy >= 1.21.0
  • pandas >= 1.3.0
  • scikit-learn >= 1.0.0
  • scipy >= 1.7.0
  • loguru >= 0.6.0

测试

运行测试脚本验证功能:

# 在虚拟环境中运行
python simple_test.py

# 完整测试(需要torch)
python test_data_module.py

注意事项

  1. 确保在虚拟环境中安装所有依赖
  2. PAD值范围应在[-1, 1]内
  3. Vitality值范围应在[0, 100]内
  4. 置信度范围应在[0, 1]内
  5. 数据预处理时应先拟合预处理器再转换数据