Wenn Sie maschinelles Lernen ausprobieren möchten, kann jeder Scicit-Learn usw. verwenden, um es relativ einfach zu implementieren. Um jedoch Ergebnisse bei der Arbeit zu erzielen oder Ihr Niveau zu verbessern ** Sie können sehen, dass es in der Erklärung von "Ich kenne den Hintergrund nicht, aber ich habe dieses Ergebnis" deutlich schwach ist **.
In diesem Artikel zielen ** 2 bis 3 auf "Ich mag die Theorie, also werde ich zuerst versuchen, Scicit-Learn zu verwenden" und 4 und später auf "Den Hintergrund aus der Mathematik verstehen" **.
2/5 Nachschrift
3/1 Nachschrift
・ 3. Lineare Regression mit Scikit-Learn → (4) Modellkonstruktion → (iv) Ergänzung wurde hinzugefügt.
** Zahlen vorhersagen. ** Beim maschinellen Lernen gibt es andere "Klassifikationen". Wenn Sie jedoch numerische Werte wie "●● Kreis" und "△ Kg" vorhersagen möchten, können Sie Regression verwenden.
Es kann einige Missverständnisse geben,
"Was Sie wollen ($ = y
Ich denke, es ist schwer zu verstehen, deshalb gebe ich Ihnen ein konkretes Beispiel.
Spezifisches Beispiel
Sie sind eine selbständige Eisdiele und möchten unbedingt den Verkauf von Eis in Ihrem Geschäft ** vorhersagen können, um Ihre Verkaufsaussichten zu stabilisieren. Ich werde.
Sie fragen sich verzweifelt, was sich auf den Eisverkauf Ihres Geschäfts auswirkt, und stellen fest, dass je heißer die Temperatur, desto mehr Eis verkauft wird und je kühler die Temperatur, desto weniger Eis verkauft wird. Ich tat.
Wenn Sie also versuchen, "Temperatur ($ = x
Als nächstes verwenden wir scikit-learn, um ein Modell für maschinelles Lernen zu erstellen, das den Verkauf von Eiscreme anhand der Temperatur anstrebt.
Importieren Sie Folgendes, um eine lineare Regression durchzuführen.
from sklearn.linear_model import LinearRegression
Stellen Sie die Temperatur und den Eisverkauf wie unten gezeigt als Daten ein.
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]
})
Lassen Sie uns die Temperatur und den Verkauf von Eiscreme veranschaulichen. Selbst wenn Sie eine lineare Regression verwenden, wenn diese nicht in einer linearen Beziehung steht, ist die Genauigkeit sehr schlecht, da die Originaldaten nicht linear sind. Versuchen Sie, alle Daten zu veranschaulichen, anstatt scicit-learn auf einmal zu verwenden.
plt.scatter(data["temprature(=x)"],data["sales(=y)"])
plt.xlabel("temprature(°)")
plt.ylabel("sales")
plt.grid(which='major',color='black',linestyle=':')
Ungefähr scheint es eine lineare Beziehung zwischen Temperatur ($ = x
Zunächst werden wir die Form der Daten anordnen, um das Modell zu erstellen.
x = data["temprature(=x)"].values
y = data["sales(=y)"].values
X = x.reshape(-1,1)
Dieses Mal ist es kein Artikel über Python-Grammatik, daher werde ich die Details weglassen, aber ich werde x und y in einer Form für lineare Regression mit Scikit-Learn anordnen.
Es ist endlich die Modellbauordnung.
regr = LinearRegression(fit_intercept = True)
regr.fit(X,y)
Es mag verstimmt sein, aber wenn es ein einfaches Modell ist, ist es das. Wir werden ein lineares Regressionsmodell für eine Variable namens Regr erstellen! Es ist ein Bild davon, wie man eine Deklaration macht und das Regre in die nächste Zeile passt (= lernt).
Wie in "2. Was ist lineare (einzelne) Regression?" Ich suche nach der Formel der geraden Linie, die hinter den Kulissen gemacht werden soll. Wenn Sie es so lassen, wie es ist, werden Sie es nicht bemerken, also lassen Sie uns den Hang tatsächlich ausschneiden.
a = regr.coef_ #Finde die Neigung
b = regr.intercept_ #Finden Sie den Abschnitt
print(a)
print(b)
Sie sollten a als [1.92602996] und b als [12.226591760299613] sehen. Mit anderen Worten, die gerade Linie ist $ y (= Umsatz) = 1,92602996 * x (= Temperatur) + 12,226591760299613 $ und Scikit-Learn hat danach gefragt.
Wenn Sie nur ein Modell erstellen möchten, reicht (iii) aus, aber es gibt andere Dinge wie die folgenden. Referenz: https://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0
◆ Zeigen Sie die im Modellbau verwendeten Parameter an Dieses Mal habe ich nur fit_intercept auf True gesetzt, aber es gibt andere Parameter, die eingestellt werden können, und Sie können sehen, wie sie jetzt eingestellt werden.
regr.get_params()
Dann wird {'copy_X': True, 'fit_intercept': True, 'n_jobs': None, 'normalize': False} angezeigt.
-Copy_X: Wählen Sie aus, ob nach dem Duplizieren der Daten im Speicher ausgeführt werden soll. (Standardwert: True) -Fit_intercept: Bei der Einstellung False wird die Berechnung für den Abschnitt (in diesem Fall $ b $) nicht berücksichtigt. Daher wird sie verwendet, wenn Daten verarbeitet werden, bei denen die Zielvariable immer den Ursprung durchläuft. (Standardwert: True) -N_jbobs: Die Anzahl der für die Berechnung verwendeten Jobs. Bei Einstellung auf -1 wird dies mit allen CPUs berechnet. (Standardwert: 1) -Normalize: Wenn True festgelegt ist, werden die erklärenden Variablen vornormalisiert. (Standardwert: False)
◆ Entscheidungskoeffizienten anzeigen Der Entscheidungsfaktor ist ein Maß dafür, wie gut das Modell zu den tatsächlichen Daten im Bereich von 0 bis 1 passt.
regr.score(X,y)
◆ Fehlerbewertung Da die Menge der Beschreibung groß sein wird, werde ich sie nicht noch einmal beschreiben, aber das Folgende wird hilfreich sein. 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
Lassen Sie uns nun diese gerade Linie im obigen Streudiagramm veranschaulichen.
#Gerade Formel
y_est_sklearn = regr.intercept_ + regr.coef_[0] * x
#Ursprüngliches Temperatur- und Verkaufsgrundstück
plt.scatter(x, y, marker='o')
#Originaltemperatur und geradlinige Formel der Vorhersage
plt.plot(x, y_est_sklearn, linestyle=':', color='green')
#Detaillierte Einstellungen in der Abbildung
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.xlabel("temprature(°)")
plt.ylabel("sales")
Achten Sie auf diese Weise darauf, was Sie mit scicit-learn tun und womit es verbunden ist.
Es macht keinen Sinn, ein Modell fertig zu stellen. In der realen Welt ist es notwendig, dieses lineare Prognosemodell zu verwenden, um zukünftige Verkäufe vorherzusagen. Sie haben sich die Wettervorhersage für die nächsten vier Tage angesehen und die Temperatur notiert. Speichern Sie es in einer Variablen namens z, wie unten gezeigt.
z = pd.DataFrame([10,25,24,22])
Was ich tun möchte, ist, die obige zukünftige Temperaturprognose auf die lineare Formel anzuwenden, die durch früheres Lernen erhalten wurde, und Verkäufe vorherzusagen.
regr.predict(z)
In diesem Fall wird das Ergebnis als "([31.48689139, 60.37734082, 58.45131086, 54.59925094])" angezeigt. Mit anderen Worten, morgen beträgt die Temperatur 10 °, sodass der Umsatz etwa 315.000 Yen betragen wird, und übermorgen wird die Temperatur 25 ° betragen, sodass der Umsatz etwa 603.000 Yen betragen wird. Wenn Sie eine Prognose der Temperatur für den nächsten Monat erhalten, haben Sie eine ungefähre Vorstellung vom Umsatz und Ihr Ziel wird erreicht.
Es gibt viele andere Details, aber ich denke, es ist gut, zuerst die orthodoxe lineare Regression zu implementieren.
Übrigens habe ich bis zu 3 versucht, den Berechnungsfluss von $ a $ und $ b $ von $ y = ax + b $ mithilfe von scikit-learn → illustration → Umsatzprognose aus der Temperatur für die nächsten 4 Tage zu implementieren .. Hier möchte ich klarstellen **, wie die "Berechnung von $ a $ und $ b $ von $ y = ax + b $" in diesem Fluss ** mathematisch berechnet wird. Ich werde.
a. Grundlegende Differenzierung
y = x^Wenn 2 durch x, y unterschieden wird'=2x\\
y = x^2 +Wenn 4 durch x, y unterschieden wird'=2x\\
y = (-3x + 2)^Wenn 2 durch x, y unterschieden wird' = 2(-3x +2)(-3)
b. Bedeutung von Σ (Sigma) Bedeutet Summe
Ich werde die zuvor erwähnte Tabelle erneut veröffentlichen. Wie unten gezeigt, möchte ich eine "gerade Linie mit gutem Gefühl" für die Vorhersage von Temperatur und Umsatz zeichnen, dh ich möchte die Steigung und den Abschnitt a und b bestimmen.
Wie entscheidest du dich für a und b? Schauen Sie sich nun die beiden geraden Linien unten an. Welche gerade Linie, grün oder orange, sagt eher das Verhältnis zwischen Temperatur und Umsatz voraus?
Offensichtlich können Sie sehen, dass Orange (a = 1,92, b = 12,2) eher die Beziehung zwischen tatsächlicher Temperatur und Umsatz darstellt als Grün (a = 2,0, b = 30,0). Ich denke, man kann sagen, dass ** die orange gerade Linie "weil der Abstand zwischen der geraden Linie und dem tatsächlichen blauen Punkt näher ist" ** ist.
Mit anderen Worten, Scikit-Learn möchte, dass a und b eine "gute gerade Linie" sind, wobei der Abstand zwischen der geraden Linie und dem blauen Punkt am kürzesten ist.
Diese Methode, a und b so zu finden, dass "der Abstand zwischen der geraden Linie und dem blauen Punkt am nächsten ist", wird als "Minimum-Square-Methode" bezeichnet.
Lass uns ein bisschen mehr kauen. Der in (i) beschriebene "Abstand zwischen der geraden Linie und dem blauen Punkt" kann wie folgt geschrieben werden.
Tatsächliche Koordinaten (roter Punkt in der obigen Abbildung): $ (x_1, y_1) $ Vorausgesagte Koordinaten mit $ y = ax + b $: Ausgedrückt als $ (x_1, ax_1 + b) $.
Der Fehler zwischen diesen beiden y-Koordinaten (= die Differenz zwischen der Prognose und dem tatsächlichen Umsatz) kann als $ {y_1- (ax_1 + b)} $ ausgedrückt werden.
Dieses $ {y_1- (ax_1 + b)} $ ist nur die Differenz zwischen der Prognose und dem tatsächlichen Umsatz eines roten Punkts. Addieren Sie sie also für alle Punkte und setzen Sie a und b, damit dieser Fehler so gering wie möglich ist. Suchen (= finden Sie a und b aus der Berechnung, damit der Unterschied zwischen der Vorhersage und dem tatsächlichen Wert so gering wie möglich ist).
Wenn die Differenz nur genommen wird, werden das Plus und das Minus aufgehoben, so dass im Allgemeinen der durch Quadrieren des Fehlers erhaltene Wert so berechnet wird, dass er so klein wie möglich ist. Diese Idee wird als Minimum-Square-Methode bezeichnet.
Unter der Annahme, dass die Summe der Fehler der vorhergesagten Werte, die aus allen tatsächlichen Punkten und den geraden Linien berechnet wurden, "E" ist, kann E wie folgt ausgedrückt werden.
E = \sum_{i=1}^n [{y_i - (ax_i + b)}]^{2}
Dies ist die Summe der Quadrate der Differenz zwischen dem tatsächlichen Wert $ y_i $ und dem vorhergesagten Wert $ (ax_i + b) $ vom ersten bis zum n-ten Punkt (im Wesentlichen alle).
Um das Minimum von $ E $ zu berücksichtigen, stellen wir die Form der Funktion von $ E $ dar.
Im Allgemeinen wird $ E $ wie oben dargestellt, und Sie können sehen, dass $ E $ um den roten Punkt herum minimiert wird. Was ist dann dieser rote Punkt? ** "Die Differenzierung von $ E $ durch $ a $ ist 0, und die Differenzierung von $ E $ durch $ b $ ist 0" ** ist. Differenzierung bedeutet "Neigung", daher ist der Punkt, an dem die Neigung von der Achsenseite von $ a $ aus gesehen 0 wird und die Neigung von der Achsenseite von $ b $ aus 0 wird, der rote Punkt. ..
Wenn möglich, bringen Sie tatsächlich ein Stück Papier und einen Stift mit und versuchen Sie, Ihre Hände zu bewegen. [Differenziere mit $ a $] $ ∂ $, das unten verwendet wird, wird im Sinne einer Unterscheidung als "del" gelesen (es gibt verschiedene Möglichkeiten, es zu lesen).
↓ Das Folgende ist eine Ergänzung zur Formel ① ↓
\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}
・ Wenn ① differenziert wird, wird es zu ② (=, also verschwindet $ ∂ $, was Differenzieren bedeutet, in ②) ・ ③ ist nur eine geringfügige Transformation von ②, und ④ wird für jedes Zeichen von ③ durch $ Σ $ zerlegt. Ich suche nach einem Punkt, der mit $ a $ differenziert und zu 0 wird. Lösen wir ihn also mit ④ = 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}
Da ④ = 0 ist, ist es die Formel, die durch Teilen des an die Formel ④ angehängten Koeffizienten 2 durch beide Seiten erhalten wird. ⑥ ist die Formel von ⑤ geteilt durch n auf beiden Seiten. In ⑤ werden Daten von der ersten bis zur n für jedes $ Σ $ hinzugefügt. Wenn Sie also durch n dividieren, wird der Durchschnitt ausgegeben. Genauer gesagt ist das erste $ Σ $ ($ - \ sum_ {i = 1} ^ n x_iy_i $) die Summe von $ xy $ vom ersten bis zum n-ten. Mit anderen Worten, wenn Sie dies durch $ n $ teilen, ist dies der Durchschnitt des Ganzen, sodass es als $ - \ bar {xy} $ ausgedrückt werden kann.
[Differenziere mit $ b $] Ebenso wird $ b $ differenziert.
\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}
Was Sie in [1] bis [4] tun, ist im Grunde dasselbe wie ① bis ④, die durch $ a $ differenziert sind und entsprechen. In ähnlicher Weise lösen wir [5] und [6] zusammen mit ⑤ und ⑥.
\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}
[Gleichzeitige Gleichungen lösen] ⑥ und [6] werden mit einigen Änderungen nachgedruckt.
a\bar{x^2} + b \bar{x} = \bar{xy}・ ・ ⑥'\\
a\bar{x} + b = \bar{y}・ ・ 【6'】
Um diese beiden simultanen Gleichungen zu lösen (um = $ b $ zu eliminieren), multiplizieren Sie [6 '] mit $ \ bar {x} $.
a\bar{x^2} + b \bar{x} = \bar{xy}・ ・ ⑥'\\
a\bar{x}^2 + b\bar{x} = \bar{x}\bar{y}・ ・ 【6''】
Hier sind zwei Dinge zu beachten, die leicht zu Fehlern führen können.
・ "$ A \ bar {x ^ 2}
⑥- [6 ''] führt zu Folgendem.
a\bar{x^2} - a\bar{x}^2 = \bar{xy} - \bar{x}\bar{y}
Löse dies für $ a $
a = \frac{\bar{xy} - \bar{x}\bar{y}}{\bar{x^2} - \bar{x}^2}・ ・[A]
Schließlich werden wir ungefähr $ b $ lösen. Ab [6] ist $ b = \ bar {y} --a \ bar {x} $. Wenn Sie also [A] ersetzen,
b = \bar{y} - \frac{\bar{xy} - \bar{x}\bar{y}}{\bar{x^2} - \bar{x}^2}\bar{x}・ ・[B]
Von [A] und [B] konnte ich die $ a $ und $ b $ bekommen, die ich wollte.
Jetzt, da wir $ a $ und $ b $ haben, können wir die "beste" Geradenformel ausdrücken, die $ E $ (= minimaler Fehler) wie folgt minimiert. Die ursprüngliche Formel für die gerade Linie lautet also $ y = ax + b $
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})
Ich konnte es ausdrücken!
Der Punkt ist, dass Sie dies von Hand berechnen können, es ist nicht erstaunlich, aber die obige Formel kann nur mit den Daten berechnet werden, die Sie jetzt haben (in diesem Beispiel die Daten von Temperatur und Umsatz) ** Das ist der Punkt.
Mit scikit-learn wird es in einem Schuss berechnet, aber ich denke, es ist sehr wichtig zu verstehen, dass diese Art der Berechnung hinter den Kulissen erfolgt. Zuerst habe ich lange gebraucht, um die Abfolge der Schritte bis zu diesem Punkt zu verstehen. Es mag zunächst schwierig sein, aber ich hoffe, jeder kann seine Hände zusammen bewegen.
Handberechnete $ 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}) $ Für einige der darin enthaltenen Formeln gilt Folgendes.
Annahmen
$ \ bar {xy} - \ bar {x} \ bar {y} = σ_ {xy} $ * Aus der Kovarianzformel
$ \ bar {x ^ 2} - \ bar {x} ^ 2 = σ_x ^ 2 $ * Aus der Dispersionsformel
Fazit
y = \frac{σ_{xy}}{σ_x^2}x + (\bar{y} - \frac{σ_{xy}}{σ_x^2}\bar{x})
Es kann auch wie oben geschrieben werden.
Wie war es? Mein Gedanke ist: "Ich kann nicht interpretieren, selbst wenn mir von Anfang an ein sehr komplizierter Code angezeigt wird. Daher ist mir die Genauigkeit kein einziges Mal wichtig. Deshalb werde ich versuchen, eine grundlegende Reihe von Flows mit Scicit-Learn usw. zu implementieren." Ich finde es sehr wichtig.
Sobald ich mich daran gewöhnt habe, halte ich es jedoch für sehr wichtig zu verstehen, wie sie hinter den Kulissen mit mathematischem Hintergrund funktionieren.
Ich denke, es gibt viele Inhalte, die schwer zu verstehen sind, aber ich hoffe, es hilft, mein Verständnis zu vertiefen.
Recommended Posts