[PYTHON] [Apprentissage automatique] Comprendre la régression linéaire simple à 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 que l'explication "Je ne connais pas le contexte, mais j'ai obtenu ce résultat" est évidemment faible **.

Dans cet article, ** 2 à 3 visent «J'aime la théorie, je vais donc essayer d'utiliser scikit-learn en premier», et 4 et suivants visent «Comprendre le contexte des mathématiques» **.


2/5 postscript


3/1 postscript
・ 3. Régression linéaire avec scikit-learn → (4) Construction du modèle → (iv) Un supplément a été ajouté.

2. Qu'est-ce que la régression linéaire (simple)?

(1) Qu'est-ce que la régression?

** Prédire les nombres. ** En apprentissage automatique, il existe d'autres "classifications", mais si vous souhaitez prédire des valeurs numériques telles que "●● cercle" et "△ Kg", vous pouvez envisager d'utiliser la régression.

(2) Qu'est-ce que la régression linéaire?

Il peut y avoir des malentendus, "Ce que vous voulez ($ = y )" et "Ce que vous pensez affectera ce que vous voulez Lorsque ( = x $) "a une relation linéaire, la méthode de recherche de $ y $ à l'aide de la fonction linéaire est appelée régression linéaire.

Je pense que c'est difficile à comprendre, alors je vais vous donner un exemple concret.
Exemple spécifique
Vous êtes un glacier indépendant, et vous souhaitez fortement pouvoir prévoir les ventes de glaces de votre magasin ** afin de stabiliser vos perspectives de vente. Je vais. キャプチャ8.PNG

Vous vous demandez désespérément ce qui affecte les ventes de crème glacée de votre magasin et vous vous rendez compte que plus la température est chaude, plus la crème glacée se vend, et plus la température est froide, moins la crème glacée se vend. J'ai fait. Donc, si vous essayez d'illustrer «température ($ = x )» et «ventes de crème glacée ( = y $)» comme indiqué ci-dessous, il est vrai que les ventes de crème glacée augmenteront si la température augmente, et là Vous pouvez voir que la forme d'une ligne droite (= $ ax + b $) est susceptible d'être dessinée (= linéaire).

キャプチャ.PNG

Ensuite, utilisons scikit-learn pour créer un modèle d'apprentissage automatique qui recherche les ventes de crème glacée à partir de la température.

3. Régression linéaire avec scicit-learn

(1) Importation des bibliothèques requises

Importez les éléments suivants requis pour effectuer une régression linéaire.

from sklearn.linear_model import LinearRegression

(2) Préparation des données

Réglez la température et les ventes de crème glacée comme données comme indiqué ci-dessous.

data = pd.DataFrame({
    "temprature(=x)":[8,10,6,15,12,16,20,13,24,26,12,18,19,16,20,23,26,28],
    "sales(=y)":[30,35,28,38,35,40,60,34,63,65,38,40,41,43,42,55,65,69]
    })

(3) Essayez d'illustrer (important)

Illustrons la température et les ventes de glaces. Même si vous utilisez la régression linéaire si elle n'est pas dans une relation linéaire, la précision sera très mauvaise car les données d'origine ne sont pas linéaires. Au lieu d'utiliser scicit-learn en même temps, essayez d'illustrer les données.

plt.scatter(data["temprature(=x)"],data["sales(=y)"])
plt.xlabel("temprature(°)")
plt.ylabel("sales")
plt.grid(which='major',color='black',linestyle=':')
キャプチャ2.PNG

En gros, il semble y avoir une relation linéaire entre la température ($ = x ) et les ventes ( = y $), alors construisons un modèle de régression linéaire.

