Codifica per classificatori
Ho qualche dubbio sulla codifica (non ho familiarità con attività come queste) variabili categoriali per poterle utilizzare come parametri in un modello come la regressione logistica o SVM. Il mio set di dati è simile al seguente
Text Symbol Note Account Age Label
There is a red car ! red John 24 1
My bag was very expensive ? orange Luke 36 0
Where are my keys? @ red Red 58 1
I promise: I will never let you go! ... green Aoife 28 0
Nel testo ci sono commenti memorizzati dagli utenti in una comunità; il simbolo include il simbolo più utilizzato da un utente; Nota rappresenta il suo livello: il verde è più esperto, il rosso è un nuovo falegname; Account è il nome utente. L'etichetta mi fornisce informazioni sull'affidabilità dell'utente: se 0 l'utente non è falso; se uno l'utente potrebbe essere un possibile bot.
Vorrei classificare i nuovi utenti in base alle informazioni correnti (vedere le colonne sopra). Il mio set di dati include più di 1000 righe e 400 utenti. Poiché per utilizzare i classificatori ho bisogno di codificare i campi categoriali, ho provato a fare quanto segue, utilizzando MultiColumnLabelEncoderin sklearn:
MultiColumnLabelEncoder(columns = ['Text', 'Symbol', 'Note', 'Account']).fit_transform(df)
dove df è il mio dataframe. Tuttavia, ho capito che dovrebbe essere preferibile anche uno hotencoder. Ho anche incluso Account in quanto potrebbero esserci più commenti dallo stesso account, quindi se ho classificato un account come falso e ricevo un nuovo commento dallo stesso account, questo account potrebbe essere facilmente rilevato come falso. Lo scopo, come ho accennato in precedenza, sarebbe quello di classificare, con una certa accuratezza, nuovi elementi da un test set, sulla base delle informazioni fornite (simbolo, nota, età, testi), cercando cioè una possibile correlazione tra queste variabili può permettermi di dire che un nuovo account è falso (1) o no (0).
Il problema, come puoi vedere, è relativo ai classificatori in cui i parametri non sono solo numerici, ma anche categoriali.
Per la preelaborazione dei dati (rimozione di stopword e pulizia dei dati), ho utilizzato i pacchetti Python di nltk; per quanto riguarda l'estrazione delle caratteristiche (questo dovrebbe essere un punto chiave in quanto è collegato al passaggio successivo, ovvero utilizzando un classificatore per prevedere la classe - 1 o 0), ho riscontrato difficoltà nel capire quale output dovrei aspettarmi dalla codifica per essere in grado di utilizzare le informazioni di cui sopra come input nel mio modello (dove l'obiettivo è chiamato etichetta ed è un valore binario). Sto usando come classificatore la regressione logistica, ma anche SVM.
Il mio output previsto, in caso di utente X con età 16, simbolo #, nota Meraviglioso e nota rossa (nuovo falegname) sarebbe una classificazione come falso con una certa percentuale.
Gradirei se qualcuno mi spiegasse, passo dopo passo, come trasformare il mio dataset in un dataset le cui variabili posso utilizzare all'interno di una regressione logistica al fine di determinare l'etichetta (fake o non fake) dei nuovi utenti.
Risposte
Dovrai utilizzare un mix di elaborazione del testo e una codifica a caldo. La colonna di testo non dovrebbe essere trattata come una codifica a caldo poiché proverà a creare una nuova variabile per ogni frase unica nel set di dati, il che sarà molto (e non molto utile dall'apprendimento). Il vettorizzatore di testo riepiloga la colonna di testo in base al tipo di parole / gettoni che compaiono in essa.
Quindi dovresti usare un vettorizzatore di testo per elaborare prima solo la colonna di testo. Questo ti darà un frame di dati (diciamo A). Questo data-frame avrà colonne corrispondenti a token / parole nel set di dati. Quindi, se il vettorizzatore di testo raccoglie 100 parole uniche, avrai un data-frame di dimensioni 1000x100. Nota che queste 100 colonne sono state generate solo dal vettorizzatore di testo.
Per i simboli e le note, puoi usare una codifica a caldo, che ti darà un altro frame di dati (diciamo B). Quindi dovresti unire A e B su una chiave comune per ottenere il tuo frame di dati finale se inserito. La chiave comune qui sarà l'ID riga (anche se leggi il seguente commento sull'aggregazione dei dati a livello di utente).
Non è chiaro se la colonna del nome utente (Account) sia univoca nei dati? Se sono presenti 1000 righe ma solo 400 utenti, significa che può esserci più di 1 riga per utente. In tal caso, puoi considerare di aggregare i dati a livello di utente (per la colonna di testo, puoi semplicemente concatenare tutte le stringhe per lo stesso utente).