针对DEAP数据集的情绪识别分类任务,以下是完整的解决方案步骤:
1. 数据预处理
- 加载数据:使用
scipy.io加载.mat文件,提取EEG信号(32通道)和标签(效价、唤醒度)。 - 数据分段:将每个试次的EEG信号分割为4秒的窗口(无重叠或50%重叠),每个窗口对应一个样本。
- 标签处理:根据中位数将效价和唤醒度分为高/低两类,生成二分类标签。
2. 特征提取
对每个窗口的每个EEG通道提取以下特征:
- 频域特征:使用Welch方法计算5个频段(delta、theta、alpha、beta、gamma)的功率谱密度。
- 时域特征:均值、方差、Hjorth参数(活动性、移动性、复杂性)。
- 非线性特征:样本熵(复杂度衡量)。
3. 特征处理
- 标准化:使用Z-score标准化所有特征。
- 降维:应用PCA保留95%的方差,减少特征维度。
4. 分类模型
- 模型选择:使用支持向量机(SVM)和随机森林进行对比,采用网格搜索优化超参数。
- 数据划分:按试次划分训练集和测试集,避免同一试次的数据泄漏。
- 交叉验证:分层K折交叉验证(如10折)确保评估的稳健性。
5. 评估指标
计算准确率、F1分数、AUC等指标,对比不同特征组合和模型的性能。
示例代码
import scipy.io
import numpy as np
from sklearn.model_selection import train_test_split, StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score
from sklearn.decomposition import PCA
from scipy.signal import welch
import antropy as ant # 用于样本熵计算
# 加载数据
mat = scipy.io.loadmat('data/s01.mat')
data = mat['data'][:, :32, :] # EEG通道
labels = mat['labels'][:, :2] # 效价和唤醒度
# 生成二分类标签
valence_labels = (labels[:, 0] > np.median(labels[:, 0])

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