(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.

x = data["temprature(=x)"].values
y = data["sales(=y)"].values
X = x.reshape(-1,1)

Comme il ne s'agit pas d'un article sur la grammaire python, je vais omettre les détails, mais je vais organiser x et y sous une forme de régression linéaire avec scikit-learn.

(Ii) Construction du modèle

C'est finalement le code du bâtiment modèle.

regr = LinearRegression(fit_intercept = True)
regr.fit(X,y)

C'est peut-être désaccordé, mais si c'est un modèle simple, c'est tout. Nous allons créer un modèle de régression linéaire pour une variable appelée regr! C'est une image de faire quelque chose comme une déclaration et de laisser le regr ajuster (= apprendre) les X et y préparés dans la ligne suivante.

(Iii) Essayez d'obtenir la pente et la section de la ligne droite

Comme décrit dans "2. Qu'est-ce que la régression linéaire (simple)?" Je cherche la formule de la ligne droite à faire dans les coulisses. Si vous le laissez tel quel, vous ne le réaliserez pas, alors coupons réellement la pente.

a = regr.coef_ #Trouvez l'inclinaison
b = regr.intercept_ #Trouvez la section
print(a)
print(b)

Vous devriez voir a comme [1.92602996] et b comme [12.226591760299613]. En d'autres termes, la ligne droite est $ y (= ventes) = 1,92602996 * x (= température) + 12,226591760299613 $ et scikit-learn l'a demandé.

(Iv) Supplément

Si vous voulez juste construire un modèle, (iii) suffit, mais il y a d'autres choses comme suit. Référence: https://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0

◆ Afficher les paramètres utilisés dans la construction du modèle Cette fois, je viens de définir fit_intercept sur True, mais il existe d'autres paramètres qui peuvent être définis et vous pouvez voir comment ils sont définis maintenant.

regr.get_params()

Ensuite, {'copy_X': True, 'fit_intercept': True, 'n_jobs': None, 'normalize': False} sera affiché.

-Copy_X: sélectionnez s'il faut exécuter après avoir dupliqué les données dans la mémoire. (Valeur par défaut: True) -Fit_intercept: lorsqu'il est défini sur False, il n'inclut pas le calcul de la section ($ b $ dans ce cas), il est donc utilisé lors du traitement de données dans lesquelles la variable objectif passe toujours par l'origine. (Valeur par défaut: True) -N_jbobs: Le nombre de travaux utilisés pour le calcul. S'il est défini sur -1, il sera calculé en utilisant tous les processeurs. (Valeur par défaut: 1) -Normalize: lorsqu'il est défini sur True, les variables explicatives sont prénormalisées. (Valeur par défaut: False)

◆ Afficher le coefficient de décision Le facteur de décision est une mesure de l'adéquation du modèle aux données réelles, entre 0 et 1.

regr.score(X,y)

◆ Évaluation de l'erreur Étant donné que la quantité de description sera importante, je ne la décrirai pas à nouveau, mais ce qui suit sera utile. https://pythondatascience.plavox.info/scikit-learn/%E5%9B%9E%E5%B8%B0%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A9%95%E4%BE%A1

(5) Illustrer le modèle construit

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

#Formule en ligne droite
y_est_sklearn = regr.intercept_ + regr.coef_[0] * x
#Diagramme de température et de vente d'origine
plt.scatter(x, y, marker='o')
#Température originale et formule de prédiction en ligne droite
plt.plot(x, y_est_sklearn, linestyle=':', color='green')
#Paramètres détaillés dans la figure
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.xlabel("temprature(°)")
plt.ylabel("sales")
キャプチャ3.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évision linéaire pour prévoir les ventes futures. Vous avez regardé les prévisions météorologiques pour les quatre prochains jours et noté la température. Stockez-le dans une variable appelée z comme indiqué ci-dessous.

z = pd.DataFrame([10,25,24,22])

Ce que je veux faire, c'est appliquer la prévision de température future ci-dessus à la formule linéaire obtenue par scicit-learn plus tôt et prédire les ventes.

regr.predict(z)

Si vous faites cela, vous verrez le résultat comme "([31.48689139, 60.37734082, 58.45131086, 54.59925094])". En d'autres termes, demain la température est de 10 °, donc les ventes seront d'environ 315 000 yens, et après-demain, la température sera de 25 °, donc les ventes seront d'environ 603 000 yens. Si vous pouvez obtenir une prévision de la température pour le mois prochain, vous aurez une idée approximative des ventes et votre objectif sera atteint.

Il y a beaucoup d'autres détails, mais je pense qu'il est bon d'essayer d'abord d'implémenter la régression linéaire orthodoxe.

4. Comprendre la régression linéaire (simple) à partir des mathématiques

En passant, jusqu'à 3, j'ai essayé d'implémenter le flux de calcul de $ a $ et $ b $ de $ y = ax + b $ en utilisant scikit-learn → illustration → prévision des ventes à partir de la température pour les 4 prochains jours .. Ici, je voudrais clarifier ** comment le "calculer $ a $ et $ b $ de $ y = ax + b $" dans ce flux est ** calculé mathématiquement. Je vais.

(1) Connaissances préalables

a. Différenciation de base


y = x^Quand 2 est différencié par x, y'=2x\\
y = x^2 +Quand 4 est différencié par x, y'=2x\\
y = (-3x + 2)^Quand 2 est différencié par x, y' = 2(-3x +2)(-3) 

b. Signification de Σ (Sigma) Signifie somme

(2) Compréhension mathématique

(I) Ce que vous faites pour obtenir a et b de y = ax + b

Je republierai le tableau que j'ai mentionné plus tôt. Comme indiqué ci-dessous, je veux tracer une «ligne droite de bonne sensation» pour prédire la température et les ventes, c'est-à-dire que je veux déterminer la pente et la section a et b. キャプチャ.PNG

Comment décidez-vous a et b pour cela? Regardez maintenant les deux lignes droites ci-dessous. Quelle est la ligne droite, verte ou orange, qui est la plus susceptible de prédire la relation entre la température et les ventes? キャプチャ4.PNG

De toute évidence, vous pouvez voir que l'orange (a = 1,92, b = 12,2) est plus susceptible de représenter la relation entre la température réelle et les ventes que le vert (a = 2,0, b = 30,0). Je pense qu'on peut dire que ** la ligne droite orange est "parce que la distance entre la ligne droite et le point bleu réel est plus proche" **.

En d'autres termes, scikit-learn veut que a et b soient une «bonne ligne droite» où la distance entre la ligne droite et le point bleu est la plus courte.

Cette méthode de recherche de a et b telle que "la distance entre la ligne droite et le point bleu est la plus proche" est appelée "méthode du carré minimum".

(Ii) Méthode du carré minimum

Mâchons un peu plus. La "distance entre la ligne droite et le point bleu" décrite en (i) peut s'écrire comme suit.

キャプチャ5.PNG

Coordonnées réelles (point rouge dans la figure ci-dessus): $ (x_1, y_1) $ Coordonnées prévues avec $ y = ax + b $: exprimées en $ (x_1, ax_1 + b) $.

L'erreur entre ces deux coordonnées y (= la différence entre la prévision et les ventes réelles) peut être exprimée comme $ {y_1- (ax_1 + b)} $.

Ce $ {y_1- (ax_1 + b)} $ est juste la différence entre les prévisions et les ventes réelles d'un point rouge, alors additionnez-les pour tous les points et définissez a et b de sorte que cette erreur soit aussi petite que possible. Find (= trouver a et b à partir du calcul afin que la différence entre la prédiction et le réel soit aussi petite que possible).

De plus, si la différence est prise purement, le plus et le moins seront annulés, donc en général, la valeur obtenue en quadrillant l'erreur est calculée de manière à être la plus petite possible. Cette idée s'appelle la méthode du carré minimum.

(Iii) Essayez de résoudre la méthode des moindres carrés

◆ Réglage de la fonction d'erreur

En supposant que la somme des erreurs des valeurs prédites calculées à partir de tous les points réels et des lignes droites est "E", E peut être exprimé comme suit.

E = \sum_{i=1}^n [{y_i - (ax_i + b)}]^{2}

C'est la somme des carrés de la différence entre la valeur réelle $ y_i $ et la valeur prédite $ (ax_i + b) $ du premier point au nième (pratiquement tout).

◆ Pour minimiser la fonction d'erreur

Pour considérer le minimum de $ E $, représentons la forme de la fonction de $ E $.

En général, $ E $ est représenté comme ci-dessus, et vous pouvez voir que $ E $ est minimisé autour du point rouge. Alors, quel est ce point rouge? ** "Différenciation de $ E $ par $ a $ sera 0, et la différenciation de $ E $ par $ b $ sera 0" ** est. Différenciation signifie "inclinaison", donc le point où l'inclinaison devient 0 lorsqu'elle est vue du côté de l'axe de $ a $ et l'inclinaison devient 0 lorsqu'elle est vue du côté de l'axe de $ b $ est le point rouge. ..

◆ Calculons en fait

Si possible, apportez un morceau de papier et un stylo et essayez de bouger vos mains. [Différenciez-vous avec $ a $] $ ∂ $ utilisé ci-dessous est lu comme "del" dans le sens de différenciation (il y a plusieurs façons de le lire).

↓ Ce qui suit est un complément à la formule ① ↓ キャプチャ7.PNG


\begin{align}
\frac{∂E}{∂a} &= \frac{∂}{∂a} \sum_{i=1}^n (y_i - ax_i - b)^{2}・ ・ ①\\
&= \sum_{i=1}^n 2*(y_i - ax_i - b)*(-x_i)・ ・ ②\\
&= \sum_{i=1}^n -2x_i(y_i - ax_i -b)・ ・ ③\\
&= \sum_{i=1}^n -2x_iy_i + \sum_{i=1}^n 2ax_i^2 + \sum_{i=1}^n 2x_ib ... ④\\
\end{align}

・ Lorsque ① est différencié, il devient ② (=, donc $ ∂ $, qui signifie différencier, disparaît dans ②) ・ ③ est juste une légère transformation de ②, et ④ est décomposé par $ Σ $ pour chaque caractère de ③. Je recherche un point qui se différencie avec $ a $ et devient 0, résolvons-le donc avec ④ = 0.


\begin{align}
- \sum_{i=1}^n x_iy_i + a\sum_{i=1}^nx_i^2 + b \sum_{i=1}^n x_i =0 ・ ・ ⑤\\
- \bar{xy} + a\bar{x^2} + b \bar{x} =0 ・ ・ ⑥\\
\end{align}

Puisque ⑤ est ④ = 0, c'est la formule obtenue en divisant le coefficient 2 attaché à la formule ④ par les deux côtés. ⑥ est la formule de ⑤ divisée par n des deux côtés. Dans ⑤, pour chaque $ Σ $, les données sont ajoutées du premier au n, donc si vous divisez par n, la moyenne sortira. Pour être plus précis, le premier $ Σ $ ($ - \ sum_ {i = 1} ^ n x_iy_i $) est la somme de $ xy $ du premier au nième. En d'autres termes, si vous divisez ceci par $ n $, ce sera la moyenne du tout, donc cela peut être exprimé comme $ - \ bar {xy} $.

[Différenciez-vous avec $ b $] De même, $ b $ sera différencié.


\begin{align}
\frac{∂E}{∂b} &= \frac{∂}{∂b} \sum_{i=1}^n (y_i - ax_i - b)^{2}· · [1]\\
&= \sum_{i=1}^n 2*(y_i - ax_i - b)*(-1)・ ・ [2]\\
&= \sum_{i=1}^n -2(y_i - ax_i -b)・ ・ [3]\\
&= \sum_{i=1}^n-2y_i + \sum_{i=1}^n 2ax_i + \sum_{i=1}^n 2b ... [4]\\
\end{align}

Ce que vous faites dans [1] à [4] est fondamentalement le même que ① à ④, qui sont différenciés par $ a $, et correspondent. De même, résolvons [5] et [6] avec ⑤ et ⑥.


\begin{align}
- \sum_{i=1}^ny_i + a\sum_{i=1}^nx_i + b =0 ... [5]\\
- \bar{y} + a\bar{x} + b =0 ... [6]\\
\end{align}

[Résolution d'équations simultanées] ⑥ et [6] sont réimprimés avec quelques modifications.


a\bar{x^2} + b \bar{x} = \bar{xy}・ ・ ⑥'\\
a\bar{x} + b = \bar{y}・ ・ 【6'】

Pour résoudre ces deux équations simultanées (pour éliminer = $ b $), multipliez [6 '] par $ \ bar {x} $.


a\bar{x^2} + b \bar{x} = \bar{xy}・ ・ ⑥'\\
a\bar{x}^2 + b\bar{x} = \bar{x}\bar{y}・ ・ 【6''】

Voici deux choses à garder à l'esprit qui sont faciles à faire des erreurs. ・ "$ A \ bar {x ^ 2} " dans ⑥ 'et " a \ bar {x} ^ 2 $" dans [6' '] sont différents (⑥' est la moyenne de $ x ^ 2 $ Mais [6 ''] est le carré de $ \ bar {x} ) ・ " \ Bar {xy} " de ⑥'et " \ bar {x} \ bar {y} $" de [6 ''] sont différents (⑥ 'est la moyenne de $ xy $, mais [ 6 ''] est la moyenne de $ x $ multipliée par la moyenne de $ y $)

⑥- [6 ''] donnera les résultats suivants.

a\bar{x^2} - a\bar{x}^2 = \bar{xy} - \bar{x}\bar{y}

Résoudre cela pour $ a $

a = \frac{\bar{xy} - \bar{x}\bar{y}}{\bar{x^2} - \bar{x}^2}・ ・[A]

Enfin, nous résoudrons environ $ b $. À partir de [6], $ b = \ bar {y} --a \ bar {x} $, donc si vous remplacez [A],

b = \bar{y} - \frac{\bar{xy} - \bar{x}\bar{y}}{\bar{x^2} - \bar{x}^2}\bar{x}・ ・[B]

De [A] et [B], j'ai pu obtenir les $ a $ et $ b $ que je voulais.

◆ La formule de la ligne droite que vous vouliez trouver

Maintenant que nous avons $ a $ et $ b $, nous pouvons exprimer la «meilleure» formule en ligne droite qui minimise $ E $ (= erreur minimale) comme suit. La formule originale de la ligne droite est $ y = ax + b $, donc

y = \frac{\bar{xy} - \bar{x}\bar{y}}{\bar{x^2} - \bar{x}^2}x +( \bar{y} - \frac{\bar{xy} - \bar{x}\bar{y}}{\bar{x^2} - \bar{x}^2}\bar{x})

J'ai pu l'exprimer!

Le fait est que vous pouvez calculer cela à la main, ce n'est pas étonnant, mais la formule ci-dessus ne peut être calculée qu'avec les données que vous avez actuellement (dans cet exemple, les données de température et de ventes) ** C'est le but.

Avec scikit-learn, il sera calculé en un seul coup, mais je pense qu'il est très important de comprendre que ce genre de calcul se fait en coulisses. Au début, il m'a fallu beaucoup de temps pour comprendre la séquence des étapes jusqu'à ce point. Cela peut être difficile au début, mais j'espère que tout le monde pourra bouger ses mains.

◆ Léger développement

Calculé manuellement $ y = \ frac {\ bar {xy} - \ bar {x} \ bar {y}} {\ bar {x ^ 2} - \ bar {x} ^ 2} x + (\ bar {y} - \ frac {\ bar {xy} - \ bar {x} \ bar {y}} {\ bar {x ^ 2} - \ bar {x} ^ 2} \ bar {x}) $ , Pour certaines des formules qui y figurent, ce qui suit est valable.


Hypothèses
$ \ bar {xy} - \ bar {x} \ bar {y} = σ_ {xy} $ * À partir de la formule de covariance

$ \ bar {x ^ 2} - \ bar {x} ^ 2 = σ_x ^ 2 $ * À partir de la formule de dispersion


Conclusion

y = \frac{σ_{xy}}{σ_x^2}x + (\bar{y} - \frac{σ_{xy}}{σ_x^2}\bar{x})

Il peut également être écrit comme ci-dessus.

5. Résumé

Comment était-ce? Ma pensée est: "Je ne peux pas interpréter même si on me montre un code très compliqué depuis le début, donc je ne me soucie pas de la précision une fois, donc je vais essayer d'implémenter une série de flux de base avec scicit-learn, etc." Je pense que c'est très important.

Cependant, une fois que je m'y suis habitué, je pense qu'il est très important de comprendre comment ils fonctionnent dans les coulisses à partir d'un fond mathématique.

Je pense que de nombreux contenus sont difficiles à comprendre, mais j'espère que cela aidera à approfondir ma compréhension.

Recommended Posts

[Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression multiple linéaire à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression logistique à 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
Python Scikit-learn Analyse de régression linéaire Analyse de régression simple non linéaire Apprentissage automatique
[Apprentissage automatique] Comprendre la décorrélation des mathématiques
Régression linéaire d'apprentissage automatique
Machine Learning: Supervision - Régression linéaire
Les débutants en apprentissage automatique essaient la régression linéaire
Algorithme d'apprentissage automatique (analyse de régression unique)
Classification et régression dans l'apprentissage automatique
Algorithme d'apprentissage automatique (généralisation de la régression linéaire)
Apprentissage automatique avec python (2) Analyse de régression simple
<Cours> Machine learning Chapitre 1: Modèle de régression linéaire
Comprendre les types de données et le début de la régression linéaire
Algorithme d'apprentissage automatique (résumé de régression linéaire et régularisation)
EV3 x Python Machine Learning Partie 2 Régression linéaire
Vue d'ensemble des techniques d'apprentissage automatique apprises grâce à scikit-learn
Régression logistique d'apprentissage automatique
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
Coursera Machine Learning Challenge en Python: ex1 (régression linéaire)
L'apprentissage automatique pratique avec Scikit-Learn et TensorFlow-TensorFlow a abandonné -
Introduction à l'apprentissage automatique à partir de Simple Perceptron
Créez un environnement d'apprentissage automatique scikit-learn avec VirtualBox et Ubuntu
[Apprentissage automatique] Comprendre la forêt aléatoire
Comprendre l'apprentissage automatique ~ régression de crête ~.
Algorithme d'apprentissage automatique (perceptron simple)
Apprentissage automatique et optimisation mathématique
[Python] Régression linéaire avec scicit-learn
Machine learning supervisé (classification / régression)
Modèle d'empilage d'apprentissage automatique (retour)
Algorithme d'apprentissage automatique (régression logistique)
Régression linéaire robuste avec scikit-learn
[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
"Processus Gauss et apprentissage automatique" Régression de processus Gauss implémentée uniquement avec Python numpy
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Algorithme d'apprentissage automatique (analyse de régression multiple)
SVM essayant l'apprentissage automatique avec scikit-learn
Organisez des plateformes d'apprentissage automatique et d'apprentissage en profondeur
Apprentissage automatique: analyse discriminante linéaire supervisée
(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation