Schritt für Schritt zur Theorie, Implementierung in Python und Analyse mit scikit-learn über den Algorithmus, der zuvor in "Klassifikation des maschinellen Lernens" verwendet wurde. Ich werde mit lernen. Ich schreibe es zum persönlichen Lernen, daher möchte ich, dass Sie alle Fehler übersehen.
Diesmal ist die grundlegende "Einzelregressionsanalyse". Ich habe auf die nächste Seite verwiesen.
Eine gerade Linie in der Ebene, die aus der $ x $ -Achse und der $ y $ -Achse besteht, wird als
Pythons Scikit-Learn enthält mehrere Testdatensätze. Dieses Mal werden wir Diabetes (Diabetesdaten) unter ihnen verwenden. Sie können den Code in Google Colaboratory ausprobieren.
Schauen Sie sich zunächst die Testdaten an.
Eine ausführliche Erklärung finden Sie in der API-Dokumentation, jedoch für 10 Daten Ziele (Fortschritt nach einem Jahr) werden vorbereitet.
Schauen wir uns an, wie sich die BMI-Daten auf die 10 Elemente in einem Streudiagramm auswirken. Ich werde darauf eingehen, warum BMI.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
diabetes = datasets.load_diabetes()
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
x = df['bmi']
y = diabetes.target
plt.scatter(x, y)
Die horizontale Achse ist BMI und die vertikale Achse ist Fortschritt. Wenn Sie sich die Abbildung ansehen, können Sie eine gerade Linie zeichnen, die nach rechts steigt.
Für eine gegebene $ N $ Anzahl von $ (x, y) $ Spalten sind die Parameter $ A $ und $ B $ zum Zeichnen einer schönen geraden Linie die gerade Linie $ y = Ax + B $ und $ i $ th Sie können $ A $ und $ B $ finden, die die Summe der Quadrate der Differenz zwischen $ (x_i, y_i) $ minimieren. Mit anderen Worten, finden Sie $ A $ und $ B
Insbesondere wird die obige Gleichung teilweise durch $ A $ und $ B $ unterschieden, um die simultanen Gleichungen zu lösen, aber ich werde sie weglassen. Ich denke, Sie sollten auf jeden Fall versuchen, mit Papier und Bleistift zu schreiben. Wenn $ \ sum_ {i = 1} ^ {N} x_i $ durch $ n \ bar {x} $ dargestellt wird und $ \ sum_ {i = 1} ^ {N} y_i $ durch $ n \ bar {y} $ dargestellt wird $ A $ und $ B $ sind
Sie können $ A $ und $ B $ gehorsam codieren, aber numpy hat bereits eine nützliche Funktion. Verwenden Sie diese. Der Nenner von $ A $ ist die Varianz der Spalte $ x $ ($ 1 / n $), und das Molekül ist die Kovarianz der Spalten $ x $ und $ y $ ($ 1 / n $).
S_xx = np.var(x, ddof=1)
S_xy = np.cov(np.array([x, y]))[0][1]
A = S_xy / S_xx
B = np.mean(y) - A * np.mean(x)
print("S_xx: ", S_xx)
print("S_xy: ", S_xy)
print("A: ", A)
print("B: ", B)
Das Ergebnis ist wie folgt. Es ist zu beachten, dass die Varianz (var) in Probendispersion und unverzerrte Dispersion unterteilt ist, und da Scikit-Learn, das später beschrieben wird, unverzerrte Dispersion ist, wird sie durch unverzerrte Dispersion berechnet. Die Probendispersion und die unverzerrte Dispersion werden getrennt beschrieben.
S_xx: 0.0022675736961455507
S_xy: 2.1529144226397467
A: 949.43526038395
B: 152.1334841628967
Tatsächlich ist np.cov [0] [0] die Verteilung von x, so dass es nicht notwendig ist, es zu berechnen, aber es wird wie oben zum Verständnis gemacht. Zeichnen wir die hier erhaltene gerade Linie im Streudiagramm.
plt.scatter(df['bmi'], diabetes.target)
plt.plot(df['bmi'], A*df['bmi']+B, color='red')
Wenn Sie sich das resultierende Diagramm ansehen, können Sie sehen, dass irgendwie eine schöne gerade Linie gezeichnet wird.
Dasselbe mit scicit-learn zu tun, macht es noch einfacher. Sie können sehen, dass es irgendwie verwendet werden kann, aber können Sie verstehen, dass Sie völlig hungrig sind, wenn Sie es nach dem Verständnis der Theorie verwenden.
from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()
model_lr.fit(x.to_frame(), y)
Nur das. Es scheint, dass das erste Argument der fit-Methode nur pandas.DataFrame akzeptiert. Daher muss es mit to_frame (Referenz in DataFrame erzwungen werden. A7% E5% 8D% 98% E5% 9B% 9E% E5% B8% B0% E5% 88% 86% E6% 9E% 90% E3% 82% 92% E8% A1% 8C% E3% 81% 86% E6% 96% B9% E6% B3% 95-f6baa2cb761e)).
Da die Steigung und der Abschnitt coef_ bzw. intercept_ sind (siehe API) (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression)) Vergleichen wir es mit dem vorherigen Ergebnis.
print("coef_: ", model_lr.coef_[0])
print("intercept: ", model_lr.intercept_)
coef_: 949.4352603839491
intercept: 152.1334841628967
Du hast das gleiche Ergebnis.
Der Korrelationskoeffizient R ist ein Koeffizient, der angibt, wie stark die beiden Variablen zusammenhängen (wie stark sie sich gegenseitig beeinflussen) und eine Zahl von -1 bis 1 annimmt. Der Korrelationskoeffizient $ r $ ist der Wert, der durch Teilen der Kovarianz von $ x $ und $ y $ durch ihre jeweiligen Standardabweichungen erhalten wird, und wird durch die Corrcoef-Methode in Numpy erhalten.
r = S_xy/(x.std(ddof=1)*y.std(ddof=1))
rr = np.corrcoef(x, y)[0][1]
0.5864501344746891
0.5864501344746891
Dies ist auch der gleiche Wert. Je höher der Wert, desto stärker ist die Relevanz jedes einzelnen.
Der Bestimmungskoeffizient ist ein Index dafür, wie gut die erhaltene Gerade mit den tatsächlichen Daten übereinstimmt. Je näher sie an 1 liegt, desto näher liegt sie an den Originaldaten.
Der Bestimmungskoeffizient kann basierend auf den Werten der Gesamtvariation und der Restvariation erhalten werden und ist gleich dem Quadrat des Korrelationskoeffizienten. Einzelheiten finden Sie unter hier.
Der Entscheidungskoeffizient wird durch die Bewertungsmethode der LinearRegression-Klasse erhalten.
R = model_lr.score(x.to_frame(), y)
print("R: ", R)
print("r^2: ", r**2)
R: 0.3439237602253803
r^2: 0.3439237602253809
Es wird gleich sein.
Für eine einfache Regressionsanalyse habe ich die Python-Implementierung ausprobiert, während ich die Theorie überprüft habe. Ich denke, Sie können verstehen, wie man eine Regressionslinie zeichnet und wie sehr die erhaltene Linie die Originaldaten darstellt. Übrigens habe ich BMI als Ziel gewählt, weil es den höchsten Korrelationskoeffizienten hatte. Ich möchte darüber schreiben, wie man das überprüft.
Recommended Posts