[PYTHON] [Apprentissage automatique] Comprendre la régression logistique à partir de scikit-learn et des mathématiques

1. Objet

Si vous voulez essayer l'apprentissage automatique, n'importe qui peut utiliser scicit-learn, etc. pour l'implémenter relativement facilement. Cependant, afin d'obtenir des résultats au travail ou d'améliorer votre niveau Vous pouvez voir qu'il est clairement faible dans l'explication de «Je ne connais pas le contexte, mais j'ai obtenu ce résultat».

Le but de cet article est "d'essayer d'utiliser d'abord scicit-learn car la théorie est bonne" en 2-3 et de "comprendre le contexte des mathématiques" en 4 et plus tard.

2. Qu'est-ce que la régression logistique?

La régression logistique est un type de modèle de régression statistique pour les variables qui suivent la distribution de Bernoulli. Source: [Wikipedia](https://ja.wikipedia.org/wiki/Logistic Return)

Je ne sais pas ce que c'est, donc pour le dire simplement, il est utilisé pour ** "prédire la probabilité qu'un certain événement se produise" ou "classer en fonction de cette probabilité" **. Par conséquent, la régression logistique est utilisée lorsque vous souhaitez classer à l'aide de l'apprentissage automatique ou lorsque vous souhaitez prédire la probabilité.

(J'ai été très surpris de pouvoir "prédire les probabilités" tout en étudiant l'apprentissage automatique.)

◆ À propos de la fonction sigmoïde (fonction logistique)

Alors, comment cette régression logistique effectue-t-elle la classification et la prédiction de probabilité? Je vais omettre l'explication détaillée car je vais aller au chapitre sur les mathématiques, mais "prédire la probabilité qu'un certain événement se produise" signifie que lorsque vous entrez les informations nécessaires dans la "fonction sigmoïde" ci-dessous, cet événement (appelons-le A) Cela signifie que la probabilité d'occurrence est calculée. Et si la probabilité est de 50% ou plus, elle est classée comme A, et si la probabilité est inférieure à 50%, elle est classée comme non A.

[Fonction Sigmaid] キャプチャ6.PNG

À propos, la fonction sigmoïde est définie comme suit.

y = \frac{1}{1 + e^{-(a_1x_1 + a_2x_2 + ... + b)}}

À la suite de ce calcul, le $ y $ qui sort représente la probabilité que l'événement se produise, et la régression logistique calcule cette probabilité.

Par exemple, si le point rouge est attaché à la fonction sigmoïde ci-dessus, la probabilité d'occurrence est estimée à 40%, et comme elle est inférieure à 50%, l'événement A est classé comme ne se produisant pas.

◆ Qu'est-ce que la classification?

Bien qu'il s'agisse de la «classification» décrite ci-dessus, l'apprentissage automatique effectue principalement un «retour (prédiction de valeurs numériques)» ou une «classification». Comme son nom l'indique, la classification est utilisée lorsque vous souhaitez classer «A ou B».

◆ Exemple spécifique

Supposons que vous ayez le score moyen global en langue nationale et en mathématiques de 15 élèves du premier cycle du secondaire au lycée, et des données indiquant si l'élève va aux arts libéraux ou aux sciences par la suite. キャプチャ1.PNG

Sur la base de ces données, j'aimerais utiliser les données de la langue nationale et des mathématiques d'un autre élève pour prédire s'il poursuivra ses études en arts libéraux ou en sciences à l'avenir.

La répartition du score moyen global en langue nationale et en mathématiques de 15 élèves est la suivante. キャプチャ2.PNG

D'une manière ou d'une autre, il semble y avoir une frontière entre les points bleus (littérature) et les points orange (science).

Ensuite, effectuons une analyse de régression logistique à l'aide de scicit-learn et créons un modèle qui classe par littérature et science.

3. Retour logistique avec scicit-learn

(1) Importation des bibliothèques requises

Importez les éléments suivants nécessaires pour effectuer une régression logistique.

from sklearn.linear_model import SGDClassifier
from sklearn.metrics import log_loss, accuracy_score, confusion_matrix

(2) Préparation des données

Définissez les scores en langue nationale et en mathématiques et la science littéraire (vrai pour le système littéraire, faux pour le système scientifique) comme données comme indiqué ci-dessous.

data = pd.DataFrame({
        "bunri":[False,True,False,True,True,False,True,False,True,False,False,True,False,False,False],
        "Japanese_score":[45, 60, 52, 70, 85, 31, 90, 55, 75, 30, 42, 65, 38, 55, 60],
        "Math_score":[75, 50, 80, 35, 40, 65, 42, 90, 35, 90, 80, 35, 88, 80, 90],
    })

(3) Essayez d'illustrer (important)

Illustrons les scores et l'alphabétisation du japonais et des mathématiques. Afin de saisir les caractéristiques, n'utilisez pas scicit-learn soudainement, mais essayez d'illustrer les données.

y = data["bunri"].values
x1, x2 = data["Japanese_score"].values, data["Math_score"].values 
#Tracer les données
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.plot(x1[y], x2[y], 'o', color='C0', label='bunkei')#Point bleu: y est vrai(=(Littérature)
plt.plot(x1[~y], x2[~y], '^', color='C1', label='rikei')#Point orange: y est faux(=(Science)
plt.xlabel("Japanese_score")
plt.ylabel("Math_score")
plt.legend(loc='best')
plt.show()
キャプチャ3.PNG

Il semble que vous puissiez clairement distinguer le bleu (littérature) et l'orange (science). (Dans le monde réel, il est peu probable que ce soit si clairement divisé.) Construisons un modèle de régression logistique.

(4) Construction du modèle

(I) Mise en forme des données

Tout d'abord, nous allons organiser la forme des données pour construire le modèle.

y = data["bunri"].values#C'est le même que celui illustré ci-dessus, vous pouvez donc l'omettre.
X = data[["Japanese_score", "Math_score"]].values

Cette fois, ce n'est pas un article sur la grammaire python, je vais donc omettre les détails, mais je vais organiser x et y sous une forme de régression logistique avec scikit-learn.

(Ii) Construction du modèle

Enfin, le code du bâtiment modèle.

clf = SGDClassifier(loss='log', penalty='none', max_iter=10000, fit_intercept=True, random_state=1234, tol=1e-3)
clf.fit(X, y)

Voilà pour un modèle simple. Nous allons créer un modèle de régression logistique pour une variable appelée clf! L'image est que le clf est ajusté (= appris) avec les X et y préparés dans la ligne suivante.

(Iii) Essayez de mettre les paramètres

Soudain, le mot paramètre est sorti, mais c'est $ y = \ frac {1} {1 + e ^ {- (a_1x_1 + a_2x_2 + ... + b)}} $ décrit dans la fonction sigmoïde au début. Désigne $ a $ et $ b $. Dans cet exemple, il y a deux variables explicatives, le score de langue nationale et le score mathématique, il peut donc être défini comme $ y = \ frac {1} {1 + e ^ {- (a_1x_1 + a_2x_2 + b)}} $, et $ a $ Et $ b $ peuvent être calculés avec scicit-learn comme indiqué ci-dessous.

#Obtenir et afficher des poids
b = clf.intercept_[0]
a1 = clf.coef_[0, 0]
a2 = clf.coef_[0, 1]

Alors b = 4,950, a1 = 446,180, a2 = -400,540 seront affichés, donc $ y = \ frac {1} {1 + e ^ {- (446,180x_1 + (-400,540) x_2 + 4,950)} Vous pouvez voir qu'il s'agit d'une fonction sigmoïde appelée} $.

(5) Illustrer le modèle construit

Maintenant, illustrons cette limite dans le diagramme de dispersion ci-dessus.

y = data["bunri"].values
x1, x2 = data["Japanese_score"].values, data["Math_score"].values 
#Tracer les données
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.plot(x1[y], x2[y], 'o', color='C0', label='bunkei')#Point bleu: y est vrai(=(Littérature)
plt.plot(x1[~y], x2[~y], '^', color='C1', label='rikei')#Point orange: y est faux(=(Science)
plt.xlabel("Japanese_score")
plt.ylabel("Math_score")
plt.legend(loc='best')

#Tracer et afficher les bordures
#Violet: limite
line_x = np.arange(np.min(x1) - 1, np.max(x1) + 1)
line_y = - line_x * w1 / w2 - w0 / w2
plt.plot(line_x, line_y, linestyle='-.', linewidth=3, color='purple', label='kyoukai')
plt.ylim([np.min(x2) - 1, np.max(x2) + 1])
plt.legend(loc='best')
plt.show()
キャプチャ4.PNG

De cette façon, soyez conscient de ce que vous faites avec scicit-learn et à quoi il est connecté.

(6) Dans le monde réel ...

Cela n'a pas de sens de finir de faire un modèle. Dans le monde réel, il est nécessaire d'utiliser ce modèle de prédiction pour prédire l'alphabétisation d'un autre élève. Vous avez obtenu des informations pour 5 autres personnes et avez noté les données. Stockez-le dans une variable appelée z comme indiqué ci-dessous.

z = pd.DataFrame({
        "Japanese_score":[80, 50, 65, 40, 75],
        "Math_score":[50, 70, 55, 50, 40],
    })
z2 = z[["Japanese_score", "Math_score"]].values

Ce que je veux faire, c'est appliquer les données d'un autre élève mentionné ci-dessus au modèle de régression logistique obtenu par scicit-learn plus tôt, et prédire l'alphabétisation.

y_est = clf.predict(z2)

De cette façon, y_est affichera le résultat comme "([True, False, True, False, True])". En d'autres termes, la première personne a 80 points en japonais et 50 points en mathématiques, il est donc prédit qu'il s'agit d'un système littéraire.

Votre objectif sera atteint en prédisant l'alphabétisation à partir de vos scores en langue nationale et en mathématiques.

Aussi, montrons la "probabilité d'être un système littéraire" mentionnée au début.

clf.predict_proba(z2)

Si vous écrivez de cette manière, la probabilité d'être un système littéraire et la probabilité d'être un système non littéral seront affichées dans deux colonnes. Cependant, j'ai rendu cet exemple si facile à comprendre que le résultat est affiché comme ci-dessous et que la probabilité est clairement divisée en 0% ou 100%.

[0., 1.], [1., 0.], [0., 1.], [1., 0.], [0., 1.]

4. Comprendre la régression logistique à partir des mathématiques

En passant, jusqu'à 3, j'ai essayé de mettre en œuvre le flux de construction d'un modèle de régression logistique en utilisant scicit-learn → illustration → prédisant l'alphabétisation de 5 autres élèves. Ici, je voudrais clarifier comment le modèle de régression logistique de ce flux est calculé mathématiquement.

(1) Connaissances préalables

Utilisez ce qui suit pour la logarithmique du produit. log_aMN = log_aM + log_aN

(2) Quelle est la fonction sigmoïde?

Comme mentionné dans "◆ À propos de la fonction sigmoïde (fonction sigmoïde)" en 2., la fonction sigmoïde est une fonction permettant d'exprimer un certain événement avec probabilité, et a la forme suivante.

キャプチャ5.PNG

De plus, cette fonction bleue est définie comme suit.

y = \frac{1}{1 + e^{-(a_1x_1 + a_2x_2 + ... + b)}}

Les $ a_1 $, $ a_2 $ et $ b $ ci-dessus sont des soi-disant paramètres, et leurs positions sont les mêmes que $ a $ et $ b $ de la fonction linéaire $ y = ax + b $. Et $ x_1 $ et $ x_2 $ sont des variables dites explicatives. Dans ce cas, le score de la langue nationale est de $ x_1 $ et le score mathématique est de $ x_2 $.

Si vous choisissez ces $ a_1 $, $ a_2 $ et $ b $ comme de ** bons nombres **, alors les scores nationaux en langue et en mathématiques de l'élève nouvellement acquis seront $ x_1 $ et $ x_2 $. Si vous y entrez, la probabilité de devenir un système littéraire (ou la probabilité de devenir un système scientifique) peut être calculée comme étant $ y $.

En d'autres termes, ** Dans la régression logistique d'apprentissage automatique, ces paramètres $ a $ et $ b $ sont calculés pour calculer la fonction sigmoïde **.

Je pense qu'il est difficile de comprendre l'image s'il ne s'agit que de phrases, alors calculons en appliquant des valeurs numériques spécifiques à partir de la suivante.

(3) Compréhension mathématique

(I) Appliquer les fonctions sigmoïdes aux données une par une

L'ensemble de "données" dans "Préparation des données" est organisé dans un format tabulaire, et ce qui se passe si la fonction sigmoïde est utilisée à l'extrême droite est résumé. Cette fois, je vais trouver la "probabilité d'être un système littéraire", alors réglez le système littéraire sur 1 et le système scientifique sur 0 (à l'inverse, si vous voulez trouver la probabilité d'être un système scientifique, réglez le système scientifique sur 1 et le système littéraire sur 0).

étudiant Score de langue nationale Score mathématique Littérature(0: Science 1:Système littéraire) Fonction Sigmaid
1ère personne 45 75 0 \frac{1}{1 + e^{-(45a_1 + 75a_2 + b)}}
Deuxième personne 60 50 1 \frac{1}{1 + e^{-(60a_1 + 50a_2 + b)}}
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
15e personne 60 90 0 \frac{1}{1 + e^{-(60a_1 + 90a_2 + b)}}

(Ii) Trouvez l'estimation la plus probable

Maintenant, comment trouvez-vous les paramètres $ a $ ($ a_1 $ et $ a_2 $ dans cet exemple) et $ b $? L'essentiel est que vous pouvez ** multiplier la probabilité d'être une personne littéraire du 1er au 15 et trouver $ a_1 $, $ a_2 $ et $ b $ qui maximisent le produit **.

C'est ce qu'on appelle l'estimation la plus probable.

◆ Quelle est l'estimation la plus probable? Il est lu comme «saiyuusui teryo» et signifie «estimation la plus probable». → C'est compliqué, mais vous pouvez l'interpréter comme "le meilleur nombre".

◆ Multiplions Multiplier la probabilité d'être une personne littéraire de la 1ère personne à la 15ème personne donne ce qui suit (appelons-le L).

L = [1 - \frac{1}{1 + e^{-(45a_1 + 75a_2 + b)}}] × [\frac{1}{1 + e^{-(60a_1 + 50a_2 + b)}}]× ・ ・\\
× [1 - \frac{1}{1 + e^{-(60a_1 + 90a_2 + b)}}]

◆ Conversion en valeur logarithmique pour trouver la valeur maximale de L Vous pouvez obtenir une image, mais L est multiplié par 15 personnes. C'est très difficile à calculer lorsque les données concernent des millions de personnes, je vais donc les corriger en logarithmique.

logL = log[1 - \frac{1}{1 + e^{-(45a_1 + 75a_2 + b)}}] + log[\frac{1}{1 + e^{-(60a_1 + 50a_2 + b)}}] +・ ・\\
log[1 - \frac{1}{1 + e^{-(60a_1 + 90a_2 + b)}}]

◆ Rechercher des paramètres Comment trouver les paramètres $ a_1 $, $ a_2 $ et $ b $ qui maximisent $ logL $ ne peuvent pas être calculés analytiquement (= calculés manuellement). scikit-learn utilise la ** "méthode du gradient probabiliste" ** pour calculer les paramètres optimaux.

Donc, tout en comprenant que la théorie derrière cela fait ce genre de chose, ce n'est pas grave si vous utilisez celle fournie par scicit-learn pour le calcul réel.

Dans "(iii) Essayez de générer des paramètres", $ b $ = 4,950, $ a_1 $ = 446,180, $ a_2 $ = -400,540, alors ** je voulais trouver $ y = \ frac {1 } {1 + e ^ {- (446.180x_1 + (-400.540) x_2 + 4.950)}} $ est une fonction sigmoïde **.

(Iii) Résumé ici

Cette fonction sigmoïde ($ y = \ frac {1} {1 + e ^ {- (446.180x_1 + (-400.540) x_2 + 4.950)}} ) et le score de langue nationale de l'étudiant nouvellement acquis ( x_1 ) Si vous entrez un score mathématique ( x_2 $), la probabilité du système littéraire sera calculée, et si la probabilité est supérieure à 0,5, elle sera classée comme système littéraire, et si elle est inférieure à 0,5, elle sera classée comme système scientifique.

(Iv) Léger développement

** ◆ Pourquoi pouvons-nous obtenir un "bon" paramètre en trouvant la valeur maximale de L? ** J'ai émis les paramètres $ a $ et $ b $ qui maximisent $ L $ et $ logL $, mais pourquoi puis-je obtenir les paramètres optimaux si $ L $ et $ logL $ sont maximisés? ..

Voir ci-dessous pour obtenir une image. Vous n'avez que trois données à portée de main, et à partir de ces trois données, "essayez de faire à peu près un graphique bleu de l'ensemble de la distribution normale". Lequel des deux graphiques bleus ci-dessous est le plus susceptible d'avoir une distribution normale plus générale?

キャプチャ7.PNG

De toute évidence, le graphique de gauche est plus probable. En effet, la distribution sur la droite est la montagne avec la fréquence d'occurrence la plus élevée et il n'y a pas de données à portée de main. Il s'agit d'une compréhension intuitive, mais mathématiquement, le graphique de gauche est plus certain.

Voici la distribution normale ci-dessus avec les probabilités ajoutées. Bien que ce soit une mesure, j'ai écrit la probabilité que si le point rouge à portée de main est sur cette distribution normale, il se produira avec cette probabilité.

キャプチャ8.PNG

En multipliant les probabilités de la distribution de gauche (qui a la même signification que $ L $), on obtient 0,14 x 0,28 x 0,38 = 0,014896. De même sur le côté droit 0,01 x 0,03 x 0,09 = 0,000027.

De cette façon, plus la valeur de la multiplication des probabilités est élevée, plus le graphe qui représente correctement la distribution d'origine est proche.

Par conséquent, il est nécessaire de trouver les paramètres $ a_1 $, $ a_2 $ et $ b $ pour que les valeurs de $ L $, qui est le produit des probabilités du système humain, et de $ logL $, qui est son logarithme, soient aussi grandes que possible.

** ◆ Différence entre la fonction sigmoïde et la fonction logistique ** Il est normal de comprendre que la forme spéciale de la fonction logistique est une fonction sigmoïde.

Fonction logistique: $ {N = {\ frac {K} {1+ \ exp {K (t_ {0} -t)}}}} N = {\ frac {K} {1 + \ exp {K (t_ { 0} -t)}}} $ La fonction sigmoïde fait référence à la fonction lorsque $ K = 1 $ et $ t_0 = 0 $ ci-dessus.

URL de référence: Wikipedia https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%A2%E3%82%A4%E3%83%89%E9%96%A2%E6%95%B0

** ◆ Matrice de confusion ** Je ne l'ai pas utilisé cette fois parce que j'ai donné un exemple très facile à comprendre, mais en général, j'utilise un index appelé matrice de confusion comme méthode de vérification de l'exactitude. Nous listerons l'URL de référence, donc si vous êtes intéressé, veuillez l'essayer.
URL de référence
https://note.nkmk.me/python-sklearn-confusion-matrix-score/

5. Résumé

Qu'as-tu pensé. La régression logistique est une partie que je trouve très difficile à comprendre, donc cela peut être difficile à comprendre une fois que je l'ai lu. Nous espérons que sa lecture à plusieurs reprises vous aidera à faire évoluer votre compréhension.

Recommended Posts

[Apprentissage automatique] Comprendre la régression logistique à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la SVM à la fois à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre les arbres de décision de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la décorrélation des mathématiques
Régression logistique d'apprentissage automatique
Algorithme d'apprentissage automatique (régression logistique)
Classification et régression dans l'apprentissage automatique
<Subject> Machine learning Chapitre 3: Modèle de régression logistique
Comprendre la régression logistique (1) _ À propos des cotes et de la transformation logistique
Vue d'ensemble des techniques d'apprentissage automatique apprises grâce à scikit-learn
Régression linéaire d'apprentissage automatique
Défis d'apprentissage automatique de Coursera en Python: ex2 (retour logistique)
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
L'apprentissage automatique pratique avec Scikit-Learn et TensorFlow-TensorFlow a abandonné -
Machine Learning: Supervision - Régression linéaire
[Apprentissage automatique] Comprendre la forêt aléatoire
Comprendre l'apprentissage automatique ~ régression de crête ~.
Apprentissage automatique et optimisation mathématique
Machine learning supervisé (classification / régression)
Modèle d'empilage d'apprentissage automatique (retour)
[Apprentissage automatique] Comprenez à partir des mathématiques que la normalisation se traduit par une moyenne de 0 et un écart type de 1.
[Apprentissage automatique] Comprenez à partir des mathématiques pourquoi le coefficient de corrélation varie de -1 à 1.
[Note de lecture] Apprentissage automatique pratique avec Scikit-Learn, Keras et TensorFlow Chapitre 1
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Les débutants en apprentissage automatique essaient la régression linéaire
Algorithme d'apprentissage automatique (analyse de régression multiple)
Algorithme d'apprentissage automatique (analyse de régression unique)
SVM essayant l'apprentissage automatique avec scikit-learn
Organisez des plateformes d'apprentissage automatique et d'apprentissage en profondeur
Premier TensorFlow (édition révisée) - Régression linéaire et logistique
[Apprentissage automatique] OOB (Out-Of-Bag) et son ratio
Algorithme d'apprentissage automatique (généralisation de la régression linéaire)
scikit-learn Comment utiliser le résumé (apprentissage automatique)
Prévision du cours des actions à l'aide de l'apprentissage automatique (scikit-learn)
[Apprentissage automatique] Classification des sujets LDA à l'aide de scikit-learn
Utiliser le groupe d'API d'apprentissage automatique A3RT de Python
Apprentissage automatique avec python (2) Analyse de régression simple
Notes personnelles et liens sur l'apprentissage automatique ① (Machine learning)
<Cours> Machine learning Chapitre 1: Modèle de régression linéaire
Modèle de régression utilisant scikit-learn et sa visualisation
Résumé de la classification et de la mise en œuvre des algorithmes d'apprentissage automatique
<Cours> Machine learning Chapitre 2: Modèle de régression non linéaire
Prévision du cours des actions à l'aide de l'apprentissage automatique (édition de retour)
"Tutoriels OpenCV-Python" et "Système d'apprentissage automatique pratique"
Algorithme d'apprentissage automatique (résumé de régression linéaire et régularisation)
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
Défis d'apprentissage automatique de Coursera en Python: ex3 (reconnaissance de nombres manuscrits avec récursivité logistique)