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

基于Keras的多标签文本分类实现咨询(含CSV数据集与代码片段)

基于Keras实现多标签文本分类完整指南

嘿,我来帮你把这段Keras代码补全,搞定多标签文本分类任务!咱们一步步来,从数据预处理到模型训练全给你捋得明明白白~

1. 补全依赖库&加载数据集

首先把你没写完的依赖补全,再加个pandas用来加载CSV,sklearn的工具用来划分数据集和处理多标签:

import pandas as pd
import keras
import keras.backend as K
from keras.optimizers import Adam
from keras.models import Sequential
from keras.layers import Dense, Embedding, Flatten, Dropout
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MultiLabelBinarizer  # 多标签处理的核心工具!

然后加载你的CSV数据集,记得替换成你实际的列名:

# 加载CSV文件
df = pd.read_csv("your_dataset.csv")
texts = df["text_column"].values  # 替换成你的文本列名称
labels = df["label_column"].values  # 替换成你的标签列名称

2. 多标签专属:标签预处理

这是多标签和单标签分类最不一样的地方!你的标签是字母数字格式,假设每个样本的标签是用逗号分隔的字符串(比如"tag123,tag456"),咱们先把它拆成列表,再转成模型能识别的二进制矩阵:

# 把每个样本的标签字符串拆成列表(如果你的标签格式不是逗号分隔,要改成对应拆分方式)
labels = [label.split(",") for label in labels]

# 多标签二值化:把标签列表转成二进制矩阵
mlb = MultiLabelBinarizer()
encoded_labels = mlb.fit_transform(labels)
num_classes = len(mlb.classes_)  # 拿到总标签数量

3. 文本预处理:分词&统一长度

这部分你已经提到了Tokenizer和pad_sequences,咱们把它补全:

# 设置文本处理参数
max_words = 10000  # 保留数据里最常见的10000个词
max_len = 200  # 把所有文本统一成200个词的长度(短的补0,长的截断)

# 初始化分词器,拟合文本数据
tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(texts)

# 把文本转成数字序列
sequences = tokenizer.texts_to_sequences(texts)
# 统一序列长度
padded_sequences = pad_sequences(sequences, maxlen=max_len)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(padded_sequences, encoded_labels, test_size=0.2, random_state=42)

4. 构建多标签分类模型

多标签分类的模型和单标签有两个核心区别:输出层用sigmoid激活(每个标签独立输出0-1的概率),损失函数用binary_crossentropy(每个标签都是独立的二分类任务):

model = Sequential()
# 嵌入层:把数字序列转成词向量
model.add(Embedding(input_dim=max_words, output_dim=128, input_length=max_len))
# 把二维的词向量展平成一维
model.add(Flatten())
# 全连接层+Dropout防止过拟合
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
# 输出层:对应每个标签输出一个概率
model.add(Dense(num_classes, activation='sigmoid'))

# 编译模型
model.compile(optimizer=Adam(learning_rate=1e-3),
              loss='binary_crossentropy',
              metrics=['accuracy'])

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

5. 训练模型

直接调用fit方法就行,记得加验证集看看有没有过拟合:

history = model.fit(X_train, y_train,
                    batch_size=32,
                    epochs=10,
                    validation_split=0.1)  # 用训练集的10%做验证

6. 模型评估&预测

训练完后可以在测试集上评估效果,也可以试试预测新文本:

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

# 预测示例:输入一段新文本
sample_text = ["这是我要分类的测试文本内容"]
# 转成序列并padding
sample_seq = tokenizer.texts_to_sequences(sample_text)
sample_padded = pad_sequences(sample_seq, maxlen=max_len)
# 预测概率
pred_probs = model.predict(sample_padded)[0]

# 把概率转成标签(比如取概率大于0.5的标签)
pred_labels = mlb.inverse_transform([(pred_probs > 0.5).astype(int)])
print(f"预测出的标签: {pred_labels[0]}")

一些小提醒

  • 如果你的标签不是逗号分隔的,一定要根据实际格式调整拆分逻辑
  • 模型的参数(比如嵌入层维度、全连接层神经元数、dropout率、训练轮数)都可以根据你的数据集大小调整,比如数据量小就少加几层,防止过拟合
  • 多标签分类的准确率参考性有限,你也可以用sklearn的f1_score、hamming_loss这些指标来评估模型效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:23:32