[PYTHON] Algorithmus für maschinelles Lernen (Einzelregressionsanalyse)

Einführung

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.

Basic

Eine gerade Linie in der Ebene, die aus der $ x $ -Achse und der $ y $ -Achse besteht, wird als $ y = Axe + B $ dargestellt. $ A $ ist eine Steigung und $ B $ wird auch als Abschnitt bezeichnet. Eine einfache Regression besteht darin, $ A $ und $ B $ zu finden, um eine schöne gerade Linie für viele Kombinationen von $ x $ und $ y $ zu ziehen. Menschen können irgendwie eine gerade Linie wie "Ist es so?" Zeichnen, aber es ist ein Ansatz, den Computer dies zeichnen zu lassen.

Thema

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.

Vorbereitung

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. bmi_vs_target_1.png

Wie man eine einfache Regression löst

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 , die $ \ sum_ {i = 1} ^ {N} (y_i- (Ax + B)) ^ 2 $$ minimieren.

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 $ A = \ frac {\ sum_ {i = 1} ^ {n} (x_i- \ bar {x}) (y_i- \ bar {y})} {\ sum_ { i = 1} ^ {n} (x_i- \ bar {x}) ^ 2} $ $ B = \ bar {y} -A \ bar {x} $. Wenn Sie zu diesem Zeitpunkt das angegebene $ (x_i, y_i) $ in die obige Formel einfügen, können Sie $ A $ und $ B $ leicht finden.

Lassen Sie es uns ehrlich mit Python implementieren.

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.

Da war

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.

bmi_vs_target_2.png

Machen Sie dasselbe mit scicit-learn

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.

Weiteres Verständnis (Korrelationskoeffizient R und Bestimmungskoeffizient R2)

Korrelationskoeffizient

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.

Entscheidungskoeffizient

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.

Zusammenfassung

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

Algorithmus für maschinelles Lernen (Einzelregressionsanalyse)
Algorithmus für maschinelles Lernen (multiple Regressionsanalyse)
Maschinelles Lernen mit Python (2) Einfache Regressionsanalyse
Algorithmus für maschinelles Lernen (einfaches Perzeptron)
Algorithmus für maschinelles Lernen (logistische Regression)
Python Scikit-learn Lineare Regressionsanalyse Nichtlineare einfache Regressionsanalyse Maschinelles Lernen
Algorithmus für maschinelles Lernen (Zusammenfassung und Regularisierung der linearen Regression)
[Maschinelles Lernen] Regressionsanalyse mit Scicit Learn
Logistische Regression beim maschinellen Lernen
Lineare Regression des maschinellen Lernens
Maschinelles Lernen: Überwacht - Lineare Regression
Verstehe maschinelles Lernen ~ Ridge Regression ~.
Einfache Regressionsanalyse mit Python
Überwachtes maschinelles Lernen (Klassifikation / Regression)
Algorithmus für maschinelles Lernen (Support Vector Machine)
Stapelvorlage für maschinelles Lernen (Rückgabe)
2. Multivariate Analyse in Python 1-2. Einfache Regressionsanalyse (Algorithmus)
<Kurs> Maschinelles Lernen Kapitel 6: Algorithmus 2 (k-Mittel)
Anfänger des maschinellen Lernens versuchen eine lineare Regression
Klassifikation und Regression beim maschinellen Lernen
Maschinelles Lernen
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 7 Regressionsanalyse
Algorithmus für maschinelles Lernen (Gradientenabstiegsmethode)
Einfache Implementierung einer Regressionsanalyse mit Keras
Maschinelles Lernen: Überwacht - Lineare Diskriminanzanalyse
[Maschinelles Lernen] Verstehen der linearen einfachen Regression sowohl aus Scikit-Lernen als auch aus Mathematik
Scikit lernen Algorithmus Spickzettel
[Maschinelles Lernen] Regressionsanalyse mit Scicit Learn
<Subjekt> Maschinelles Lernen Kapitel 3: Logistisches Regressionsmodell
Algorithmus für maschinelles Lernen (Implementierung einer Klassifizierung mit mehreren Klassen)
<Kurs> Maschinelles Lernen Kapitel 1: Lineares Regressionsmodell
[Python] Erste Datenanalyse / maschinelles Lernen (Kaggle)
Zusammenfassung der Klassifizierung und Implementierung von Algorithmen für maschinelles Lernen
<Kurs> Maschinelles Lernen Kapitel 4: Hauptkomponentenanalyse
<Kurs> Maschinelles Lernen Kapitel 2: Nichtlineares Regressionsmodell
Aktienkursprognose mit maschinellem Lernen (Return Edition)
Vorverarbeitung beim maschinellen Lernen 1 Datenanalyseprozess
Wörterbuch-Lernalgorithmus
Poisson-Regressionsanalyse
Methode der Regressionsanalyse
[Memo] Maschinelles Lernen
Klassifikation des maschinellen Lernens
Beispiel für maschinelles Lernen
Eine Geschichte über einfaches maschinelles Lernen mit TensorFlow
Gaußscher EM-Algorithmus mit gemischtem Modell [statistisches maschinelles Lernen]
Grundlagen des Lernens mit einem Lehrer Teil 1 - Einfache Regression - (Hinweis)
EV3 x Python Maschinelles Lernen Teil 2 Lineare Regression
[Python] Datenanalyse, maschinelles Lernen (Kaggle) -Datenvorverarbeitung-
Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
Geschichte rund um die Datenanalyse durch maschinelles Lernen
2. Multivariate Analyse in Python 1-1. Einfache Regressionsanalyse (Scikit-Learn)
Maschinelles Lernen Über Overlearning
Maschinelles Lernen ⑤ AdaBoost-Zusammenfassung
Maschinelles Lernen: Betreut --AdaBoost
Coursera-Herausforderungen beim maschinellen Lernen in Python: ex2 (Logistic Return)
Maschinelles Lernen unterstützt Vektormaschine
Berechnen Sie den Regressionskoeffizienten der einfachen Regressionsanalyse mit Python
Maschinelles Lernen studieren ~ matplotlib ~
Memo zum Kurs für maschinelles Lernen
Bibliothek für maschinelles Lernen dlib
Maschinelles Lernen (TensorFlow) + Lotto 6