亲爱的论坛成员们,
我有一组包含2000万条随机收集的推文的数据集(没有两条推文来自同一个账号)。让我称这个数据集为“通用”数据集。另外,我还有另一个“特定”数据集,其中包括了从滥用药物(阿片类药物)的人群中收集的10万条推文。每条推文至少有一个标签与之相关,例如,阿片类药物、成瘾、过量、氢可酮等(最多25个标签)。
我的目标是使用“特定”数据集通过Keras训练模型,然后用它来标记“通用”数据集中的推文,以识别可能由药物滥用者撰写的推文。
参考来源1和来源2的示例,我成功构建了一个这样的模型的简单工作版本:
from tensorflow.python import kerasimport pandas as pdimport numpy as npimport pandas as pdimport tensorflow as tffrom sklearn.preprocessing import LabelBinarizer, LabelEncoderfrom sklearn.metrics import confusion_matrixfrom tensorflow import kerasfrom keras.models import Sequentialfrom keras.layers import Dense, Activation, Dropoutfrom keras.preprocessing import text, sequencefrom keras import utils# 加载特定于阿片类药物的数据集,其中post是推文,tags是与推文相关联的单个标签# 如何包含多个标签用于训练?data = pd.read_csv("filename.csv")train_size = int(len(data) * .8)train_posts = data['post'][:train_size]train_tags = data['tags'][:train_size]test_posts = data['post'][train_size:]test_tags = data['tags'][train_size:]# 对推文进行标记vocab_size = 100000 # 词汇量大小到底意味着什么?tokenize = text.Tokenizer(num_words=vocab_size)tokenize.fit_on_texts(train_posts)x_train = tokenize.texts_to_matrix(train_posts)x_test = tokenize.texts_to_matrix(test_posts)# 确保列是字符串类型data['post'] = data['post'].astype(str)data['tags'] = data['tags'].astype(str)# 标记# 这是我添加更多标签列用于训练的地方吗?encoder = LabelBinarizer()encoder.fit(train_tags)y_train = encoder.transform(train_tags)y_test = encoder.transform(test_tags)# 构建模型batch_size = 32model = Sequential()model.add(Dense(512, input_shape=(vocab_size,)))model.add(Activation('relu'))num_labels = np.max(y_train) + 1 # 这个+1到底意味着什么?model.add(Dense(1865))model.add(Activation('softmax'))model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])history = model.fit(x_train, y_train, batch_size = batch_size, epochs = 5, verbose = 1, validation_split = 0.1)# 测试预测准确率score = model.evaluate(x_test, y_test, batch_size=batch_size, verbose=1)print('测试得分:', score[0])print('测试准确率:', score[1])# 使用测试集进行预测for i in range(1000): prediction = model.predict(np.array([x_test[i]]))text_labels = encoder.classes_ predicted_label = text_labels[np.argmax(prediction[0])]print(test_posts.iloc[i][:50], "...")print('实际标签:' + test_tags.iloc[i])print("预测标签: " + predicted_label)
为了继续前进,我想澄清一些事情:
- 假设我所有的训练推文都只有一个标签——阿片类药物。那么,如果我通过模型传递未标记的推文,不是很可能模型会简单地将它们全部标记为阿片类药物,因为它不知道其他标签吗?我是否应该使用不同类型的推文/标签来进行学习?或许,有关于选择用于训练的推文/标签的一般指导方针吗?
- 如何添加更多的标签列用于训练(不像代码中使用的那样只有一个)?
- 一旦我训练了模型并达到了适当的准确率,如何通过模型传递未标记的推文来进行预测?
- 如何添加混淆矩阵?
任何其他相关的反馈也非常受欢迎。
谢谢!
“通用”推文的示例:
每当我在上课时大家都会给我发消息,但周末从不交流,就像我有空的时候一样。感觉就是这样,哈哈。我醒得晚,现在看起来很糟糕。我是那种无论如何都会提前到达的人,只是看起来像是刚醒来。
“特定”推文的示例:
200万美元的拨款用于教育开具阿片类药物处方的临床医生早期和定期使用大麻与使用其他非法药物(包括阿片类药物)相关
回答:
我的回应是:
-
创建一个包含通用和特定数据的推文的新数据集。假设有20万到25万条,其中10万条是你的特定数据集,其余是通用数据集
-
拿你的25个关键词/标签,编写规则,如果一条推文中存在一个或多个这样的词,它就是DA(药物滥用者)或NDA(非药物滥用者)。这将是你的因变量。
-
你的新数据集将包含一列所有推文,另一列是因变量,表明它是DA还是NDA
-
现在将数据集划分为训练集和测试集,并使用Keras或其他任何算法,让它可以学习。
-
然后通过绘制混淆矩阵来测试模型
-
将你剩余的通用数据集传递给这个模型进行检查,
如果有除了25个之外的其他新词,并且这些词不在特定数据集中,根据你构建的模型,它仍然会试图通过一起出现的词组、语气等智能地猜测正确的类别。