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 2
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_true
valeurs.
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_true
situe entre 0,25 et 0,50 ont une moyenne acutal_value
de 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.
la source
Réponses:
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.
la source
lowess
val.prob
rms
rms
fera de même pour la validation interne, en utilisant le rééchantillonnage pour supprimer les effets du sur-ajustement.la source
mean(y[x==10]==1)
mean(y[x==20]==1)
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.
la source
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:
É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)?
la source
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.
la source
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:
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...
la source
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,
R
leROCR
package contient 2 fonctions utilesEnsemble, 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.)
la source
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.
la source
Cela ne souffre pas de seuils arbitraires. Plus la mesure est petite, mieux c'est.
la source