Come posso fare la classificazione con dati categorici che non sono stati corretti?


10

Ho un problema di classificazione con dati sia categorici che numerici. Il problema che sto affrontando è che i miei dati categorici non sono corretti, ciò significa che il nuovo candidato di cui desidero prevedere l'etichetta potrebbe avere una nuova categoria che non è stata osservata in precedenza.

Ad esempio, se i miei dati categorici era sex, gli unici possibili etichette sarebbe female, malee other, non importa quale. Tuttavia, la mia variabile categorica è cityche potrebbe accadere che la persona che sto cercando di prevedere abbia una nuova città che il mio classificatore non ha mai visto.

Mi chiedo se c'è un modo per fare la classificazione in questi termini o se dovrei ripetere la formazione considerando questi nuovi dati categorici.


1
puoi convertire cityin un numero basato su alcune funzioni? In city' = f(latitude, longitude)questo modo, puoi creare un nuovo valore per qualsiasi città
Mohammad Athar,

@MohammadAthar qui ha dato la soluzione perfetta, spero che OP lo veda!
Francesco Pegoraro,

Risposte:


11

È un'ottima domanda; in realtà questo problema esiste da un po 'e non ho ancora trovato la soluzione perfetta. Eppure più che felice di condividere la mia esperienza:

  • Evita il più possibile una codifica a caldo (contrariamente a quanto suggerito sopra). Il ragionamento è che non funzionerà. Un modello con funzionalità di codifica a caldo funziona solo quando tutti i livelli secondari erano presenti nei dati di addestramento. Il modello non sarà in grado di fare previsioni, a meno che in qualche modo non sia modificato manualmente. Se esegui una ricerca, scoprirai che molte persone si sono imbattute in questo problema durante la suddivisione dei loro dati in treno / test e hanno affrontato il problema di alcuni sotto-livelli di una particolare funzione non presenti nella divisione di allenamento e successivamente non sono riusciti a fare previsioni sul test. A parte questo, se hai caratteristiche cardinali molto alte (forse come la tua città con diciamo 200 nomi di città), questo aumenterà inutilmente la dimensionalità dei tuoi dati! Se per alcuni motivi potresti dover eseguire una codifica a caldo, tieni a mente questi aspetti.
  • Usa altri metodi di codifica . Forse prova ad imparare di più su altri metodi che sono robusti a questo problema, almeno per il momento come codifica basata su target, hash (vedi alcuni riferimenti di seguito). Se sei con Python c'è un bel pacchetto che offre opzioni di codifica mant. Potresti essere sorpreso di vedere che altri semplici metodi spesso funzionano bene.

  • Retrain il tuo modello . Teoricamente quando l'apprendimento del tuo treno / set avrebbe dovuto avere la stessa distribuzione (principalmente questo è pensato come distribuzione target, ma può essere vero anche per le variabili). Ora che entrano in gioco nuovi elementi, la distribuzione dei dati di test (invisibile) è cambiata. Quindi è meglio riqualificare nuovamente il modello in modo tale da tenere conto di quelle nuove città.

  • Metti le sottocategorie appena aggiunte (e quelle meno frequenti) su Altri . Sebbene teoricamente il punto precedente sia vero, è molto probabile che la distribuzione del test (di quella particolare categoria) non cambierà drasticamente nella maggior parte dei casi, ad esempio pochissimi articoli vanno al di sopra delle categorie nel set di addestramento. Forse come nel tuo caso, potresti avere 100 città nella caratteristica città e solo pochissime nuove arrivano nel tempo. Quello che prenderei in considerazione sarebbe guardare il quantile X di quella particolare categoria e mettere i meno frequenti nella sottocategoria degli Altri . Supponendo che il punto dati appena aggiunto sia solo poco, andrà molto negli Altrigruppo. Perderai sicuramente un livello di granularità facendo questo, ma ancora una volta il punto di apprendimento è che non solo il tuo modello apprende i dati di addestramento, ma soprattutto per essere in grado di generalizzare molto bene su dati invisibili e se quelle nuove categorie aggiunte sono punti di dati molto, raggrupparli nel gruppo Altri non farà male.

  • Altre recenti soluzioni non ancora mature come Cat2Vec (presa in prestito da Word2Vec da NLP) o la codifica di somiglianza . Questi sono molto recenti, controlla il documento per il primo e il suo github e un esempio (basato su Word2Vec) in Kaggle, e questo documento per il secondo e la sua implementazione . L'idea del primo è di convertire le categorie in vettori. Per quanto devo dire, ha davvero senso lavorare, ma non ho esperienza nell'usarlo. Quest'ultimo, il cosiddetto dirty_cat , sembra abbastanza promettente e facile da usare. Non è chiaro se sia solido avere una categoria cardinale invisibile nei dati del test!

