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» **.
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. (Cependant, cette fois, nous avons besoin de connaître l'algèbre linéaire, donc si vous trouvez cela difficile, vous pouvez simplement le faire passer.)
J'ai publié un article similaire à la série «Comprendre les mathématiques», j'espère donc que vous pourrez le lire également. [Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et de mathématiques [[Machine learning] Comprendre la régression logistique à partir de scikit-learn et des mathématiques] (https://qiita.com/Hawaii/items/ee2a0687ca451fe213be) [[Machine learning] Comprendre la SVM à la fois à partir de scikit-learn et des mathématiques] (https://qiita.com/Hawaii/items/4688a50cffb2140f297d) [[Apprentissage automatique] Comprendre à partir des mathématiques pourquoi le coefficient de corrélation varie de -1 à 1] (https://qiita.com/Hawaii/items/3f4e91cf9b86676c202f)
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
** 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.
Il peut y avoir des malentendus,
"Ce que vous voulez ($ = y
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.
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
Graphique de dispersion des ventes et des températures
Carte de dispersion des ventes et du volume de trafic
Diagramme de dispersion des ventes et du nombre d'employés qui faisaient partie de l'équipe ce jour-là
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.
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
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]
})
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.
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.
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.
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
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.
À 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.
$ \ frac {∂c} {∂ \ boldsymbol {x}} = 0 ← Différencier une constante par x donne 0 $
$\frac{∂(\boldsymbol{x}^TC\boldsymbol{x})}{∂\boldsymbol{x}} = (C
◆ 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} $.
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} $.
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.
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.)
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} $.
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.
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.
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