神经网络python实例分类_Python使用神经网络进行简单文本分类
原文鏈接:http://tecdat.cn/?p=8613?tecdat.cn
深度學(xué)習(xí)無處不在。在本文中,我們將使用Keras進(jìn)行文本分類。
準(zhǔn)備數(shù)據(jù)集
出于演示目的,我們將使用 20個新聞組 數(shù)據(jù)集。數(shù)據(jù)分為20個類別,我們的工作是預(yù)測這些類別。如下所示:
通常,對于深度學(xué)習(xí),我們將訓(xùn)練和測試數(shù)據(jù)分開。
導(dǎo)入所需的軟件包
Pythonimport 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
將數(shù)據(jù)從文件加載到Python變量
Python# For reproducibility
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 = []
# Read and add data from file to a list
data = pd.DataFrame.from_records(data_list, columns=data_tags)
在我們的情況下,數(shù)據(jù)無法以CSV格式提供。我們有文本數(shù)據(jù)文件,文件存放的目錄是我們的標(biāo)簽或類別。
我們將使用scikit-learn load_files方法。這種方法可以為我們提供原始數(shù)據(jù)以及標(biāo)簽和標(biāo)簽索引。
在以上代碼的結(jié)尾,我們將有一個數(shù)據(jù)框,其中包含文件名,類別和實(shí)際數(shù)據(jù)。
拆分?jǐn)?shù)據(jù)進(jìn)行訓(xùn)練和測試
Python# lets take 80% data as training and remaining 20% for test.
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:]
標(biāo)記化并準(zhǔn)備詞匯
Python# 20 news groups
num_labels = 20
vocab_size = 15000
batch_size = 100
# define Tokenizer with Vocab Size
tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(train_posts)
在對文本進(jìn)行分類時,我們首先使用Bag Of Words方法對文本進(jìn)行預(yù)處理。
預(yù)處理輸出標(biāo)簽/類
在將文本轉(zhuǎn)換為數(shù)字向量后,我們還需要確保標(biāo)簽以神經(jīng)網(wǎng)絡(luò)模型接受的數(shù)字格式表示。
建立Keras模型并擬合
PowerShell
model = Sequential()
它為輸入數(shù)據(jù)的形狀以及構(gòu)成模型的圖層類型提供了簡單的配置。
這是一些適合度和測試準(zhǔn)確性的代碼段
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
評估模型
Pythonfor 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方法訓(xùn)練了我們的數(shù)據(jù)集之后,我們將如上所述評估模型。
混淆矩陣
混淆矩陣是可視化模型準(zhǔn)確性的最佳方法之一。
保存模型
通常,深度學(xué)習(xí)的用例就像在不同的會話中進(jìn)行數(shù)據(jù)訓(xùn)練,而使用訓(xùn)練后的模型進(jìn)行預(yù)測一樣。
# creates a HDF5 file 'my_model.h5'
model.model.save('my_model.h5')
# Save Tokenizer i.e. Vocabulary
with open('tokenizer.pickle', 'wb') as handle:
pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)
Keras沒有任何實(shí)用程序方法可將Tokenizer與模型一起保存。我們必須單獨(dú)序列化它。
加載Keras模型
Python
預(yù)測環(huán)境還需要注意標(biāo)簽。
encoder.classes_ #LabelBinarizer
預(yù)測
如前所述,我們已經(jīng)預(yù)留了一些文件進(jìn)行實(shí)際測試。
Pythonlabels = 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
我們知道目錄名是文件的真實(shí)標(biāo)簽,因此上述預(yù)測是準(zhǔn)確的。
結(jié)論
在本文中,我們使用Keras python庫構(gòu)建了一個簡單而強(qiáng)大的神經(jīng)網(wǎng)絡(luò)。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的神经网络python实例分类_Python使用神经网络进行简单文本分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python列表操作函数大全_Pytho
- 下一篇: python程序设计实验报告实验程序流程