LSTM多分类任务的土地利用/覆盖分类数据集预处理问题求助
问题原因分析
你当前处理逻辑的核心问题是没有将原始长表格式的数据按New_id分组转换成LSTM所需的序列格式:
- 原始数据为长表结构:每个多边形(唯一
New_id)对应29行记录,每行存储单个日期的4个特征值 - LSTM要求的输入维度为
(样本数, 时间步长, 特征数),对应你的场景就是(约10000, 29, 4),分类标签的维度为(样本数, 分类数量)(多分类场景需要做独热编码)
你当前没有按New_id做分组聚合,直接将全量行的特征转换为数组,维度完全不符合模型输入要求,因此触发维度不匹配报错。
正确预处理流程
1. 数据校验
先确认所有New_id的记录数一致,且单个New_id仅对应一个分类值,避免后续序列长度或标签错误:
# 检查每个New_id的记录数,正常结果应仅返回29,无其他数值 id_counts = df.groupby('New_id').size() print(id_counts.value_counts()) # 检查单个New_id是否对应唯一Class,返回True则正常 print(df.groupby('New_id')['Class'].nunique().eq(1).all())
如果存在记录数不足29的New_id,可选择时间插值补全或直接删除样本;如果存在单个New_id对应多个Class的情况,需先修正原始数据的标注错误。
2. 构造序列特征与标签
按New_id分组,将每个样本的29天特征拼接为二维序列,同时提取对应分类标签:
import numpy as np import pandas as pd # 按New_id和日期排序,保证每个样本的时间序列顺序正确 df_sorted = df.sort_values(by=['New_id', 'data']) features = [] labels = [] for new_id, group in df_sorted.groupby('New_id'): # 提取当前样本的4个特征序列,形状为(29, 4) seq = group[['VV', 'VH', 'RVI', 'RATIO']].values features.append(seq) # 提取当前样本的分类标签 label = group['Class'].iloc[0] labels.append(label) # 转换为numpy数组,此时X的形状已经符合LSTM输入要求 X = np.array(features) y = np.array(labels) # 多分类场景需对标签做独热编码 from tensorflow.keras.utils import to_categorical y = to_categorical(y)
3. 数据集拆分
拆分训练集、验证集、测试集后即可输入LSTM模型训练:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y # 保持拆分后各类别比例和原数据集一致 )
内容的提问来源于stack exchange,提问作者Ana Paola Siri
相关产品推荐
相关产品推荐

