Classificazione Multietichetta Un’introduzione con Scikit-Learn di Python
Classificazione Multietichetta con Scikit-Learn di Python
Nelle attività di apprendimento automatico, la classificazione è un metodo di apprendimento supervisionato per prevedere l’etichetta dato il dato di input. Ad esempio, vogliamo prevedere se qualcuno è interessato all’offerta di vendita utilizzando le sue caratteristiche storiche. Addestrando il modello di apprendimento automatico utilizzando i dati di addestramento disponibili, possiamo eseguire le attività di classificazione per i dati in arrivo.
Spesso ci troviamo di fronte a compiti classici di classificazione come la classificazione binaria (due etichette) e la classificazione multiclasse (più di due etichette). In questo caso, addestreremmo il classificatore e il modello cercherà di prevedere una delle etichette tra tutte le etichette disponibili. Il dataset utilizzato per la classificazione è simile all’immagine di seguito.
- Frode guidata dall’IA ‘Deepfake’ la battaglia in corso del Kerala contro gli imbroglioni
- Top strumenti di intelligenza artificiale per la contabilità 2023
- Incontra BeLFusion Un approccio di spazio latente comportamentale per la previsione realistica e diversificata del movimento umano stocastico utilizzando la diffusione latente.
L’immagine sopra mostra che l’obiettivo (Offerta di vendita) contiene due etichette nella classificazione binaria e tre nella classificazione multiclasse. Il modello si addestrerà sulle caratteristiche disponibili e quindi restituirà solo un’etichetta.
La classificazione multietichetta è diversa dalla classificazione binaria o multiclasse. Nella classificazione multietichetta, non cerchiamo di prevedere solo con un’etichetta di output. Invece, la classificazione multietichetta cercherà di prevedere i dati con il maggior numero possibile di etichette che si applicano ai dati di input. L’output potrebbe essere da nessuna etichetta al numero massimo di etichette disponibili.
La classificazione multietichetta viene spesso utilizzata nel compito di classificazione dei dati di testo. Ad esempio, ecco un dataset di esempio per la classificazione multietichetta.
Nell’esempio precedente, immagina che Testo 1 a Testo 5 sia una frase che può essere categorizzata in quattro categorie: Evento, Sport, Cultura pop e Natura. Con i dati di addestramento sopra, il compito di classificazione multietichetta prevede quale etichetta si applica alla frase data. Ogni categoria non è contraria all’altra poiché non sono mutualmente esclusive; ogni etichetta può essere considerata indipendente.
Per maggiori dettagli, possiamo vedere che Testo 1 etichetta Sport e Cultura pop, mentre Testo 2 etichetta Cultura pop e Natura. Questo mostra che ogni etichetta era mutualmente esclusiva e la classificazione multietichetta può avere un output di previsione come nessuna delle etichette o tutte le etichette contemporaneamente.
Con questa introduzione, cerchiamo di costruire un classificatore multiclasse con Scikit-Learn.
Classificazione Multietichetta con Scikit-Learn
Questo tutorial utilizzerà il dataset di classificazione multietichetta Biomedical PubMed disponibile pubblicamente su Kaggle. Il dataset conterrà varie caratteristiche, ma utilizzeremo solo la caratteristica abstractText con la loro classificazione MeSH (A: Anatomia, B: Organismo, C: Malattie, ecc.). I dati di esempio sono mostrati nell’immagine di seguito.
Il dataset sopra mostra che ogni articolo può essere classificato in più di una categoria, i casi per la classificazione multietichetta. Con questo dataset, possiamo costruire un classificatore multietichetta con Scikit-Learn. Prepariamo il dataset prima di addestrare il modello.
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
df = pd.read_csv('PubMed Multi Label Text Classification Dataset Processed.csv')
df = df.drop(['Title', 'meshMajor', 'pmid', 'meshid', 'meshroot'], axis =1)
X = df["abstractText"]
y = np.asarray(df[df.columns[1:]])
vectorizer = TfidfVectorizer(max_features=2500, max_df=0.9)
vectorizer.fit(X)
Nel codice sopra, trasformiamo i dati di testo in una rappresentazione TF-IDF in modo che il nostro modello Scikit-Learn possa accettare i dati di addestramento. Inoltre, sto saltando le fasi di elaborazione dei dati, come la rimozione delle stopword, per semplificare il tutorial.
Dopo la trasformazione dei dati, dividiamo il dataset in dataset di addestramento e di test.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
X_train_tfidf = vectorizer.transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
Dopo tutta la preparazione, inizieremmo ad allenare il nostro classificatore Multietichetta. In Scikit-Learn, useremmo l’oggetto MultiOutputClassifier per allenare il modello del classificatore Multietichetta. La strategia dietro a questo modello è quella di allenare un classificatore per ogni etichetta. Fondamentalmente, ogni etichetta ha il suo classificatore.
In questo esempio useremo la Regressione Logistica e il MultiOutputClassifier le estenderà a tutte le etichette.
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression
clf = MultiOutputClassifier(LogisticRegression()).fit(X_train_tfidf, y_train)
Possiamo cambiare il modello e regolare i parametri del modello passati al MultiOutputClasiffier, quindi gestiscili in base alle tue esigenze. Dopo l’allenamento, utilizziamo il modello per prevedere i dati di test.
prediction = clf.predict(X_test_tfidf)
prediction
Il risultato della previsione è un array di etichette per ogni categoria MeSH. Ogni riga rappresenta la frase e ogni colonna rappresenta l’etichetta.
Infine, dobbiamo valutare il nostro classificatore Multietichetta. Possiamo utilizzare le metriche di accuratezza per valutare il modello.
from sklearn.metrics import accuracy_score
print('Punteggio di accuratezza: ', accuracy_score(y_test, prediction))
Punteggio di accuratezza: 0,145
Il punteggio di accuratezza è 0,145, il che mostra che il modello è in grado di prevedere correttamente la combinazione esatta di etichette meno del 14,5% delle volte. Tuttavia, il punteggio di accuratezza presenta dei punti deboli per la valutazione delle previsioni multietichetta. Il punteggio di accuratezza richiederebbe che ogni frase abbia tutte le etichette presenti nella posizione esatta, altrimenti verrà considerata errata.
Ad esempio, la previsione della prima riga differisce solo per una etichetta tra la previsione e i dati di test.
Verrebbe considerata una previsione errata per il punteggio di accuratezza poiché la combinazione di etichette è diversa. Ecco perché il nostro modello ha un punteggio metrico basso.
Per mitigare questo problema, dobbiamo valutare la previsione delle etichette anziché la combinazione delle etichette. In questo caso, possiamo fare affidamento sulla metrica di valutazione Hamming Loss. Hamming Loss viene calcolato prendendo una frazione delle previsioni errate rispetto al numero totale di etichette. Poiché Hamming Loss è una funzione di perdita, più basso è il punteggio, meglio è (0 indica nessuna previsione errata e 1 indica che tutte le previsioni sono errate).
from sklearn.metrics import hamming_loss
print('Hamming Loss: ', round(hamming_loss(y_test, prediction),2))
Hamming Loss: 0,13
Il nostro modello Classificatore Multietichetta ha un Hamming Loss di 0,13, il che significa che il nostro modello avrà una previsione errata indipendentemente dal 13% del tempo. Ciò significa che ogni previsione di etichetta potrebbe essere errata il 13% delle volte.
Conclusione
La classificazione multietichetta è un compito di machine learning in cui l’output potrebbe essere nessuna etichetta o tutte le possibili etichette dati i dati di input. È diverso dalla classificazione binaria o multiclasse, in cui l’output dell’etichetta è mutuamente esclusivo.
Utilizzando il MultiOutputClassifier di Scikit-Learn, possiamo sviluppare un classificatore multietichetta in cui alleniamo un classificatore per ogni etichetta. Per la valutazione del modello, è meglio utilizzare la metrica Hamming Loss poiché il punteggio di accuratezza potrebbe non fornire l’intera immagine correttamente. Cornellius Yudha Wijaya è un assistente manager di data science e scrittore di dati. Mentre lavora a tempo pieno presso Allianz Indonesia, ama condividere consigli su Python e dati tramite social media e media scritti.