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

如何在Keras中对已填充的变长序列数据进行分类?

嘿,我来帮你搞定这个Keras序列分类任务!你的数据已经做好了固定长度填充和独热编码标签,接下来咱们一步步来实现:

步骤1:把数据转换成Keras能处理的格式

首先得把DataFrame里的序列列和标签列转成numpy数组,Keras模型只认数组格式的输入:

import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout
from sklearn.model_selection import train_test_split

# 假设你的DataFrame名为df
X = np.array(df['col'].tolist())  # 将序列列转为二维numpy数组,形状是(样本数, 序列长度)
y = df['predict'].values  # 直接提取独热编码的标签,形状是(样本数, 类别数)
步骤2:划分训练集和测试集

咱们得留一部分数据用来评估模型的泛化能力,用train_test_split很方便:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

这里test_size=0.2表示拿20%的数据当测试集,random_state固定随机种子,确保每次划分结果一致。

步骤3:构建序列分类模型

针对序列数据,循环神经网络(比如LSTM)是很合适的选择,咱们来搭一个基础模型:

# 先确定几个关键参数
vocab_size = np.max(X) + 1  # 序列里最大的整数是784,所以词汇表大小设为785(覆盖所有可能的整数)
sequence_length = X.shape[1]  # 你的序列固定长度是7
num_classes = y.shape[1]  # 你的分类类别数是4

model = Sequential([
    # Embedding层:把整数索引转成密集向量,方便模型学习特征
    Embedding(input_dim=vocab_size, output_dim=64, input_length=sequence_length),
    # LSTM层:捕捉序列中的时序依赖关系
    LSTM(64, return_sequences=False),  # 最后一层LSTM不需要返回序列,直接输出特征给全连接层
    # Dropout层:随机丢弃部分神经元,防止模型过拟合
    Dropout(0.2),
    # 输出层:多分类任务用softmax激活函数,输出每个类别的概率
    Dense(num_classes, activation='softmax')
])

# 编译模型:多分类用categorical_crossentropy损失,优化器选adam,监控准确率
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 查看模型结构
model.summary()

特殊情况说明:如果序列是数值特征而非索引

如果你的序列里的数字是连续的数值(比如传感器读数、数值型指标),而不是类别索引,那可以跳过Embedding层,把数据改成三维形状后直接喂给LSTM:

# 把X转成(样本数, 序列长度, 特征数)的三维数组,这里特征数是1
X = X.reshape(-1, sequence_length, 1)

# 重新构建模型
model = Sequential([
    LSTM(64, input_shape=(sequence_length, 1)),
    Dropout(0.2),
    Dense(num_classes, activation='softmax')
])
步骤4:训练模型

现在就可以开始训练了,调整epochs(训练轮数)和batch_size(每批样本数)来优化效果:

history = model.fit(
    X_train, y_train,
    epochs=10,  # 先训练10轮看看效果,不够再增加
    batch_size=32,  # 每批喂32个样本,根据内存大小调整
    validation_split=0.1  # 用训练集的10%做验证,监控过拟合情况
)
步骤5:评估模型&做预测

训练完后,用测试集评估模型的真实性能,再试试预测新样本:

# 在测试集上评估
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"测试集准确率: {test_acc:.4f}")

# 对单个样本做预测
sample = np.array([[262, 330, 392, 522, 784, 0, 0]])  # 随便拿一个你的序列样本
prediction = model.predict(sample)
predicted_class = np.argmax(prediction, axis=1)  # 把独热编码转成类别索引
print(f"预测的类别索引: {predicted_class[0]}")
一些优化小建议
  • 调参试试:比如增加LSTM的层数(比如叠两层LSTM)、调整Embedding的向量维度、LSTM的神经元数量
  • 正则化:除了Dropout,还可以给Dense/LSTM层加L2正则化,进一步防止过拟合
  • 学习率优化:用ReduceLROnPlateau回调函数,当验证集性能不再提升时自动降低学习率
  • 数据增强:如果样本量少,可以对序列做一些合理的增强,比如随机截断非0部分再补0(注意不要破坏序列语义)

内容的提问来源于stack exchange,提问作者Shreyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:24:50