[PYTHON] [Apprentissage automatique] Comprendre la régression multiple linéaire à 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" **.

Dans cet article, ** 2 à 3 visent «J'aime la théorie, alors j'essaierai d'abord d'utiliser scicit-learn», et 4 et plus tard visent «Comprendre le contexte des mathématiques» **.

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

Puisqu'il existe des chevauchements avec la régression linéaire simple ci-dessus, veuillez également vous référer à l'article sur la régression linéaire simple. [Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et de mathématiques

(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 $ en utilisant les caractéristiques linéaires est appelée régression linéaire.

La régression simple linéaire avait un $ x $, tandis que la régression multiple linéaire avait plusieurs $ x $.

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 dans 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 dans votre magasin. Dans l'article sur la régression linéaire simple, nous avons supposé que c'était la "température" qui affectait les ventes de glaces, mais quand on y pense, on a vraiment dirigé un glacier. Alors, concluez-vous que «seule la température» affecte vraiment les ventes?

Peut-être pas seulement la température, mais aussi le volume de trafic dans les rues du glacier ce jour-là, et c'est l'influence des employés qui travaillent ensemble. Comme vous pouvez le voir, il existe généralement ** plusieurs variables explicatives qui affecteront la variable objective (ventes de crème glacée) **, et dans certains cas des dizaines de milliers.

Donc, si vous essayez d'illustrer "quelques variables explicatives ($ = x )" et "variables objectives (ventes de crème glacée ( = y $))" comme indiqué ci-dessous, les variables explicatives et les variables objectives (glace) Vous pouvez voir qu'il y en a qui sont susceptibles d'avoir une forme droite (= $ ax + b $) (= linear) et d'autres qui ne sont pas si pertinents.


Graphique de dispersion des ventes et des températures
キャプチャ1.PNG


Carte de dispersion des ventes et du volume de trafic
キャプチャ2.PNG


Diagramme de dispersion des ventes et du nombre d'employés qui faisaient partie de l'équipe ce jour-là
キャプチャ3.PNG

Dans cette illustration, vous pouvez choisir d'utiliser "température" et "nombre d'employés" comme variables explicatives, qui sont susceptibles d'avoir une relation linéaire avec les ventes, et non "volume de trafic". Ici, nous l'utiliserons comme exemple plus tard, donc nous inclurons également le "volume de trafic" dans les variables explicatives.

Ensuite, utilisons scicit-learn pour créer un modèle d'apprentissage automatique qui calcule les ventes de crème glacée en fonction de la température, du volume de trafic et du nombre d'employés.

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.

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

(2) Préparation des données

Réglez la température, le volume de trafic, le nombre d'employés et les ventes de crème glacée en tant que données comme indiqué ci-dessous.

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

(3) 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["sales(=y)"].values
X = data.drop("sales(=y)", axis=1).values  #Moyens de définir des colonnes autres que les ventes comme X

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 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)

Voilà pour un modèle simple. 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 (multiple)?" En coulisse, nous recherchons une formule linéaire qui prédit les ventes à partir du volume de trafic et du nombre d'employés. Si vous le laissez tel quel, vous ne le réaliserez pas, alors mettons en fait l'inclinaison et la section.

b = regr.intercept_
a1 = regr.coef_[0]
a2 = regr.coef_[1]
a3 = regr.coef_[2]

pd.DataFrame([b,a1,a2,a3],index = ["b","a1","a2","a3"])

Ensuite, il sera affiché comme ci-dessous. キャプチャ4.PNG

En d'autres termes, nous pouvons voir que la formule de cette régression linéaire est $ y = 1.074159x_1 + 0.04694x_2 + 2.170663x_3 + 8.131467 $.

En passant, le coefficient de volume de trafic ($ x_2 ) ( = a_2 $), qui semblait avoir peu à voir avec les ventes dans la première illustration, était de 0,04694, ce qui est très petit par rapport aux deux autres coefficients. Vous pouvez voir à partir du calcul. En d'autres termes, nous pouvons voir à nouveau que le volume de trafic est une variable qui n'a pas beaucoup d'influence (= insignifiante) lors du calcul de $ y $.

(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 pour prévoir les ventes futures. Vous avez noté la température, le trafic prévu et le nombre d'employés pour les trois prochains jours. Stockez-le dans une variable appelée z comme indiqué ci-dessous.

z = pd.DataFrame([[20,15,18],
                  [15,60,30],
                  [5,8,12]])

Ce que je veux faire, c'est appliquer les données futures ci-dessus à la formule de ligne droite 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 "([69.39068087, 92.18012508, 39.92573722])". En d'autres termes, les ventes de demain seront d'environ 694 000 yens, et après-demain, d'environ 922 000 yens. Si vous pouvez obtenir les données du 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 (multiple) à partir des mathématiques

À propos, jusqu'à 3, utilisez scicit-learn pour calculer $ a $ et $ b $ de $ y = a_1x_1 + a_2x_2 + ・ ・ ・ + a_ix_i + b $ → Mettre en œuvre le flux de prévision des ventes à partir des données pour les 3 prochains jours J'ai essayé de. Ici, je voudrais clarifier ** comment "calculer $ a $ et $ b $" dans ce flux est ** calculé mathématiquement.

(1) Connaissances préalables (vecteur de base, algèbre linéaire)

$ \ frac {∂c} {∂ \ boldsymbol {x}} = 0 ← Différencier une constante par x donne 0 $

\frac{∂(\boldsymbol{c}^T\boldsymbol{x})}{∂\boldsymbol{x}} = \boldsymbol{c}

$\frac{∂(\boldsymbol{x}^TC\boldsymbol{x})}{∂\boldsymbol{x}} = (C

(2) Compréhension mathématique

(I) À propos de la formule de l'analyse de régression multiple

◆ Formule d'analyse de régression multiple Comme mentionné dans la première moitié, la formule de l'analyse de régression multiple est généralement exprimée comme suit.

** $ \ chapeau {y} = a_1x_1 + a_2x_2 + ・ ・ + a_mx_m + a_0 ・ 1 $ **

◆ Dans cet exemple ... $ x_1 $ est la température, $ x_2 $ est le volume du trafic, $ x_3 $ est le nombre d'employés, chaque nombre est multiplié par un coefficient $ a_1, a_2, a_3 $, et enfin la constante $ a_0.1 $ est ajoutée pour vendre. Je recherche $ \ hat {y} $.

(Ii) Exprimer la formule de l'analyse de régression multiple avec un vecteur

Voici la représentation de $ x $ dans la formule d'analyse de régression multiple dans (i) comme vecteur $ x $, c'est-à-dire $ \ boldsymbol {x} $. キャプチャ5.PNG

Puisqu'il y a trois variables explicatives cette fois, ce sera jusqu'à $ x_3 $, mais il est généralement exprimé comme ci-dessus.

Et, par exemple, les données de température de $ x_1 $ ci-dessus ne devraient pas avoir une seule donnée, mais les données de température pour plusieurs jours devraient y être stockées. Il est représenté par la matrice $ X $ ci-dessous.

キャプチャ6.PNG

De même, le vecteur $ a $, c'est-à-dire $ \ boldsymbol {a} $, peut être exprimé comme suit.

$ \boldsymbol{a} = \begin{pmatrix} a_0\
a_1\
a_2\
a_3\
・ \
・ \
a_m \end{pmatrix} $

En d'autres termes, la formule pour l'analyse de régression multiple qui prédit les ventes d'origine est $ \ hat {y} = a_1x_1 + a_2x_2 + ・ ・ + a_mx_m + a_0 ・ 1 $, donc $ \ hat {y} = \ boldsymbol {X} \ boldsymbol Il peut être exprimé par {a} $.

L'important est que $ \ hat {y} $ et $ \ boldsymbol {X} $ puissent être trouvés à partir des données que vous avez, alors remplacez-les par $ \ boldsymbol {a} $, c'est-à-dire ** analyse de régression multiple. Cela signifie que le coefficient de chaque variable explicative dans la formule de peut être calculé **.

À partir de maintenant, trouvons $ \ boldsymbol {a} $ analytiquement (= calculé manuellement) en utilisant cette formule. C'est le même calcul que Scikit-learn effectue dans les coulisses. (Strictement différent, mais j'y reviendrai plus tard.)

(Iii) Calcul de la fonction d'erreur

Comme mentionné dans l'article sur la régression linéaire simple, $ \ hat {y} = a_1x_1 + a_2x_2 + ・ ・ + a_mx_m + a_0 ・ Pour déterminer $ a_1 $, $ a_2 $ et $ a_3 $ de 1 $, ** Définissez les bons $ a_1, a_2, a_3 $ pour que la différence entre les ventes réelles $ y $ et la valeur prédite $ \ hat {y} $ soit aussi petite que possible **.

Voyons ce que signifie être "bon" en calculant la différence (fonction d'erreur) entre $ y $ et $ \ hat {y} $.

\begin{align} E &= \sum_{i=1}^n ({y_i - \hat{y}})^{2}\\\ &= (y - \hat{y})^T(y - \hat{y})\\\ & = (y- \ boldsymbol {X} \ boldsymbol {a}) ^ T (y- \ boldsymbol {X} \ boldsymbol {a}) ← \ hat {y} avec \ boldsymbol {X} \ boldsymbol {a} Substitution \\\ &= (y^T - (\boldsymbol{X}\boldsymbol{a})^T)(y - \boldsymbol{X}\boldsymbol{a})\\\ &= (y^T - a^T\boldsymbol{X}^T)(y - \boldsymbol{X}\boldsymbol{a})←(\boldsymbol{X}\boldsymbol{a})^T = a^T\boldsymbol{X}^T\\\ & = y ^ Ty --y ^ T \ boldsymbol {X} \ boldsymbol {a} --a ^ T \ boldsymbol {X} ^ Ty + a ^ T \ boldsymbol {X} ^ T \ boldsymbol {X} \ boldsymbol {a } ← Développez l'expression d'un niveau au-dessus \\\ & = y ^ Ty --2y ^ T \ boldsymbol {X} \ boldsymbol {a} + a ^ T \ boldsymbol {X} ^ T \ boldsymbol {X} \ boldsymbol {a} ← a ^ T \ boldsymbol {X} ^ De Ty = y ^ T \ boldsymbol {X} \ boldsymbol {a} \end{align}

Pour minimiser ce $ E $, différenciez $ E $ par $ \ boldsymbol {a} $ et trouvez que $ \ boldsymbol {a} $ vaut 0. (Voir l'article sur la régression linéaire simple pour savoir pourquoi elle se différencie à 0.)

$ \begin{align} \ frac {∂E} {∂ \ boldsymbol {a}} & = \ frac {∂} {∂ \ boldsymbol {a}} (y ^ Ty) --2 \ frac {∂} {∂ \ boldsymbol {a}} ( y ^ T \ boldsymbol {X} \ boldsymbol {a}) + \ frac {∂} {∂ \ boldsymbol {a}} (a ^ T \ boldsymbol {X} ^ T \ boldsymbol {X} \ boldsymbol {a}) ← \ frac {∂} {∂ \ boldsymbol {a}} (y ^ Ty) devient 0 \
& = -2 \ boldsymbol {X} ^ Ty + [\ boldsymbol {X} ^ T \ boldsymbol {X} + (\ boldsymbol {X} ^ T \ boldsymbol {X}) ^ T] \ boldsymbol {a} ← Premise C dans la troisième expression de la connaissance correspond à \ boldsymbol {X} ^ T \ boldsymbol {X} ici \
&= -2\boldsymbol{X}^Ty + 2\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{a} \end{align} $

Puisque cette fonction d'erreur devient 0,

$ \begin{align} -2\boldsymbol{X}^Ty + 2\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{a} = 0\
2\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{a} = 2\boldsymbol{X}^Ty\
\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{a} = \boldsymbol{X}^Ty\
\end{align} $

En d'autres termes, le $ \ boldsymbol {a} $ que vous vouliez trouver est calculé comme suit.

\boldsymbol{a} = (\boldsymbol{X}^T\boldsymbol{X})^{-1} \boldsymbol{X}^Ty

(3) Développement-Essayez d'implémenter avec python-

Le $ \ boldsymbol {a} $ que je voulais trouver pourrait être exprimé dans une formule mathématique, mais même avec cette quantité de présentation, la régression multiple peut ne pas bien sortir (je ne suis pas venu).

Par conséquent, ici, je voudrais utiliser numpy de python pour calculer analytiquement la formule pour l'analyse de régression multiple à partir de la formule ci-dessus.

◆ Ensemble de données

(I) Importer numpy

import numpy as np

(Ii) Ensemble de données Cela peut être un peu difficile à voir, mais la colonne verticale à gauche de x est la température, la deuxième colonne est le volume de trafic et la troisième colonne est le nombre d'employés. y est les ventes.

x = np.matrix([[8,100,3],
              [10,20,5],
              [6,30,4],
              [15,15,6],
              [12,60,6],
              [16,25,7],
              [20,40,12],
              [13,20,8],
              [24,18,12],
              [26,30,10],
              [12,60,7],
              [18,10,7],
              [19,8,8],
              [16,25,6],
              [20,35,6],
              [23,90,10],
              [26,25,12],
              [28,55,13]])
y = np.matrix([[30],
              [35],
              [28],
              [38],
              [35],
              [40],
              [60],
              [34],
              [63],
              [65],
              [38],
              [40],
              [41],
              [43],
              [42],
              [55],
              [65],
              [69]])

(Iii) Analyse de régression multiple Comme indiqué précédemment, $ \ boldsymbol {a} = (\ boldsymbol {X} ^ T \ boldsymbol {X}) ^ {-1} \ boldsymbol {X} ^ Ty $, écrivez donc comme suit.

(x.T * x)**-1 * x.T * y

Ensuite, vous verrez le résultat comme celui-ci. En d'autres termes, calculé sur numpy, $ a_1 = 1,26, a_2 = 0,09, a_3 = 2,47 $. matrix([[1.26664688], [0.09371714], [2.47439799]])

Ceci est dû au fait que les valeurs numériques sont légèrement différentes de $ a_1, a_2, a_3 $ obtenues par scikit-learn, mais scikit-learn prend en compte davantage le biais (c'est-à-dire) dans le calcul de ce numpy. Si vous commencez à aller aussi loin, cela deviendra plus compliqué, donc en termes de connaissance des calculs de base que scicit-learn effectue dans les coulisses, je pense qu'il est préférable de garder ce niveau à l'esprit.

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, alors essayez d'abord 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 à partir d'un fond mathématique comment ils fonctionnent dans les coulisses.

Je pense qu'il y a beaucoup de contenus difficiles à comprendre, mais j'espère que cela m'aidera à approfondir ma compréhension, et je pense que je dois apprendre plus fermement ici, alors je l'ai renforcé en continuant à étudier. Je souhaite publier un article.

Recommended Posts

[Apprentissage automatique] Comprendre la régression multiple linéaire à 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 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
[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 multiple)
Classification et régression dans l'apprentissage automatique
Algorithme d'apprentissage automatique (généralisation de la régression linéaire)
<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)
[scikit-learn, matplotlib] Analyse de régression multiple et dessin 3D
Vue d'ensemble des techniques d'apprentissage automatique apprises grâce à scikit-learn
Gérez beaucoup avec PyTorch de la régression linéaire multiple à la régression logistique, perceptron multicouche, auto-encodeur
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é -
[Apprentissage automatique] Comprendre la forêt aléatoire
Comprendre l'apprentissage automatique ~ régression de crête ~.
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.
Méthode Newton pour l'apprentissage automatique (de 1 variable à plusieurs variables)
[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 unique)
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