出于演示目的,咱们将使用 20个新闻组 数据集。数据分为20个类别,咱们的工做是预测这些类别。以下所示:python
一般,对于深度学习,咱们将划分训练和测试数据。windows
Python 网络
import pandas as pd import numpy as np import pickle from keras.preprocessing.text import Tokenizer from keras.models import Sequential from keras.layers import Activation, Dense, Dropout from sklearn.preprocessing import LabelBinarizer import sklearn.datasets as skds from pathlib import Path
Python dom
# 为了复现性 np.random.seed(1237) label_index = files_train.target label_names = files_train.target_names labelled_files = files_train.filenames data_tags = ["filename","category","news"] data_list = [] # 读取文件中的数据并将其添加到列表 data = pd.DataFrame.from_records(data_list, columns=data_tags)
咱们的数据没法以CSV格式提供。咱们有文本数据文件,文件存放的目录是咱们的标签或类别。electron
咱们将使用scikit-learn load_files方法。这种方法能够提供原始数据以及标签和标签索引。ide
最后咱们获得一个数据框,其中包含文件名,类别和实际数据。post
Python 学习
# 让咱们以80%的数据做为训练,剩下的20%做为测试。 train_size = int(len(data) * .8) train_posts = data['news'][:train_size] train_tags = data['category'][:train_size] train_files_names = data['filename'][:train_size] test_posts = data['news'][train_size:] test_tags = data['category'][train_size:] test_files_names = data['filename'][train_size:]
Python 测试
# 20个新闻组 num_labels = 20 vocab_size = 15000 batch_size = 100 # 用Vocab Size定义Tokenizer tokenizer = Tokenizer(num_words=vocab_size) tokenizer.fit_on_texts(train_posts)
在对文本进行分类时,咱们首先使用Bag Of Words方法对文本进行预处理。idea
在将文本转换为数字向量后,咱们还须要确保标签以神经网络模型接受的数字格式表示。
PowerShell
model = Sequential()
它为输入数据的维度以及构成模型的图层类型提供了简单的配置。
这是拟合度和测试准确性的代码段
100/8145 [..............................] - ETA: 31s - loss: 1.0746e-04 - acc: 1.0000 200/8145 [..............................] - ETA: 31s - loss: 0.0186 - acc: 0.9950 300/8145 [>.............................] - ETA: 35s - loss: 0.0125 - acc: 0.9967 400/8145 [>.............................] - ETA: 32s - loss: 0.0094 - acc: 0.9975 500/8145 [>.............................] - ETA: 30s - loss: 0.0153 - acc: 0.9960 ... 7900/8145 [============================>.] - ETA: 0s - loss: 0.1256 - acc: 0.9854 8000/8145 [============================>.] - ETA: 0s - loss: 0.1261 - acc: 0.9855 8100/8145 [============================>.] - ETA: 0s - loss: 0.1285 - acc: 0.9854 8145/8145 [==============================] - 29s 4ms/step - loss: 0.1293 - acc: 0.9854 - val_loss: 1.0597 - val_acc: 0.8742 Test accuracy: 0.8767123321648251
Python
for i in range(10): prediction = model.predict(np.array([x_test[i]])) predicted_label = text_labels[np.argmax(prediction[0])] print(test_files_names.iloc[i]) print('Actual label:' + test_tags.iloc[i]) print("Predicted label: " + predicted_label)
在Fit方法训练了咱们的数据集以后,咱们将如上所述评估模型。
混淆矩阵是可视化模型准确性的最佳方法之一。
保存模型
一般,深度学习的用例就像在不一样的会话中进行数据训练,而使用训练后的模型进行预测同样。
# 建立一个HDF5文件'my_model.h5' model.model.save('my_model.h5') # 保存令牌生成器,即词汇表 with open('tokenizer.pickle', 'wb') as handle: pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)
Keras没有任何实用程序方法可将Tokenizer与模型一块儿保存。咱们必须单独序列化它。
Python
|
|
预测环境还须要注意标签。
encoder.classes_ #标签二值化
如前所述,咱们已经预留了一些文件进行实际测试。
Python
labels = np.array(['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']) ... for x_t in x_tokenized: prediction = model.predict(np.array([x_t])) predicted_label = labels[np.argmax(prediction[0])] print("File ->", test_files[i], "Predicted label: " + predicted_label) i += 1
File -> C:\DL\20news-bydate\20news-bydate-test\comp.graphics\38758 Predicted label: comp.graphics File -> C:\DL\20news-bydate\20news-bydate-test\misc.forsale\76115 Predicted label: misc.forsale File -> C:\DL\20news-bydate\20news-bydate-test\soc.religion.christian\21329 Predicted label: soc.religion.christian
咱们知道目录名是文件的真实标签,所以上述预测是准确的。 |
在本文中,咱们使用Keras python库构建了一个简单而强大的神经网络。