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.
Je viens d'une école littéraire privée, donc je ne suis pas bon en mathématiques. J'ai essayé de l'expliquer d'une manière facile à comprendre, même pour ceux qui ne sont pas bons en mathématiques autant que possible.
Un article similaire a été publié pour Linear Simple Regression Ver, veuillez donc le lire également. [Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et de mathématiques
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.)
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]
À 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.
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».
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.
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.
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.
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
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],
})
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()
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.
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.
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.
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} $.
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()
De cette façon, soyez conscient de ce que vous faites avec scicit-learn et à quoi il est connecté.
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.]
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.
Utilisez ce qui suit pour la logarithmique du produit.
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.
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.
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 | |
Deuxième personne | 60 | 50 | 1 | |
・ ・ ・ | ・ ・ ・ | ・ ・ ・ | ・ ・ ・ | ・ ・ ・ |
15e personne | 60 | 90 | 0 |
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 **.
Cette fonction sigmoïde ($ y = \ frac {1} {1 + e ^ {- (446.180x_1 + (-400.540) x_2 + 4.950)}}
** ◆ 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?
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é.
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/
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