Distribution de jeux de tests et de formations différents

14

Je travaille sur un concours de science des données pour lequel la distribution de mon set de test est différente de la set de formation. Je veux sous-échantillonner les observations de l'ensemble d'apprentissage qui ressemble étroitement à l'ensemble de test.

Comment puis-je faire ceci?

Pooja
la source
Sous-échantillonnage aléatoire, suréchantillonnage aléatoire, suréchantillonnage en grappes, suréchantillonnage éclairé: technique de suréchantillonnage des minorités synthétiques, technique de suréchantillonnage des minorités synthétiques modifiées (MSMOTE), etc.
Aditya
Vous feriez mieux de marquer l'une des réponses comme «Réponse acceptée» si vous êtes satisfait de l'une d'entre elles.
TwinPenguins

Réponses:

16

Grande question, c'est ce qui est connu dans le paradigme du Machine Learning comme "Covariate Shift", ou "Model Drift" ou "Nonstationarity" et ainsi de suite.

L'une des hypothèses critiques que l'on ferait pour construire un modèle d'apprentissage automatique pour les prévisions futures est que les données invisibles (test) proviennent de la même distribution que les données d'entraînement! Cependant, en réalité, cette hypothèse assez simple se casse facilement et les données à venir (sa distribution) changent au fil du temps pour de nombreuses raisons. Pour ceux qui ne connaissent peut-être pas ce problème très important, j'encourage à regarder ici ou à poster !

Pour moi, votre question tombe dans la même catégorie. Bien que je n'aie pas la solution parfaite (une implémentation à proposer), mais je pense que vous pouvez regarder:

  • Ce billet de blog vous donne un moyen simple de gérer le sous-échantillonnage des données de formation avec le code fourni en Python!
  • Consultez ce document de recherche . Ils proposent de résoudre le problème en repondérant les données de formation afin que la distribution de la formation soit plus proche de la distribution du test en utilisant la procédure de Kullback-Leibler Importance Estimation basée sur le théorème de la « divergence Kullback-Leibler ». Je ne sais pas s'ils fournissent une implémentation ou si elle peut être implémentée facilement, mais je pense que cela pourrait valoir la peine d'être creusé, car cela semble une manière professionnelle de gérer le décalage de distribution.

Mise à jour RAPIDE (une bonne solution) : J'ai trouvé une implémentation Python de l'algorithme KLIEP de ce document de recherche (dernier point) pour trouver ces poids. Il semble plutôt facile à utiliser! Fondamentalement, il rééchantillonne la formation en mettant des poids (via l'algorithme KLIEP) de sorte que l'hypothèse d'avoir une distribution similaire de train et de test reste vraie autant que possible.

TwinPenguins
la source
5

Je veux sous-échantillonner les observations de l'ensemble d'apprentissage qui ressemble étroitement à l'ensemble de test.

Je ne suis pas sûr que vous voudriez faire ça. Le but est plutôt de former votre algorithme pour qu'il se généralise bien aux données invisibles.

Habituellement, il faut adapter ses données de test à ses données de train (par exemple normaliser les données de test en fonction des données de train ) et non l'inverse. En pratique, vous ne connaissez pas vos données de test.

Arnaud
la source
3

Le sous-échantillonnage des trains pourrait ne pas être la meilleure solution!

Les différences entre l'ensemble de test / exécution et la distribution / les fonctionnalités de l'ensemble de formation sont très courantes dans les tâches d'apprentissage supervisé (c'est l'une des raisons pour lesquelles les compétitions telles que Kaggle sont difficiles). C'est pourquoi nous disons que les performances passées peuvent être (uniquement) utilisées comme guide pour estimer les performances futures mais elles ne les indiquent pas / ne les garantissent pas . Par conséquent, les modèles généralisables ont toujours été préférés aux modèles affinés qui peuvent très bien fonctionner sur le (sous-) train, mais mal fonctionner sur les données invisibles.

Bien qu'une telle différence soit normale, l'écart trop important entre l'échantillon passé et futur peut être considéré comme des exemples de dérive conceptuelle qui est un domaine de recherche actif en soi. Compte tenu de votre question, je ne peux pas juger que votre cas est un cas de ML normal ou que la dérive du concept se produit réellement.

Ce sont mes suggestions:

  1. Former un certain nombre de modèles avec une capacité de généralisation élevée. En utilisant l' échantillonnage bootstrap de votre jeu de données de train, vous pouvez facilement calculer les composantes de biais et de variance des erreurs. Rappelez-vous que vous recherchez un modèle à faible variance (où les changements de données auraient un effet marginal sur ses performances) plutôt que des modèles à faible biais mais à forte variance (qui pourraient s'adapter à votre (sous-ensemble) d'entraînement). Maintenant, vous pouvez sélectionner les meilleurs algorithmes et les évaluer par rapport à l'ensemble de test. Notez que pendant le temps d'entraînement, nous étions censés ne pas regarder l'ensemble de test!

  2. Au lieu de plusieurs sous-échantillonnage aléatoire, recherchez la normalisation / normalisation et la sélection / ingénierie des fonctionnalités. Ces techniques pourraient être pratiques pour apprendre des modèles plus généraux. Par exemple, parfois, la plage du domaine d'entités peut changer avec le temps tandis que la forme de la distribution (quelle qu'elle soit) reste presque la même (par exemple la même distribution qui est décalée vers la gauche ou la droite). Dans ce cas, une simple standardisation (c'est-à-dire le mappage du train et des échantillons de test à un espace prédéfini tel que [0,1] en utilisant différentes fonctions de mappage) peut réduire les symptômes.

  3. Le sous- échantillonnage systématique ne peut être une solution appropriée que si vous le faites sur la base de certaines connaissances sur le problème (pas seulement dans le but d'obtenir une meilleure précision sur l'ensemble de données de test). Par exemple, vous savez peut-être que certains des enregistrements dans les données du train sont échantillonnés il y a longtemps, depuis un champ éloigné, ou affectés par des facteurs particuliers qu'aucun d'entre eux ne se produira à l'avenir (lors de la collecte des données de test). Dans ce cas, vous pouvez supprimer les échantillons qui peuvent ne pas être pertinents car vous êtes sûr que vous ne verrez pas de tels modèles à l'avenir (je veux dire que vous devriez avoir une justification derrière la sélection du sous-ensemble de formation plutôt que de regarder dans l'ensemble de test qui en réalité, vous n'y avez pas accès). Dans ce cas, je l'appelle la suppression des valeurs aberrantes plutôt que de sous-échantillonnage.

Borhan Kazimipour
la source
1
p(y|x)
-1

Il y a un bon paquet en python (scikit learn)

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

Vous pouvez sous-échantillonner vos observations à partir de l'ensemble d'entraînement à l'aide de ce package.

Taimur Islam
la source
1
Pour autant que je comprends la question, les distributions de train / test sont différentes qui, si elles ne sont pas prises en compte, conduiraient à ce que l'on appelle le «décalage covariable». Un sous-échantillon simple utilisant l'implémentation "train_test_split" dans scikit learn mentionné ici ne prendra pas en compte les distributions pendant le fractionnement! La réponse n'est donc pas pertinente.
TwinPenguins