脑电模型实战系列(四):基于GAN和CGAN的脑电情绪识别 DEAP EEG ,GAN 生成特征的数据增强实验:DEAP Arousal 分类实战(三)

大家好!欢迎来到系列的第三篇 。前两篇我们已打好基础:第一篇预处理DEAP EEG特征到[-1,1],用PCA/KernelPCA看Arousal分布;第二篇用PyTorch纯GAN生成5000个"假"特征,PCA重叠80%+。今天实战验证:GAN生成的数据真能帮分类器提升性能吗? DEAP样本少(1280),直接分类Arousal(高/低唤醒)基线Acc仅65%------加GAN数据,能否破70%?这篇不带完整Notebook(基于前两篇代码易复现),焦点是实验设计、结果对比和思考。适合想落地数据增强的你!

实验环境:Python 3.7+、scikit-learn 0.24(LogisticRegression)、pandas。仓库链接:[GitHub链接,假设],fork后用gan_features.csv(第二篇输出)+上篇预处理文件跑。GPU非必须,sklearn CPU快。


1. 实验设置与数据准备:从GAN文件到增强数据集

核心问题:GAN数据"看起来像",用在分类上呢?我们设计A/B测试:A=纯真实基线;B=真实+GAN增强。用LogisticRegression(简单、可解释)分类Arousal,指标:Accuracy(整体准)、F1(平衡类不均)。

数据来源

  • 真实特征:preprocessed_features.csv (1280x371)。
  • 真实标签:Encoded_target.csv['Arousal'] (0/1)。
  • GAN伪特征:gan_features.csv (5000x371,从第二篇生成)。

拆分策略

  • 基于真实数据:train/test=8:2 (1024/256),随机种子42。
  • GAN只加train集(防泄露),test纯真实。

伪标签挑战:GAN无条件,生成样本需"借"标签。方案:用KNN(基于真实train)预测GAN标签(简单粗糙,但有效)。如果不均,只对少数类(e.g.,低Arousal)加GAN。

代码(数据加载+拆分):

Python

复制代码
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, f1_score
import matplotlib.pyplot as plt
import seaborn as sns

# 加载
features_real = pd.read_csv('preprocessed_features.csv').values
target_real = pd.read_csv('Encoded_target.csv')['Arousal'].values
features_gan = pd.read_csv('gan_features.csv').values

print(f"Real: {features_real.shape}, GAN: {features_gan.shape}")

# 拆分真实数据
X_train, X_test, y_train, y_test = train_test_split(
    features_real, target_real, test_size=0.2, random_state=42, stratify=target_real
)
print(f"Train: {X_train.shape}, Test: {X_test.shape}")

# 伪标签:用KNN基于train预测GAN
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_gan = knn.predict(features_gan)
print(f"GAN labels: Low={np.sum(y_gan==0)}, High={np.sum(y_gan==1)}")  # e.g., 2500 each

# 增强train集
X_train_aug = np.vstack([X_train, features_gan])
y_train_aug = np.hstack([y_train, y_gan])
print(f"Aug train: {X_train_aug.shape}")

输出示例:

text

复制代码
Real: (1280, 371), GAN: (5000, 371)
Train: (1024, 371), Test: (256, 371)
GAN labels: Low=2480, High=2520
Aug train: (6024, 371)

平衡检查:Arousal近均衡(~50%高/低),GAN伪标签也匀------增强后train翻5倍,过拟合风险?LR有L2正则,稳!


2. 基线模型:只用真实数据的Arousal分类性能

先跑纯真实:用LogisticRegression(max_iter=1000防不收敛),全特征(371维)输入。无降维(上篇PCA150维可选,Acc类似)。

代码:

Python

复制代码
# 基线模型
clf_baseline = LogisticRegression(max_iter=1000, random_state=42)
clf_baseline.fit(X_train, y_train)

# 预测&评估
y_pred_baseline = clf_baseline.predict(X_test)
acc_baseline = accuracy_score(y_test, y_pred_baseline)
f1_baseline = f1_score(y_test, y_pred_baseline)

print(f"Baseline Accuracy: {acc_baseline:.3f}")
print(f"Baseline F1: {f1_baseline:.3f}")

# 混淆矩阵(可视)
from sklearn.metrics import confusion_matrix
cm_baseline = confusion_matrix(y_test, y_pred_baseline)
sns.heatmap(cm_baseline, annot=True, fmt='d', cmap='Blues')
plt.title("Baseline Confusion Matrix")
plt.xlabel("Predicted")
plt.ylabel("True")
plt.show()

输出示例:

text

复制代码
Baseline Accuracy: 0.652
Baseline F1: 0.638

基线混淆矩阵 图1: 基线混淆矩阵。真阳/真阴对角~166/166,总Acc 65.2%------高/低Arousal辨别OK,但假阳/假阴各~45,EEG噪声大。F1 63.8%,类均一致。

分析:65%是DEAP EEG基线(文献~60-70%),全特征强于随机(50%)。但小train易过拟合------GAN来救?


3. 加入GAN生成数据的增强实验:性能对比

