深度學習無處不在。在本文中,咱們將使用Keras進行文本分類。html
出於演示目的,咱們將使用 20個新聞組 數據集。數據分爲20個類別,咱們的工做是預測這些類別。以下所示: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
# 爲了復現性 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格式提供。咱們有文本數據文件,文件存放的目錄是咱們的標籤或類別。windows
咱們將使用scikit-learn load_files方法。這種方法能夠提供原始數據以及標籤和標籤索引。網絡
最後咱們獲得一個數據框,其中包含文件名,類別和實際數據。dom
# 讓咱們以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:]
# 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方法對文本進行預處理。electron
在將文本轉換爲數字向量後,咱們還須要確保標籤以神經網絡模型接受的數字格式表示。ide
model = Sequential()
它爲輸入數據的維度以及構成模型的圖層類型提供了簡單的配置。post
這是擬合度和測試準確性的代碼段學習
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庫構建了一個簡單而強大的神經網絡。
最受歡迎的看法
1.r語言用神經網絡改進nelson-siegel模型擬合收益率曲線分析
3.python用遺傳算法-神經網絡-模糊邏輯控制算法對樂透分析
4.用於nlp的python:使用keras的多標籤文本lstm神經網絡分類