PS: Vorrei aggiungere che l'idea di città in una posizione geografica data nel primo commento è davvero piacevole e in realtà non è complicata in quanto sono molte API Python, ad esempio da Google o QUI che ti permettono di farlo. Ma si noti che questo è solo un modo per progettare nuove funzionalità e certamente non deve essere sostituito dalla funzionalità stessa della città.

Riferimenti interessanti da verificare primo , secondo , terzo , quarto (nessun ordine particolare!)

Tutti i punti sopra menzionati sono soluzioni pratiche piuttosto concretamente teoricamente corrette e sicuramente soggette a ulteriori discussioni. E sono più che felice di saperne di più.


1
Che dire della creazione di cluster di città simili? Come anche se abbiamo una nuova città, non è diverso da quello che già abbiamo, possiamo fare un controllo incrociato con la città corrispondente più vicina?
Aditya,

Piacere Aditya. Anche questa è un'altra idea eccellente. Non conosco la nuova "codifica di somiglianza", è possibile che stiano facendo esattamente la stessa cosa. Controlla il loro tutorial. Inoltre una nota a margine che si deve fare attenzione a quale clustering utilizzare per dati categorici come le k-mode, dopo che tutte le loro distanze non hanno un significato simile ai valori numerici.
TwinPenguins,

Grazie per l'ottima risposta. Come potrei fare la riqualificazione? Voglio dire, immagina di avere un nuovo candidato e voglio prevedere se lui / lei è buono o cattivo, come potrei riqualificare il mio modello se non ho la sua vera etichetta che indica se è buono o no? Non vedo il modo di includere questi nuovi dati per la riqualificazione e mi mancherà il punto di previsione. Ho sbagliato?
Marisa,

Prego. Informazioni sulla riqualificazione: significa letteralmente ricominciare, mescolare tutti i tuoi dati assicurandoti di avere nuovi dati e ricominciare a imparare. L'altro punto che hai menzionato è che non hai la vera etichetta per quel particolare nuovo punto di dati: questa è una storia molto diversa per sé. Quello che potresti fare per etichettare questo punto dati è guardare quel punto dati molto simile e prendere l'etichetta da lì come il semplicissimo algoritmo KNN.
TwinPenguins,

4

La cosa più semplice da fare (che di solito è un buon punto di partenza) è solo una codifica a caldo delle tue città in cui ogni città diventa una singola caratteristica e ha valori di 1 (la persona proviene da quella città) o 0 (non da quella città). Se una nuova città appare in un set di test che non è presente nel set di addestramento, quella persona avrà solo 0 per tutte le città nel set di addestramento. Questo può sembrare strano ma, se quella città non è nel set di allenamento, allora non dovrebbe esserci peso per una persona che proviene da quella città.

Il prossimo passo sarebbe qualcosa sulla falsariga di ciò che Mohammad Athar ha suggerito e avere un'idea della vicinanza geografica con altre città del tuo set di allenamento. Sarà molto più complicato, quindi permetterò a qualcun altro di commentarlo.


Partire semplice e crescere da lì è un ottimo consiglio!
Escachator,

0

Dovresti dare un'occhiata a Vowpal Wabbit , che gestisce le funzioni molto piacevolmente nuove usando un trucco di hashing e tassi di apprendimento adattivo.

Non solo non si arresta in modo anomalo quando vengono visualizzate nuove funzionalità (in treno o durante i test), ma inizierà anche ad aggiornarne i pesi. Inoltre, il suo veloce malvagio. Tuttavia implementa solo varianti del modello lineare, quindi sei limitato da quel lato. Uno strumento molto potente da conoscere

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.