Mesurer la précision d'un modèle basé sur la régression logistique


26

J'ai un modèle de régression logistique formé que j'applique à un ensemble de données de test. La variable dépendante est binaire (booléenne). Pour chaque échantillon de l'ensemble de données de test, j'applique le modèle de régression logistique pour générer un% de probabilité que la variable dépendante soit vraie. Ensuite, j'enregistre si la valeur réelle était vraie ou fausse. Je suis en train de calculer un ou ajusté figure comme dans un modèle de régression linéaire.R 2R2R2

Cela me donne un enregistrement pour chaque échantillon dans l'ensemble de test comme:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

Je me demande comment tester la précision du modèle. Ma première tentative a été d'utiliser un tableau de contingence et de dire "si prob_value_is_true> 0,80, devinez que la valeur réelle est vraie", puis de mesurer le rapport des classifications correctes aux incorrectes. Mais je n'aime pas ça, parce que j'ai l'impression que j'évalue simplement le 0.80 comme une limite, pas la précision du modèle dans son ensemble et à toutes les prob_value_is_truevaleurs.

Ensuite, j'ai essayé de regarder chaque valeur discrète prob_value_is_true, à titre d'exemple, en regardant tous les échantillons où prob_value_is_true= 0,34 et en mesurant le% de ces échantillons où la valeur réelle est vraie (dans ce cas, une précision parfaite serait si le% des échantillons c'était vrai = 34%). Je pourrais créer un score de précision du modèle en additionnant la différence à chaque valeur discrète de prob_value_is_true. Mais la taille des échantillons est une énorme préoccupation ici, en particulier pour les extrêmes (proches de 0% ou 100%), de sorte que les moyennes des valeurs aiguës ne sont pas précises, donc les utiliser pour mesurer la précision du modèle ne semble pas correct.

J'ai même essayé de créer d'énormes plages pour garantir des tailles d'échantillon suffisantes (0-.25, .25-.50, .50-.75, .75-1.0), mais comment mesurer la «qualité» de ce% de la valeur réelle me décourage . Supposons que tous les échantillons dont la valeur se prob_value_is_truesitue entre 0,25 et 0,50 ont une moyenne acutal_valuede 0,45. Est-ce bien puisque c'est dans la gamme? Mauvais puisque ce n'est pas près de 37,5% (le centre de la gamme)?

Je suis donc coincé à ce qui semble être une question facile, et j'espère que quelqu'un pourra me diriger vers une ressource ou une méthode pour calculer une précision stastique pour un modèle de régression logistique.


Je pense que l'exemple des plages: (0-.25, .25-.50, .50-.75, .75-1.0) a du sens. Serait-il utile de réduire les plages? Tels que: 0-.03, .03-.06, .06-.09, ..... c'est-à-dire tous les .03. Cela peut être utile pour les régions avec de nombreux points de données.
mac

Réponses:


18

Une mesure qui est souvent utilisée pour valider la régression logistique est l'ASC de la courbe ROC (tracé de la sensibilité par rapport à la spécificité 1 - il suffit de google pour les termes si nécessaire). Ceci, en substance, évalue toute la gamme des valeurs de seuil.

Inconvénient: évaluer toute la plage de valeurs de seuil n'est peut-être pas ce que vous recherchez, car cela inclut (généralement) des seuils qui entraînent un très grand nombre de faux négatifs ou de faux positifs. Il existe des versions de l'AUC qui en tiennent compte (AUC partielle), donc si cela vous pose problème, vous pouvez vous en occuper.


1
Mis à part l'AUC pendant un moment, ai-je raison de supposer que la construction de la courbe ROC est quelque chose comme ça? Pour chaque valeur discrète de prob_value_is_true, créez une table de contingence en utilisant la valeur discrète comme seuil. Enregistrez ensuite le vrai taux positif et le faux taux positif de chaque table de contingence. Tracez les taux de toutes les tables de contingence sur un nuage de points et vous devriez voir la courbe ROC? Est-ce que ça sonne bien?
John Reed

J'ai rassemblé du code pour ce faire, en alimentant simplement des valeurs aléatoires comme la probabilité et la valeur réelle, et c'était une ligne droite. Je suppose que l'ASC mesure l'écart de la "courbe" par rapport à un modèle ajusté par rapport à la "ligne" ou au hasard?
John Reed

Concernant ROC: oui, c'est à peu près juste. Il existe quelques variantes (plus ou moins lissées; tenant compte des probabilités prédites pour votre choix de seuils ou non). Notez que (en fonction du logiciel / de la langue de votre choix), il existe une myriade d'outils qui le fournissent déjà. Wrt AUC: elle n'est ni plus ni moins que l'aire réelle sous la courbe ROC. Pas avec un prédicteur aléatoire parfait, la courbe ROC serait une ligne droite de (0,0) à (1,1), résultant en une ASC de 0,5. L'AUC a cependant de belles interprétations (voir Google ou Wikipedia même :-))
Nick Sabbe

8

clowessval.probrmsrms fera de même pour la validation interne, en utilisant le rééchantillonnage pour supprimer les effets du sur-ajustement.


6

XX=dixX=20X=30mean(y[x==10]==1)mean(y[x==20]==1)Xvariable, comme vous le suggérez. Ce n'est pas entièrement valide, car cela dépendra du choix des bacs, peut être utile comme moyen d'explorer votre modèle.

En général, la tâche que vous vous êtes donnée ici est difficile. En effet, avec la régression logistique, vous avez affaire à deux types de choses différents. Les prédictions du modèle sont une variable latente, contrairement à votre variable de réponse observée (bien qu'elle soit vraisemblablement générée par une variable latente). Bien sûr, les gens voudront souvent savoir quelle est la réponse prévue, et c'est tout à fait raisonnable; ce n'est qu'un de ces cas où la vie n'est pas juste.

y=1y^.5y=1y^p(y=1)y^=.31y1<.5

(0,1)R2R2c


Très bonne réponse! Donc, dans l'exemple où 30% de tous les cas sont des 1, la probabilité prévue de 0,31 d'un cas particulier est comme un "classement" de ce cas par rapport à d'autres cas sur la façon dont il est proche de 1 (le plus grand est le plus proche)? Et cela ne devrait pas être considéré comme la probabilité prédite que ce cas particulier soit 1?
mac

1
y^je=.311.31.31.25

3

Je pense que vous pourriez établir un seuil (disons 0,5), donc lorsque votre probabilité est égale ou supérieure à ce seuil, votre classe prédite serait 1 et 0 sinon. Ensuite, vous pouvez obtenir une mesure de votre précision de cette manière:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

Étant donné que votre probabilité est la probabilité de donner vos données (x) et en utilisant votre modèle votre valeur de classe (y) est égale à 1, je ne comprends pas pourquoi vous obtenez toujours des valeurs de probabilité inférieures à 0,5. Quelle est la fréquence de vos classes réelles (actual_value)?


2

Vous voudrez peut-être consulter mon package softclassval(sur softclassval.r-forge.r-project.org, vous trouverez également deux présentations orales que j'ai faites sur les idées derrière le package).

Je l'ai écrit pour un problème légèrement différent, à savoir si la référence (par exemple pathologiste) "refuse" de donner une classe claire. Cependant, vous pouvez l'utiliser avec des classes dures "normales" et évite la définition d'un seuil pour durcir la prédiction à l'origine continue - donc vous n'évaluez pas le 0.8.

Cependant, je recommande de l'utiliser avec, disons, un ROC ou un diagramme de sensibilité-spécificité: les résultats seront souvent assez mauvais car "mes" méthodes pénaliseront les écarts déjà légers (par exemple 0,9 au lieu de 1 donne une différence de 0,1 pour mes mesures , mais tous les seuils inférieurs à 0,9 l'ignoreront). En fait, je pense que c'est plutôt un avantage: le manque de cette sensibilité contre les petites déviations est l'un des principaux points de critique avec ces mesures "durcies" comme la précision, la sensibilité, le rappel, etc.

De plus, en comparant l'erreur absolue moyenne (MAE) et l'erreur quadratique moyenne RMSE, vous pouvez savoir si vous avez de nombreux petits écarts ou moins d'échantillons grossièrement mal évalués.


1

Prje=jenvlogjet(une+bXje) .

y.rep[je]Bernoullje(p[je])

Ensuite, exécutez cette simulation, disons, 100 fois. Vous aurez une matrice avec n lignes (n est le nombre de sujets) et k colonnes (dans ce cas, k = 100, le nombre de simulations). En code r:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

Maintenant, vous calculez la différence entre le prévu dans chaque simulation et observé. Après avoir calculé cette différence, il suffit de calculer le nombre moyen de vrais positifs et de faux positifs pour chaque ligne (chaque sujet) et de tracer l'histogramme. Ou calculez les deux pour chaque colonne (simulation) et tracez l'histogramme (je préfère cela).

J'espère que ça aide...


1

Il existe de nombreuses façons d'estimer la précision de telles prédictions et le choix optimal dépend vraiment de la raison pour laquelle l'estimation sera mise en œuvre.

Par exemple, si vous prévoyez de sélectionner quelques résultats élevés pour une étude de suivi coûteuse, vous souhaiterez peut-être maximiser la précision des résultats élevés. D'un autre côté, si l'étude de suivi est bon marché, vous souhaiterez peut-être maximiser le rappel (sensibilité) à des scores inférieurs. L'AUC ROC peut convenir si vous comparez différentes méthodes, etc.

Côté pratique, Rle ROCRpackage contient 2 fonctions utiles

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Ensemble, ces fonctions peuvent calculer un large éventail de mesures de précision, y compris des valeurs scalaires globales (telles que "auc" ) et des vecteurs dépendant du score pour tracer la précision de rappel et les courbes ROC ( "prec" , "rec" , "tpr" et "fpr" , etc.)


1

Vous devez définir ce que vous entendez par «précision». Ce que vous voudriez savoir, veuillez m'excuser de vous avoir mis des mots dans la bouche, c'est à quel point votre modèle correspond aux données d'entraînement, et plus important encore, à quel point ce modèle "se généralise" aux échantillons qui ne figurent pas dans vos données d'entraînement. Bien que les courbes ROC puissent être utiles pour analyser le compromis entre la précision et le rappel pour différentes valeurs du seuil, je suggère d'ajouter l'erreur quadratique moyenne ou le score de Brier à votre boîte à outils. Il est facile à calculer et vous pouvez immédiatement savoir si les changements de fonctionnalités affectent l'ajustement du modèle, lorsqu'ils sont appliqués aux données d'entraînement. Étant donné que la sur-adaptation est possible dans ce cas, votre travail ne se fait pas ici. Pour évaluer les performances de généralisation, ou comment vous faites sur des données que vous n'avez pas vues, ce n'est pas t assez pour regarder vos performances sur les échantillons de formation. Bien sûr, votre modèle est bon dans ces domaines, car ce sont les valeurs que vous avez utilisées pour déterminer les coefficients de votre logistique. Vous devez mettre de côté certains échantillons pour les données de test. Vos performances MSE sur cet ensemble devraient définir vos attentes de généralisation en fonction de l'inégalité de Hoeffding. Votre erreur de généralisation maximale dépendra du nombre de fonctionnalités de votre modèle ainsi que du nombre d'échantillons utilisés pour calculer la statistique de test. N'oubliez pas que vous devrez voler certains de vos échantillons d'entraînement pour des échantillons de test. Je recommande la validation croisée 10 fois, où vous mélangez, choisissez 90% pour la formation, 10% pour les tests, puis mesurez, répétez, puis faites la moyenne de toutes les mesures. car ce sont les valeurs que vous avez utilisées pour déterminer les coefficients de votre logistique. Vous devez mettre de côté certains échantillons pour les données de test. Vos performances MSE sur cet ensemble devraient définir vos attentes de généralisation en fonction de l'inégalité de Hoeffding. Votre erreur de généralisation maximale dépendra du nombre de fonctionnalités de votre modèle ainsi que du nombre d'échantillons utilisés pour calculer la statistique de test. N'oubliez pas que vous devrez voler certains de vos échantillons d'entraînement pour des échantillons de test. Je recommande la validation croisée 10 fois, où vous mélangez, choisissez 90% pour la formation, 10% pour les tests, puis mesurez, répétez, puis faites la moyenne de toutes les mesures. car ce sont les valeurs que vous avez utilisées pour déterminer les coefficients de votre logistique. Vous devez mettre de côté certains échantillons pour les données de test. Vos performances MSE sur cet ensemble devraient définir vos attentes de généralisation en fonction de l'inégalité de Hoeffding. Votre erreur de généralisation maximale dépendra du nombre de fonctionnalités de votre modèle ainsi que du nombre d'échantillons utilisés pour calculer la statistique de test. N'oubliez pas que vous devrez voler certains de vos échantillons d'entraînement pour des échantillons de test. Je recommande la validation croisée 10 fois, où vous mélangez, choisissez 90% pour la formation, 10% pour les tests, puis mesurez, répétez, puis faites la moyenne de toutes les mesures. Vos performances MSE sur cet ensemble devraient définir vos attentes de généralisation en fonction de l'inégalité de Hoeffding. Votre erreur de généralisation maximale dépendra du nombre de fonctionnalités de votre modèle ainsi que du nombre d'échantillons utilisés pour calculer la statistique de test. N'oubliez pas que vous devrez voler certains de vos échantillons d'entraînement pour des échantillons de test. Je recommande la validation croisée 10 fois, où vous mélangez, choisissez 90% pour la formation, 10% pour les tests, puis mesurez, répétez, puis faites la moyenne de toutes les mesures. Vos performances MSE sur cet ensemble devraient définir vos attentes de généralisation en fonction de l'inégalité de Hoeffding. Votre erreur de généralisation maximale dépendra du nombre de fonctionnalités de votre modèle ainsi que du nombre d'échantillons utilisés pour calculer la statistique de test. N'oubliez pas que vous devrez voler certains de vos échantillons d'entraînement pour des échantillons de test. Je recommande la validation croisée 10 fois, où vous mélangez, choisissez 90% pour la formation, 10% pour les tests, puis mesurez, répétez, puis faites la moyenne de toutes les mesures.


1

0-bûche(1-p^)01-bûche(p^)1

Cela ne souffre pas de seuils arbitraires. Plus la mesure est petite, mieux c'est.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.