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数据集进行二分类相关推荐

  1. 【统计学习方法】线性可分支持向量机对鸢尾花(iris)数据集进行二分类

    本文摘要 · 理论来源:[统计学习方法]第七章 SVM · 技术支持:pandas(读csv).numpy.sklearn.svm.svm思想.matplotlib.pyplot(绘图) · 代码目的 ...

  2. 【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类

    本文摘要 · 理论来源:[统计学习方法]第二章 感知机 · 技术支持:pandas(读csv).matplotlib(画图).numpy.sklearn.linear_model.Perceptron ...

  3. ML之catboost:基于自带Pool数据集实现二分类预测

    ML之catboost:基于自带Pool数据集实现二分类预测 基于自带Pool数据集实现二分类预测 输出结果 Learning rate set to 0.5 0: learn: 0.9886498 ...

  4. DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化)

    DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化) 目录 利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的 ...

  5. ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化

    ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化 目录 实现结果 实现代码 实现结果

  6. ML之RFXGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)

    ML之RF&XGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还) 目录 输出结果 比赛结果 设计思路 核心代码 ...

  7. TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性)

    TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 X_train = np.float32 ...

  8. ML之RFXGBoost:分别基于RF随机森林、XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)

    ML之RF&XGBoost:分别基于RF随机森林.XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 ...

  9. ML之DT:基于DT决策树算法(交叉验证FS+for遍历最佳FS)对Titanic(泰坦尼克号)数据集进行二分类预测

    ML之DT:基于DT决策树算法(交叉验证FS+for遍历最佳FS)对Titanic(泰坦尼克号)数据集进行二分类预测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 fs = fea ...

最新文章

  1. Java基础 ----常用时间类
  2. mysql 报错 sql_mode=only_full_group_by 解决方法
  3. Android核心分析 之一分析方法论探讨之设计意图
  4. 《第一行代码》学习笔记9-活动Activity(7)
  5. 怎么对Java服务进行调优的?
  6. 测试SAP BRF+ ruleset
  7. bootice添加linux_如何使用老毛桃winpe的Bootice新建SYSLINUX引导程序?
  8. 有关JAVA中不同方法对String连接性能的总结
  9. sql server运算符_SQL Server执行计划中SELECT运算符的主要概念
  10. python integral_Pycharm:应为“Integral”类型,而应为“str”
  11. MVPArms官方快速组件化方案开源,来自5K star的信赖
  12. iphone13怎么安装双卡(双卡功能)
  13. 动态表情包制作?gif动态图怎么制作?
  14. 后渗透阶段的权限维持
  15. Android和风天气sdk
  16. 利用MOG背景分割器实现物体追踪
  17. Tita OKR:掌握大局的仪表盘
  18. PLC张力控制(开环闭环算法分析)
  19. Httpie 工具入门使用
  20. dplayer解析源码php调用,从demo分析ijk源码一:视频播放

热门文章

  1. [深度学习] ncnn编译使用
  2. JAVA计算机毕业设计在线小说系统Mybatis+系统+数据库+调试部署
  3. 剑侠单机版显示服务器正在维护,剑侠情缘8月22日部分服务器维护开服及补偿公告...
  4. 微信PC版Hook发送视频消息研究
  5. KMP算法next数组构建形式(几种常见的形式+例题)
  6. 服务器系统如何账务处理,云服务器费用账务处理
  7. BoostAsyncSocket 异步反弹通信案例
  8. 有什么做GIF的软件?这3款APP超酷炫
  9. 武汉理工转专业计算机笔试,计算机学院武汉理工大学2009年各学院转专业工作实施细则...
  10. zz .Net 实现游戏修改器