J'ai un ensemble de données de 140000 exemples et 30 fonctionnalités pour lesquelles je forme plusieurs classificateurs pour une classification binaire (SVM, régression logistique, forêt aléatoire, etc.)
Dans de nombreux cas, le réglage hyperparamétrique de l'ensemble de données à l'aide de la recherche par grille ou aléatoire est trop coûteux en temps.
J'ai commencé à utiliser la technique suivante
- Sous-échantillon de mon jeu de données
- Utilisez la fraction obtenue pour régler les hyperparamètres sur
- Utilisez les paramètres obtenus pour former un modèle en utilisant l'ensemble de données entier
Pour évaluer chaque ensemble de paramètres à la deuxième étape, j'utilise sklearn
's GridSearchCV
avec cv = 10. Pour évaluer le modèle final que je crée à la troisième étape, j'utilise celui sklearn
de cross_val_predict
. Dans ce sens, j'évalue mes modèles en laissant 10% pour cent des données, je m'entraîne sur le reste et mesure la précision prédictive sur les 10%, de manière itérative 10 fois, puis en prenant la moyenne des scores.
Ce qui m'a inquiété, c'est que la précision des prédictions que j'obtiens en m'entraînant sur l'ensemble de mes données, est vraiment proche de l'évaluation que j'obtiens lors du réglage des paramètres pour le meilleur ensemble de paramètres (chaque ensemble de paramètres testé génère un score obtenu à partir de la moyenne de 10- résultats de validation croisée).
La plupart du temps, la précision cross_val_predict
mesurée à l'aide de tous les exemples d'apprentissage (ensemble de données entier) est un peu supérieure à ce que l'évaluation des meilleurs paramètres a renvoyé.
Pour illustrer cela, voici l'évaluation d'un ensemble de paramètres (sur un ensemble de données plus petit que ce que j'ai décrit ci-dessus mais l'effet est le même)
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
Et voici les scores moyens (de cross_val_predict
) que j'ai obtenus de la formation sur l'ensemble de mes données en utilisant les meilleurs paramètres
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
Comme vous pouvez le voir, la formation sur l'ensemble de données améliore les résultats. J'ai également validé qu'un modèle mal réglé (par exemple en utilisant les valeurs par défaut ou des valeurs aléatoires pour C
et gamma
) conduit à une précision de prédiction bien pire.
Dans l'ensemble, je pense que le réglage des hyperparamètres sur un sous-ensemble n'est pas idéal mais peut potentiellement conduire à des résultats relativement bons sans avoir à attendre trop longtemps. Par exemple, avant d'utiliser cette approche, j'ai utilisé le optunity
package pour régler l'hyperparamètre sur l'ensemble de données. Cette procédure prendrait de 3 à 5 jours et produirait des résultats qui avaient soit une très bonne précision, soit un très bon rappel, mais pas les deux. classificateurs avaient atteint) la mesure f1 était vraiment faible. Au contraire, l'utilisation de l'approche tardive conduit à quelques heures de formation et à une meilleure mesure f1.
Mes préoccupations sont les suivantes:
Dois-je limiter la précision de ma classification? Dois-je éviter d'utiliser toute la puissance de prédiction que mon ensemble de données peut offrir en optimisant uniquement sur un sous-ensemble? Si un tel préjudice de performance se produit, est-il en quelque sorte limité par un facteur?