使用Glove词嵌入对IMDB数据集进行二分类
IMDB Dataset of 50K Movie Reviews
1、从文件中读取数据
data_path = '/kaggle/input/imdb-dataset-of-50k-movie-reviews/IMDB Dataset.csv'#从文件中读取数据
import pandas as pd
imdb_data=pd.read_csv(data_path)#输出数据的shape以及前10个数据
print(imdb_data.shape)
imdb_data.head(10)
需要注意的是imdb_data的数据类型是DataFrame的
print(imdb_data.keys())
#sentiment count
print(imdb_data['sentiment'].value_counts())
2、导入IMDB数据集的内容和标签
3、对IMDB原始数据的文本进行分词
import numpy as np
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequencesmaxlen = 100 #只读取评论的前100个单词
max_words = 10000 #只考虑数据集中最常见的前10000个单词tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(texts)sequences = tokenizer.texts_to_sequences(texts) #将texts文本转换成整数序列word_index = tokenizer.word_index #单词和数字的字典
print('Found %s unique tokens' % len(word_index))data = pad_sequences(sequences, maxlen=maxlen) #将data填充为一个(sequences, maxlen)的二维矩阵
data = np.asarray(data).astype('int64')
labels = np.asarray(labels).astype('float32')
print(data.shape, labels.shape)
划分训练集和测试集
train_reviews = data[: 40000]
train_sentiments = labels[:40000]test_reviews = data[40000:]
test_sentiments = labels[40000:]
#show train datasets and test datasets shape
print(train_reviews.shape,train_sentiments.shape)
print(test_reviews.shape,test_sentiments.shape)
4、对嵌入进行预处理
glove.6B.100d.txt中有40k个单词的100维的嵌入向量,每一行的第一列是对应的单词,之后的100列是这个单词对应的嵌入向量
构建一个embedding_index的字典,键为单词,值为这个单词对应的嵌入向量
import os
glove_dir = '/kaggle/input/glove6b'embedding_index = {}
f = open(os.path.join(glove_dir, 'glove.6B.100d.txt'))for line in f:values = line.split()word = values[0]coefs = np.asarray(values[1:], dtype = 'float32')embedding_index[word] = coefsf.close()print('Found %s word vectors' % len(embedding_index))
接下来需要构建一个可以加载到Embedding层中的嵌入矩阵,他必须是一个形状为(max_words, embedding_dim)1的矩阵
对于单词索引为i的单词,这个矩阵中的第i行是word_index中这个单词对应的词向量
#准备GloVe词嵌入矩阵
import numpy as npembedding_dim = 100
embedding_matrix = np.zeros((max_words, embedding_dim))for word, i in word_index.items():if i < max_words:embedding_vector = embedding_index.get(word)if embedding_vector is not None:embedding_matrix[i] = embedding_vector
5、定义模型
from keras import Sequential
from keras.layers import Dense, Flatten, Embeddingnetwork = Sequential()
network.add(Embedding(max_words, embedding_dim, input_length=100))
network.add(Flatten())
network.add(Dense(32, activation='relu'))
network.add(Dense(1, activation='sigmoid'))
network.summary()
from tensorflow.keras.utils import plot_modelplot_model(network, show_shapes = True)
6、在模型中加载GloVe词嵌入
#将预训练的的词嵌入加载到Embedding层中
network.layers[0].set_weights([embedding_matrix])
network.layers[0].trainable = Falsenetwork.summary()
7、训练与评估
network.compile('rmsprop', 'binary_crossentropy', 'accuracy')history = network.fit(train_reviews, train_sentiments,epochs=10,batch_size=32,validation_data=(test_reviews, test_sentiments))
#IMDB影评二分类#1、从文件中读取数据
data_path = '/kaggle/input/imdb-dataset-of-50k-movie-reviews/IMDB Dataset.csv'#为避免切换到不同目录下导致找不到文件,这里使用的是绝对路径import pandas as pd
imdb_data = pd.read_csv(data_path) #从文件中读取数据#输出IMDB的shap以及前10条数据的信息
print(imdb_data.shape)
imdb_data.head(10)print(type(imdb_data)) #imdb_data是一个DataFrame类
print(imdb_data.keys()) #imdb_data有两列,review和sentiment
print(imdb_data['sentiment'].value_counts())#2、导入IMDB数据集的内容和标签
labels = []
texts = []for sentiment in imdb_data['sentiment']:if sentiment == 'positive':labels.append(float(1.0)) #需要注意的是labels.append(1.0) 可能导致存储的是1.0这个字符串,而不是我们想要的float型数据else:labels.append(float(0.0))for review in imdb_data['review']:texts.append(review)#查看texts和labels的长度
print(len(texts), len(labels))#3、对IMDB原始数据的文本进行分词
import numpy as np
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequencesmax_words = 10000 #只考虑最常见的10000词
max_len = 100 #对于所有的评论,只截取前100个词
tokenizer = Tokenizer(num_words=max_words) #实例化一个只考虑最常用10000词的分词器
tokenizer.fit_on_texts(texts) #构建单词索引sequences = tokenizer.texts_to_sequences(texts) #将texts中的文字转换成整数序列word_index = tokenizer.word_index #分词器中的word_index字典
data = pad_sequences(sequences, maxlen=max_len) #填充sequences序列, data是一个(50000, 100)的2D张量data = np.asarray(data).astype('int64') #data.shape = (50000, 100), labels.shape = (50000, )
labels = np.asarray(labels).astype('float32')#划分训练集和验证集
train_reviews = data[: 40000]
train_sentiments = labels[:40000]test_reviews = data[40000:]
test_sentiments = labels[40000:]#show train datasets and test datasets shape
print(train_reviews.shape,train_sentiments.shape)
print(test_reviews.shape,test_sentiments.shape)#4、对嵌入进行预处理
#glove.6B.100d.txt中有40k个单词的100维的嵌入向量,每一行的第一列是对应的单词,之后的100列是这个单词对应的嵌入向量
#构建一个embedding_index的字典,键为单词,值为这个单词对应的嵌入向量
import os
glove_dir = '/kaggle/input/glove6b'#如果想在自己电脑上跑,需要下载上述两个数据集,并将路径替换为自己电脑上的本地路径embedding_index = {}
f = open(os.path.join(glove_dir, 'glove.6B.100d.txt'), encoding='utf8') #注意编码格式为utf8for line in f:values = line.split()word = values[0]coefs = np.asarray(values[1:], dtype='float32')embedding_index[word] = coefsf.close()print('Found %s word vectors' % len(embedding_index))#接下来需要构建一个可以加载到Embedding层中的嵌入矩阵,他必须是一个形状为(max_words, embedding_dim)1的矩阵
#对于单词索引为i的单词,这个矩阵中的第i行是word_index中这个单词对应的词向量
import numpy as npembedding_dim = 100embedding_matrix = np.zeros((max_words, embedding_dim)) #构建一个(max_words, embedding)的二维矩阵
for word, i in word_index.items():if i < max_words:embedding_vector = embedding_index.get(word)if embedding_vector is not None:embedding_matrix[i] = embedding_vector#5、定义模型
from keras.models import Sequential
from keras.layers import Dense, Flatten, Embeddingnetwork = Sequential()
network.add(Embedding(max_words, embedding_dim, input_length=max_len))
network.add(Flatten())
network.add(Dense(32, activation='relu'))
network.add(Dense(1, activation='sigmoid'))#查看模型中对应的参数
network.summary()#绘制模型的网络结构
from tensorflow.keras.utils import plot_model
plot_model(network, show_shapes = True)#6、在模型中加载GloVe词嵌入
#冻结Embedding层
network.layers[0].set_weights([embedding_matrix])
network.layers[0].trainable = False
network.summary()#7、训练与评估
network.compile('rmsprop', 'binary_crossentropy', 'accuracy')history = network.fit(train_reviews, train_sentiments,epochs=10,batch_size=32,validation_data=(test_reviews, test_sentiments))#8、绘制训练精度和验证精度
import matplotlib.pyplot as pltacc = history.history['accuracy']
val_acc = history.history['val_accuracy']epochs = range(1, len(acc) + 1)plt.plot(epochs, acc, 'b', label = "Training Accuracy")
plt.plot(epochs, val_acc, 'o', label = "Validating Accuracy")
plt.title("Training Accuracy and Validating Accuracy")
plt.legend()plt.show()#9、绘制训练损失和验证损失
loss = history.history['loss']
val_loss = history.history['val_loss']plt.plot(epochs, loss, 'b', label = "Training Loss")
plt.plot(epochs, val_loss, 'o', label = "Validating Loss")
plt.title("Training Loss and Validating Loss")
plt.legend()plt.show()prediction = network.predict(test_reviews)prediction = [(int) ((prediction[i][0] + 0.5) / 1.0) for i in range(len(prediction))]prediction = np.asarray(prediction).astype('float32')#构建二分类的混淆矩阵
import pandas as pd
pd.crosstab(test_sentiments, prediction, rownames = ['labels'], colnames = ['predictions'])#利用sklearn中的classification_report来查看对应的准确率、召回率、F1-score
from sklearn.metrics import classification_report
print(classification_report(test_sentiments, prediction))# 不使用预训练的词嵌入,来训练相同的模型
network = Sequential()
network.add(Embedding(max_words, embedding_dim, input_length=100)) #之前使用预训练好的词嵌入是将Embedding层冻结
network.add(Flatten())
network.add(Dense(32, activation='relu'))
network.add(Dense(1, activation='sigmoid'))
network.summary()network.compile('rmsprop', 'binary_crossentropy', 'accuracy')history = network.fit(train_reviews, train_sentiments,epochs=10,batch_size=32,validation_data=(test_reviews, test_sentiments))#绘制训练精度和验证精度
import matplotlib.pyplot as pltacc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']epochs = range(1, len(acc) + 1)plt.plot(epochs, acc, 'b', label = "Training Accuracy")
plt.plot(epochs, val_acc, 'o', label = "Validating Accuracy")
plt.title("Training Accuracy and Validating Accuracy")
plt.legend()plt.show()#绘制训练损失和验证损失
plt.plot(epochs, loss, 'b', label = "Training Loss")
plt.plot(epochs, val_loss, 'o', label = "Validating Loss")
plt.title("Training Loss and Validating Loss")
plt.legend()plt.show()
使用词嵌入得到的结果:
可以看到在训练3次之后,模型就发生了过拟合(训练集上的精度不断上升,但在验证集上的精度在下降)
不使用词嵌入
使用Glove词嵌入对IMDB数据集进行二分类相关推荐
- 【统计学习方法】线性可分支持向量机对鸢尾花(iris)数据集进行二分类
本文摘要 · 理论来源:[统计学习方法]第七章 SVM · 技术支持:pandas(读csv).numpy.sklearn.svm.svm思想.matplotlib.pyplot(绘图) · 代码目的 ...
- 【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
本文摘要 · 理论来源:[统计学习方法]第二章 感知机 · 技术支持:pandas(读csv).matplotlib(画图).numpy.sklearn.linear_model.Perceptron ...
- ML之catboost:基于自带Pool数据集实现二分类预测
ML之catboost:基于自带Pool数据集实现二分类预测 基于自带Pool数据集实现二分类预测 输出结果 Learning rate set to 0.5 0: learn: 0.9886498 ...
- DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化)
DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化) 目录 利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的 ...
- ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化
ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化 目录 实现结果 实现代码 实现结果
- ML之RFXGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
ML之RF&XGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还) 目录 输出结果 比赛结果 设计思路 核心代码 ...
- TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性)
TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 X_train = np.float32 ...
- ML之RFXGBoost:分别基于RF随机森林、XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
ML之RF&XGBoost:分别基于RF随机森林.XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 ...
- ML之DT:基于DT决策树算法(交叉验证FS+for遍历最佳FS)对Titanic(泰坦尼克号)数据集进行二分类预测
ML之DT:基于DT决策树算法(交叉验证FS+for遍历最佳FS)对Titanic(泰坦尼克号)数据集进行二分类预测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 fs = fea ...
最新文章
- Java基础 ----常用时间类
- mysql 报错 sql_mode=only_full_group_by 解决方法
- Android核心分析 之一分析方法论探讨之设计意图
- 《第一行代码》学习笔记9-活动Activity(7)
- 怎么对Java服务进行调优的?
- 测试SAP BRF+ ruleset
- bootice添加linux_如何使用老毛桃winpe的Bootice新建SYSLINUX引导程序?
- 有关JAVA中不同方法对String连接性能的总结
- sql server运算符_SQL Server执行计划中SELECT运算符的主要概念
- python integral_Pycharm:应为“Integral”类型,而应为“str”
- MVPArms官方快速组件化方案开源,来自5K star的信赖
- iphone13怎么安装双卡(双卡功能)
- 动态表情包制作?gif动态图怎么制作?
- 后渗透阶段的权限维持
- Android和风天气sdk
- 利用MOG背景分割器实现物体追踪
- Tita OKR:掌握大局的仪表盘
- PLC张力控制(开环闭环算法分析)
- Httpie 工具入门使用
- dplayer解析源码php调用,从demo分析ijk源码一:视频播放
热门文章
- [深度学习] ncnn编译使用
- JAVA计算机毕业设计在线小说系统Mybatis+系统+数据库+调试部署
- 剑侠单机版显示服务器正在维护,剑侠情缘8月22日部分服务器维护开服及补偿公告...
- 微信PC版Hook发送视频消息研究
- KMP算法next数组构建形式(几种常见的形式+例题)
- 服务器系统如何账务处理,云服务器费用账务处理
- BoostAsyncSocket 异步反弹通信案例
- 有什么做GIF的软件?这3款APP超酷炫
- 武汉理工转专业计算机笔试,计算机学院武汉理工大学2009年各学院转专业工作实施细则...
- zz .Net 实现游戏修改器