15-8-DNN-recognise-junk-mail.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from datasets import Datasets
  2. import tensorflow as tf
  3. from sklearn.model_selection import train_test_split
  4. def input_fn(features, labels, training=True, batch_size=32):
  5. '''用于训练或评估的输入函数
  6. :param features: 特征
  7. :param labels: 标签
  8. :param training: 是否是训练
  9. :param batch_size: 一次放入多少样本
  10. :return:
  11. '''
  12. # 将输入转换为数据集
  13. dataset = tf.compat.v1.data.Dataset.from_tensor_slices((dict(features), labels))
  14. # 如果训练模式下,shuffle 打乱 、 repeat 重复
  15. if training:
  16. dataset = dataset.shuffle(1000).repeat()
  17. return dataset.batch(batch_size)
  18. # DNN
  19. def main():
  20. # 加载数据集
  21. x, y = Datasets.load_spambase()
  22. x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.3)
  23. # 特征列转换为tf识别的格式
  24. my_feature_columns = [tf.compat.v1.feature_column.numeric_column("x%s" % i) for i in range(1, 57)]
  25. # DNN
  26. classifier = tf.compat.v1.estimator.DNNClassifier(
  27. feature_columns=my_feature_columns, # 特征列
  28. hidden_units=[30, 10], # 表示隐含层是30*10的神经网络
  29. n_classes=2, # 输出层的分类有2个
  30. )
  31. # 训练 需要输入训练数据,并指定训练的步数。这一步需要和tf.data.Dataset结合使用。使用tf.data.Dataset进行每一个批次的数据喂取
  32. classifier.train(
  33. input_fn=lambda: input_fn(x_train, y_train, training=True),
  34. steps=500,
  35. )
  36. # 评估模型
  37. eval_result = classifier.evaluate(
  38. input_fn=lambda: input_fn(x_test, y_test, training=False),
  39. )
  40. print(eval_result["accuracy"]) # 0.90658945
  41. if __name__ == "__main__":
  42. main()