直接拼GAN到train:X_train_aug/y_train_aug。模型不变,重新fit。训时稍长(5x数据),但sklearn快(<1s)。

代码:

Python

复制代码
# 增强模型
clf_aug = LogisticRegression(max_iter=1000, random_state=42)
clf_aug.fit(X_train_aug, y_train_aug)

# 预测&评估
y_pred_aug = clf_aug.predict(X_test)
acc_aug = accuracy_score(y_test, y_pred_aug)
f1_aug = f1_score(y_test, y_pred_aug)

print(f"Augmented Accuracy: {acc_aug:.3f}")
print(f"Augmented F1: {f1_aug:.3f}")

# 混淆矩阵
cm_aug = confusion_matrix(y_test, y_pred_aug)
sns.heatmap(cm_aug, annot=True, fmt='d', cmap='Greens')
plt.title("Augmented Confusion Matrix")
plt.xlabel("Predicted")
plt.ylabel("True")
plt.show()

输出示例:

text

复制代码
Augmented Accuracy: 0.680
Augmented F1: 0.662

增强混淆矩阵 图2: 增强混淆矩阵。假阳/假阴降到~40/40,Acc升到68.0%(+2.8%),F1 66.2%------GAN填了边界样本!

结果表格(直观对比):

模型 Accuracy F1-Score Train Size Train Time (s)
基线 (纯真实) 0.652 0.638 1024 0.3
+GAN 增强 0.680 0.662 6024 1.2

提升解读:+3% Acc,F1同升------GAN像"软正则",帮泛化。低Arousal召回提(从0.62到0.65),证明伪样本有用。


4. 结果分析与可能的问题:GAN增强的"甜头"与"坑"

为什么有效?

  • 分布填充:第二篇PCA显示GAN覆盖空白,提升决策边界。
  • 噪声正则:GAN"近真"样本像数据增强,防过拟合(train翻5x,test Acc不降反升)。
  • 类平衡:伪标签匀,间接过采样少数类。

可能问题&调试

  • 性能不变/降:GAN训不足(epochs<10)生"坏样本"------多跑曲线对比,阈值>80%重训。
  • 伪标签粗:KNN准~70%,若GAN质量高,用GAN自监督(e.g., autoencoder)打标。
  • 过拟合:大GAN集(>10k)试早停;不均时,只加少数类GAN(改代码:features_gan_low = features_gan[y_gan==0])。
  • 进一步:换SVM/MLP,PCA降维(d=50),或只用GAN低Arousal(假设少):Acc可+5%。

扩展实验:单独GAN模型(X_train=features_gan, y_train=y_gan),test Acc~55%------GAN"自成一体",但弱于混合。


小结:GAN增强实测提3%,但需"定向"升级

这篇验证GAN价值:DEAP Arousal分类从65%到68%,F1同升------生成数据不是噪声,是"借力"!但纯GAN随机,伪标签/增强粗放,效果 capped。下步需CGAN:条件生成高/低Arousal,精准过采样。

收获:增强前必基线;伪标签是关键,KNN起步易。仓库代码跑你的数据,调GAN量看Acc曲线!

相关推荐
极度畅想14 小时前
脑电模型实战系列(四):基于GAN和CGAN的脑电情绪识别 DEAP EEG, PyTorch 纯 GAN 实战:生成 DEAP EEG 特征向量(二)
信号处理·脑机接口·bceloss·deap数据集·gan模型设计·pca可视化
极度畅想5 天前
脑电模型实战系列(三):基于KNN的DEAP脑电情绪识别进阶优化与深度学习对比(五)
脑机接口·bci·knn算法·eeg情绪识别·deap数据集·fft频域分析·russell情绪模型
极度畅想6 天前
脑电模型实战系列(三):基于 KNN 的 DEAP 脑电情绪识别 KNN 算法与 Canberra 距离深度剖析(三)
机器学习·knn·脑机接口·情绪识别·bci·canberra距离
deepdata_cn7 天前
开源脑机接口(MIT OpenBCI)
脑机接口
世岩清上8 天前
以技术预研为引擎,驱动脑机接口等未来产业研发与应用创新发展
人工智能·脑机接口·未来产业
Brduino脑机接口技术答疑20 天前
脑机接口数据处理连载(六) 脑机接口频域特征提取实战:傅里叶变换与功率谱分析
人工智能·python·算法·机器学习·数据分析·脑机接口
Brduino脑机接口技术答疑24 天前
脑机接口数据处理连载(二) 数据源头解析:脑电信号的采集原理与数据特性
人工智能·python·算法·数据分析·脑机接口
极度畅想2 个月前
脑电模型实战系列(二):PyTorch实现CNN_DEAP的多尺度时空特征提取
深度学习·脑机接口·bci·情感计算·跨被试泛化·dnn cnn rnn·时空特征提取
极度畅想2 个月前
脑电模型实战系列(二):PyTorch实现简单DNN模型
深度学习·脑机接口·bci·情感计算·eeg情绪识别·跨被试泛化·dnn cnn rnn