Diversi set di test e distribuzione di set di addestramento


14

Sto lavorando a un concorso di scienza dei dati per il quale la distribuzione del mio set di test è diversa dal set di training. Voglio sottocampionare le osservazioni dal set di addestramento che assomiglia molto al set di test.

Come posso fare questo?


Sottocampionamento casuale, Sottocampionamento casuale, Campionamento basato su cluster, Campionamento informato su campionamento: tecnica di sovracampionamento di minoranza sintetica, tecnica di sovracampionamento di minoranza sintetica modificata (MSMOTE) ecc.
Aditya,

È meglio contrassegnare una delle risposte come "Risposta accettata" se si è soddisfatti di una di esse.
TwinPenguins

Risposte:


16

Ottima domanda, questo è ciò che è noto nel paradigma di Machine Learning come "Covariate Shift", o "Model Drift" o "Nonstationarity" e così via.

Uno dei presupposti critici che si potrebbero fare per costruire un modello di apprendimento automatico per le previsioni future è che i dati invisibili (test) provengono dalla stessa distribuzione dei dati di addestramento! Tuttavia, in realtà questa ipotesi piuttosto semplice si interrompe facilmente e i dati imminenti (la sua distribuzione) cambiano nel tempo per molte ragioni. Per coloro che potrebbero non avere familiarità con questo problema molto importante, incoraggio a guardare qui o post !

Per me, la tua domanda rientra nella stessa categoria. Anche se non ho la soluzione perfetta (un'implementazione da offrire), ma penso che potresti guardare:

  • Questo post sul blog offre un modo semplice per gestire il sottocampionamento dei dati di allenamento con il codice fornito in Python!
  • Controlla questo documento di ricerca . Propongono di risolvere il problema ponderando i dati di allenamento in modo che la distribuzione dell'allenamento sia più vicina alla distribuzione del test usando la procedura di stima dell'importanza di Kullback-Leibler basata sul teorema della " divergenza di Kullback-Leibler ". Non so se forniscono un'implementazione o se può essere implementata facilmente, ma penso che valga la pena scavare in quanto sembra un modo professionale per gestire la mancata corrispondenza della distribuzione.

Aggiornamento rapido (una buona soluzione) : ho trovato un'implementazione Python dell'algoritmo KLIEP di quel documento di ricerca (ultimo punto) per trovare quei pesi. Sembra piuttosto facile da usare! Fondamentalmente ricampiona l'allenamento mettendo i pesi (tramite l'algoritmo KLIEP) in modo che il presupposto di avere una distribuzione simile di treno e prova sia il più vero possibile.


5

Voglio sottocampionare le osservazioni dal set di addestramento che assomiglia molto al set di test.

Non sono sicuro che vorresti farlo. L'intero scopo è piuttosto quello di addestrare il tuo algoritmo in modo che si generalizzi bene ai dati invisibili.

Di solito, si dovrebbero adattare i propri dati di prova ai dati del treno (ad es. Standardizzare i dati di prova in base ai dati del treno ) e non viceversa. In pratica, non conosci i tuoi dati di test.


3

Il sottocampionamento dei set di treni potrebbe non essere la soluzione migliore!

Le differenze tra set di test / esecuzione e distribuzione / funzionalità del set di addestramento sono molto comuni nei compiti di apprendimento supervisionato (questo è uno dei motivi per cui competizioni come Kaggle sono impegnative). Questo è il motivo per cui diciamo che la performance passata può essere (solo) utilizzata come guida per stimare la performance futura, ma non la indica / garantisce . Pertanto, i modelli generalizzabili sono sempre stati preferiti rispetto ai modelli perfezionati che possono funzionare molto bene sul treno (sotto) set, ma scarsamente sui dati invisibili.

Mentre tale differenza è normale, il divario troppo ampio tra il campione passato e futuro può essere indicato come esempio di deriva del concetto che è un campo di ricerca attivo da solo. Data la tua domanda, non posso giudicare che il tuo caso sia un normale caso ML o che la deriva del concetto stia realmente accadendo.

Questi sono i miei suggerimenti:

  1. Addestra un numero di modelli con elevata capacità di generalizzazione. Utilizzando bootstrap campionamento dal treno insieme di dati, si può facilmente calcolare pregiudizi e varianza componenti di errori. Ricorda che stai cercando un modello a bassa varianza (in cui i cambiamenti nei dati avrebbero un effetto marginale sulle sue prestazioni) piuttosto che modelli a bassa propensione ma ad alta varianza (che potrebbero adattarsi al tuo set di allenamento). Ora puoi selezionare i migliori algoritmi e valutarli rispetto al set di test. Si noti che durante l'allenamento non dovevamo guardare il set di test!

  2. Invece di diversi downsampling casuali, cerca la standardizzazione / normalizzazione e la selezione / ingegneria delle funzionalità. Queste tecniche potrebbero essere pratiche nell'apprendimento di modelli più generali. Ad esempio, a volte l'intervallo del dominio delle funzionalità può cambiare nel tempo mentre la forma della distribuzione (qualunque essa sia) rimane quasi la stessa (ad esempio la stessa distribuzione che viene spostata verso sinistra o destra). In tal caso, una semplice standardizzazione (ovvero mappatura del treno e test dei campioni su uno spazio predefinito come [0,1] utilizzando diverse funzioni di mappatura) può ridurre i sintomi.

  3. Il downsampling sistematico può essere una soluzione appropriata solo se lo fai sulla base di alcune conoscenze sul problema (non solo allo scopo di ottenere una migliore precisione sul set di dati di test). Ad esempio, potresti sapere che alcuni dei record nei dati del treno vengono campionati molto tempo fa, da un campo lontano, o influenzati da fattori particolari che nessuno di loro accadrà in futuro (nella raccolta dei dati di prova). In tal caso, è possibile rimuovere quei campioni che possono essere irrilevanti poiché si è certi che non si vedranno tali schemi in futuro (intendo che si dovrebbe avere una logica dietro la selezione del sottoinsieme di addestramento piuttosto che guardare nel set di test che in realtà, non hai accesso ad esso). In tal caso, lo chiamo rimozione anomala piuttosto che il downsampling.


1
p(y|x)

-1

C'è un buon pacchetto in Python (scikit learn)

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Puoi sottocampionare le tue osservazioni dal set di allenamento usando questo pacchetto.


1
Per quanto ho capito la domanda, le distribuzioni treno / test sono diverse che, se non prese in considerazione, porterebbe a ciò che è noto "Covariate Shift". Un semplice sottocampione che utilizza l'implementazione "train_test_split" in scikit learn menzionato qui non terrà conto delle distribuzioni durante la divisione! Pertanto la risposta non è pertinente.
TwinPenguins,
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.