You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为LSTM训练的序列数据应用SMOTE处理不平衡数据集

解决LSTM序列数据SMOTE过采样的维度不匹配问题

你遇到的这个错误很典型——标准的SMOTE算法是为二维表格数据(样本数×特征数)设计的,而LSTM的输入是三维张量(样本数×序列长度×特征数),所以直接套用会报错维度不兼容。下面给你几个可行的解决思路,从简单快速到贴合序列特性的都有:

方法1:临时展开维度,用标准SMOTE后重构

这是最快捷的临时方案,核心是把三维序列扁平成二维结构,过采样后再恢复成LSTM需要的形状。虽然会暂时忽略序列的时间依赖,但适合快速验证效果:

from imblearn.over_sampling import SMOTE
import numpy as np

# 假设你的输入数据是X (shape: [n_samples, seq_len, n_features]),标签是y
seq_len = X.shape[1]
n_features = X.shape[2]

# 把每个序列扁平成一维特征向量,得到二维数组
X_flattened = X.reshape(X.shape[0], -1)

# 应用SMOTE过采样
smote = SMOTE(random_state=42, sampling_strategy='minority')
X_resampled_flat, y_resampled = smote.fit_resample(X_flattened, y)

# 把扁平后的数组重新reshape回三维,适配LSTM输入
X_resampled = X_resampled_flat.reshape(X_resampled_flat.shape[0], seq_len, n_features)

方法2:使用针对序列数据的SMOTE变体(Time-SMOTE)

如果希望保留序列的时间结构,推荐用Time-SMOTE——它在时间维度上对少数类样本进行插值生成,而不是扁平特征。你可以自己实现一个简易版本:

def time_smote(minority_sequences, num_samples_to_generate):
    resampled_sequences = []
    num_minority = len(minority_sequences)
    
    for _ in range(num_samples_to_generate):
        # 随机挑选两个同类别序列
        idx1, idx2 = np.random.choice(num_minority, 2, replace=False)
        seq_a = minority_sequences[idx1]
        seq_b = minority_sequences[idx2]
        
        # 生成随机插值权重
        alpha = np.random.uniform(0, 1)
        # 在每个时间步和特征维度上线性插值,生成新序列
        new_seq = alpha * seq_a + (1 - alpha) * seq_b
        
        resampled_sequences.append(new_seq)
    
    return np.array(resampled_sequences)

# 使用示例:先分离出少数类的序列和标签
minority_mask = y == your_minority_label
X_minority = X[minority_mask]
# 生成需要的新样本数(比如和多数类欠采样后的数量匹配)
num_new = len(y) - len(X_minority)
X_new = time_smote(X_minority, num_new)

# 合并原数据和新生成的样本
X_resampled = np.concatenate([X, X_new], axis=0)
y_resampled = np.concatenate([y, [your_minority_label]*num_new], axis=0)

方法3:用序列数据增强替代SMOTE

其实针对序列数据,数据增强往往比传统SMOTE更贴合任务特性,而且不需要改变维度。常用的增强方式有:

  • 添加高斯噪声:给序列的特征值加少量噪声,模拟真实数据的波动
    X_augmented = X_minority + np.random.normal(0, 0.01, X_minority.shape)
    
  • 时间轴拉伸/压缩:对序列进行轻微的时间缩放(适合时间序列类任务)
  • 反转序列:如果任务允许(比如文本、非时序依赖的序列),直接反转少数类样本
  • 随机裁剪:从较长的序列中随机截取一段作为新样本(如果序列长度足够)

这些方法可以直接在三维张量上操作,完美适配LSTM的输入要求。

额外提醒

  1. 采样时机:一定要只在训练集上做过采样/欠采样,绝对不能碰测试集,避免数据泄露影响模型评估。
  2. 结合损失函数:如果采样效果不理想,可以尝试给少数类样本加损失权重(比如使用class_weight='balanced'参数,或者自定义加权交叉熵损失),和采样方法配合使用效果更好。
  3. 避免过度采样:少数类样本过多也会导致模型过拟合,建议采样后保持类别比例相对均衡即可。

内容的提问来源于stack exchange,提问作者Michal Fašánek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:52:44