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é.
** 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
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.
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
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.
Importez les éléments suivants requis pour effectuer une régression linéaire.
from sklearn.linear_model import LinearRegression
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]
})
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=':')
En gros, il semble y avoir une relation linéaire entre la température ($ = x
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.
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.
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é.
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
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")
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é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.
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.
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
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.
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?
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".
Mâchons un peu plus. La "distance entre la ligne droite et le point bleu" décrite en (i) peut s'écrire comme suit.
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.
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 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. ..
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 ① ↓
\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}
⑥- [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.
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.
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.
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