基于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
相关产品推荐
相关产品推荐

