[PYTHON] Score LightGBM ajusté dans la distribution bêta

Préface

LightGBM est une option pour apprendre les modèles de classification binaire de nos jours. Cependant, j'ai toujours eu peur que le score craché n'indique pas nécessairement une valeur de probabilité. Si je voulais faire quelque chose à ce sujet, j'ai trouvé une méthode qui semblait bonne.

Qu'est-ce que la classification binaire?

La classification binar est une tâche d'apprentissage automatique qui détermine s'il s'agit de zéro ou d'un. En tant que terme, je pense que le terme positif ou négatif ressemble plus à l'apprentissage automatique, je vais donc l'écrire de cette façon ci-dessous.

Une tâche courante consiste à diagnostiquer une maladie, qui consiste à déterminer si un patient est affecté (positif) ou non (négatif) à partir des résultats du test. Lorsque le sexe et l'âge du candidat et divers tests sont ajoutés au modèle de classification binaire, la fonction requise du modèle est de montrer la possibilité que la personne soit affectée en tant que score, mais il y a deux fonctions, positive ou négative. Pour juger par un, il est nécessaire de diviser le score par un seuil approprié. La «possibilité d'être affecté» n'a pas à être une valeur de probabilité car elle peut être classée dans l'ordre des scores et séparée par un seuil approprié.

Cependant, il y a des moments où vous souhaitez que la valeur de probabilité soit la même que la «probabilité d'être affecté». Par exemple, lorsqu'il y a le service A et le service B, il vaut mieux ne pas en faire appel à un seul utilisateur. Il s'agit également d'une application de la classification binaire, mais lorsqu'il s'agit d'attirer ceux qui ont une probabilité de participation élevée, les scores de classification binaire de A et B doivent être comparables. Cela signifie que l'échelle et le biais doivent être les mêmes.

Distribution des valeurs prédites

Apprendre avec LightGBM

J'ai fait un modèle en jetant les données de santander de kaggle dans LightGBM. Il s'agit d'un ensemble de données indiquant s'il faut ou non acheter des produits financiers, et le pourcentage positif est de 10%, ce qui est un déséquilibre modéré. La variable objective est 1 ou 0, mais pour faciliter l'écriture, 1 est écrit comme positif et 0 est écrit comme négatif.

Les paramètres ressemblent à ceci. Si is_unbalance est inclus pour des données déséquilibrées, la valeur prédite s'étalera modérément car elle est échantillonnée et apprise de sorte que le positif et le négatif sont divisés en deux.

Paramètres valeur
objective binary
num_leaves 15
is_unbalane True
num_boost_round 100

Score et pourcentage de cas

Résumons les scores pour chaque point de données par incréments de 0,01 et prenons le pourcentage d'exemples positifs. Ensuite, vous pouvez dessiner un diagramme de corrélation entre le score et le pourcentage d'observations régulières. À propos, rmse est l'erreur de la ligne diagonale.

pr_plot_min.png

Si cela chevauche les lignes diagonales de (0,0) et (1,1), la valeur attendue prédira directement le pourcentage de cas réguliers, ce qui me rend heureux dans diverses applications.

Distribution des scores

En regardant la distribution séparément pour le positif et le négatif, cela ressemble à ceci.

score_hist_train_min.png

Le pourcentage d'observations positives est de 0 dans la plage des valeurs prédites où les observations positives et négatives se chevauchent. Sera de 1. Dans la plage sans chevauchement, le rapport de cas positif est 0 s'il n'y a que des cas négatifs et le rapport de cas positif est 1 si la distribution est uniquement des cas positifs. C'est pourquoi il devient un diagramme de corrélation de type sigmoïde comme celui ci-dessus.

Distribution bêta

À propos, cette forme est similaire à la distribution bêta. Si la forme ressemble à une distribution bêta, la variable de probabilité est de 0 à 1, ce qui est identique à la distribution bêta. Trouvons donc alpha et bêta à partir de la moyenne et de la variance.

e = \frac{a}{a+b}
v = \frac{ab}{ (a+b)^2 (a+b+1)}

Si vous résolvez cela,

a = \frac{e^2 (1-e)}{v}-e
b = \frac{(1-e)}{e}a

Si vous dessinez un échantillon aléatoire de la distribution bêta avec les paramètres ci-dessus, cela ressemble à ceci.

beta_random_hist_min.png

La forme est un peu différente autour de 0,1 et 0,9, mais ça va.

Prédiction du taux positif

S'il y a alpha et bêta pour chacun des positifs et des négatifs, la densité de probabilité pour chacun des positifs et des négatifs peut être calculée à partir de n'importe quelle variable de probabilité de 0 à 1. En outre, s'il y a des nombres positifs et négatifs des données originales, le rapport du positif et du négatif dans n'importe quelle variable de probabilité peut être calculé.

Y = \frac{N_p\times Beta_p}{N_p\times Beta_p + N_n\times Beta_n}

Lorsque vous tracez la valeur prédite de la distribution par rapport à la valeur prédite d'origine de LightGBM, cela ressemble à ceci.

score_cal_score_plot_min.png

De plus, le diagramme de corrélation entre la valeur prédite de la distribution bêta et l'exemple de rapport positif mentionné précédemment ressemble à ceci.

cal_score_ratio_plot_min.png

Vous pouvez voir qu'il est assez proche de la diagonale.

Ainsi, avec l'approche en deux étapes de la distribution LightGBM et bêta, nous avons pu rapprocher la valeur prédite et le pourcentage de cas réguliers en diagonale.

Résumé

Épilogue

J'avais l'intention de publier un livre dans le livre technique 8 le 3/1, mais il a été annulé à cause du virus dans l'exemple.

Recommended Posts

Score LightGBM ajusté dans la distribution bêta
Écrire une distribution bêta en Python
Distribution logistique en Python
Générer une distribution U en Python