Un Neurone Per Leggere - Parte 2

In questa seconda parte, applicheremo il perceptron creato nel precedente post per classificare due tipi diversi di testi.

Importare i dati

Queste righe sono praticamente copia-incollate dal manuale di scikit-learn, disponibile sul sito della library. Importiamo il newsgroups dataset, il quale contiene un train set e un test set. Specifichiamo quali classi vogliamo, nel nostro caso solo 2 (medicina e religione cristiana).

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import metrics

twenty_train = fetch_20newsgroups(subset='train',
    categories=['sci.med', 'soc.religion.christian'], shuffle=True, random_state=42)

twenty_test = fetch_20newsgroups(subset='test',
    categories=['sci.med', 'soc.religion.christian'],
                                 shuffle=True,
                                 random_state=42)


Adesso vettorizziamo i testi con le funzioni fornite da scikit-learn, è importante ricordarsi di usare fit_transform per il training set e transform per il test set, altrimenti si avranno problemi di dimensionalità durante la fase di testing.

Dopo aver vettorizzato, normalizziamo i dati usando la funzione che applica la formula tfidf (term-frequency inverse document frequency). Questo permetterà di mettere in maggiore evidenza parole importanti e in sottoluce parole con meno salienza.

count_vect = CountVectorizer()

X_train_counts = count_vect.fit_transform(twenty_train.data)

tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)


X_test_counts = count_vect.transform(twenty_test.data)

X_test_tfidf = tfidf_transformer.transform(X_test_counts)

test = X_test_tfidf.toarray()

Ottimo! Tempo di testare il nostro perceptron. L'ultima volta lo abbiamo usato per dati 2D, questa volta le dimensioni sono molte, ma abbiamo definito i weights del nostro perceptron in modo da adattarsi a qualsiasi dimensionalità, quindi non avremo problemi con l'input.

Creiamo un'istanza del perceptron, dopo facciamo un training di 25 epoche, fornendo anche le labels.

Per finire, testeremo il modello sul test dataset, salvando le classificazioni di ogni testo in una lista e usando la funzione metrics per scoprire l'accuratezza del modello.

perceptron = Perc(X_train_tfidf.toarray())

perceptron.train(X_train_tfidf.toarray(), 25, twenty_train.target)

predicted = []

for x in range(len(test)):
    predicted.append(perceptron.predict(test[x], perceptron.W))

print(metrics.classification_report(twenty_test.target,
                                    predicted,
                                    target_names=twenty_test.target_names))


L'output che avremo è il seguente:

  precision recall f1-score support
sci.med 0.72 0.93 0.81 396
soc.religion.christ 0.90 0.65 0.75 398
avg / total 0.81 0.79 0.78 794

Se non tutti i risultati sono chiari, va bene comunque, la prima colonna fornisce già un'idea generale sulla performance. Abbiamo una precisione media dell'81%, di questa precisione, si può dire che i testi di religione sono classificati più accuratamente (90%) di quelli di medicina (72%). E' una cosa già interessante, ma bisogna anche notare che non è stata effettuata alcuna procedura di analisi e pulizia dei dati prima di darli al perceptron. Se volete vedere come migliorare i risultati e quanto davvero accurato è il modello, forse bisognerà prima applicare un pò di pulizia ai testi come indicati negli articoli più vecchi: rimozione di stopwords, stemming, ecc...

Date: 2019-06-21 vr 00:00

Author: Andrew

Other posts