1. 获取数据集及处理思路
这个数据有两列,一列为标记,值为ham
spam
,第二列为邮件文本数据。
- 判断邮件是否为垃圾邮件——分类问题
- 输出y可以设为0或1,1代表spam垃圾邮箱,0代表ham非垃圾邮箱
- 处理的输入数据x是文本数据、序列数据,可以建立一个多对一的RNN模型
2. 训练神经网络
1. 加载包
1 | import os |
其中ops.reset_default_graph()
是对default graph重新初始化,清空所有张量
1.1 为graph建立会话
1 | sess = tf.Session() |
1.2 设定RNN模型的参数
1 | epochs = 30 # 执行30代 |
2. 导入数据
下载数据存为text_data.txt
1 | # 设定路径 |
2.1 数据预处理
1 | # 将数据中的标签和邮件文本分开 |
- 为了减少vocabulary,先清理文本,移除特殊字符,删除多余空格,将文本换成小写
1 | # 这是一个文本清理函数 |
- 接下来将文本转为词的ID序列
1 | # 用 TensorFlow 中一个内置的 VocabularyProcessor 函数来处理文本 |
该方法的例子
1 | # 给出以下数据 |
2.2 分为训练集和测试集
预处理后,将数据进行shuffle,再分为训练集和测试集
shuffle打乱数据行序,使数据随机化。这样参数就不容易陷入局部最优,模型更容易达到收敛,
np.random.permutation()
来对行索引进行一次全排列1
2
3
4
5text_processed = np.array(text_processed)
text_data_target = np.array([1 if x == 'ham' else 0 for x in text_data_target])
shuffled_ix = np.random.permutation(np.arange(len(text_data_target)))
x_shuffled = text_processed[shuffled_ix]
y_shuffled = text_data_target[shuffled_ix]shuffle 数据后,将数据集分为 80% 训练集和 20% 测试集 如果想做交叉验证 cross-validation ,可以将 测试集 进一步分为测试集和验证集来调参。
1
2
3
4
5
6ix_cutoff = int(len(y_shuffled)*0.80)
x_train, x_test = x_shuffled[:ix_cutoff], x_shuffled[ix_cutoff:]
y_train, y_test = y_shuffled[:ix_cutoff], y_shuffled[ix_cutoff:]
vocab_size = len(vocab_processor.vocabulary_)
print("Vocabulary Size: {:d}".format(vocab_size))
print("80-20 Train Test split: {:d} -- {:d}".format(len(y_train), len(y_test)))将会输出
1
2Vocabulary size: 933
80-20 Train Test split: 4459 -- 1115