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?
preprocessing
Pooja
la source
la source
Réponses:
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:
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.
la source
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.
la source
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:
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!
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.
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.
la source
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.
la source