[PYTHON] Algorithmus für maschinelles Lernen (multiple Regressionsanalyse)

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.

Dieses Mal möchte ich eine einfache Regressionsanalyse entwickeln und eine "multiple Regressionsanalyse" durchführen. Ich habe auf die nächste Seite verwiesen.

Basic

In einer einfachen Regressionsanalyse haben wir $ A $ und $ B $ gefunden, um die ungefähren Geraden $ y = Ax + B $ für $ N $ $ (x, y) $ in der Ebene zu subtrahieren. Insbesondere ist die Summe der Quadrate der Differenz zwischen der geraden Linie und dem $ i $ -ten Punkt $ \ sum_ {i = 1} ^ {N} (y_i- (Ax + B)) ^ 2 $ die kleinste. Ich bat um $ A $ und $ B $. Bei der multiplen Regression wird der Koeffizient ermittelt, wenn die Variable (erklärende Variable), die bei der einfachen Regression eins war, erhöht wird.

Mit anderen Worten, wenn die Formel der geraden Linie $ y = w_0x_0 + w_1x_1 + \ cdots + w_nx_n $ ($ x_0 = 1 $) lautet, sollte $ (w_0, w_1, \ cdots, w_n) $ erhalten werden. Werden.

So lösen Sie multiple Regression

Von hier an wird es fast wie der Artikel sein, auf den ich mich bezogen habe, aber ich werde versuchen, ihn so einfach wie möglich zu schreiben.

Wenn die Formel der geraden Linie die Form einer Matrix hat,

y = \begin{bmatrix} w_0 \\ w_1 \\ w_2 \\ \vdots \\ w_n \end{bmatrix} \begin{bmatrix} x_0, x_1, x_2, \cdots, x_n\end{bmatrix}

($ X_0 = 1 ). Die Summe der Quadrate der Differenz zum gemessenen Wert $ hat {y} $ ist $ \ sum_ {i = 1} ^ {n} (y- \ hat {y}) ^ 2 $. Transformieren Sie dies also Gehen. Beachten Sie, dass $ (w_0, w_1, \ cdots, w_n) $ $ \ boldsymbol {w} $ ist und alle erklärenden Variablen die Matrix $ \ boldsymbol {X} $ sind.

\sum_{i=1}^{n}(y-\hat{y})^2 \\
= (\boldsymbol{y}-\hat{\boldsymbol{y}})^{T}(\boldsymbol{y}-\hat{\boldsymbol{y}}) \\
= (\boldsymbol{y}-\boldsymbol{Xw})^{T}(\boldsymbol{y}-\boldsymbol{Xw}) \\
= (\boldsymbol{y}^{T}-(\boldsymbol{Xw})^{T})(\boldsymbol{y}-\boldsymbol{Xw}) \\
= (\boldsymbol{y}^{T}-\boldsymbol{w}^{T}\boldsymbol{X}^{T})(\boldsymbol{y}-\boldsymbol{Xw}) \\
= \boldsymbol{y}^{T}\boldsymbol{y}-\boldsymbol{y}^{T}\boldsymbol{X}\boldsymbol{w}-\boldsymbol{w}^{T}\boldsymbol{X}^{T}\boldsymbol{y}-\boldsymbol{w}^{T}\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{w} \\
= \boldsymbol{y}^{T}\boldsymbol{y}-2\boldsymbol{y}^{T}\boldsymbol{X}\boldsymbol{w}-\boldsymbol{w}^{T}\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{w}

$ \ Boldsymbol {w} $ irrelevant ist eine Konstante, also $ \ boldsymbol {X} ^ {T} \ boldsymbol {X} = A $, $ -2 \ boldsymbol {y} ^ {T} \ boldsymbol { Wenn X} = B $, $ \ boldsymbol {y} ^ {T} \ boldsymbol {y} = C $, ist die minimale Summe der Quadrate $ L $ $ L = CB \ boldsymbol {w} - \ boldsymbol { w} ^ {T} A \ boldsymbol {w} $. Da $ L $ eine quadratische Funktion von $ \ boldsymbol {w} $ ist, ist $ \ boldsymbol {w} $, das $ L $ minimiert, eine teilweise Differenzierung von $ L $ durch $ \ boldsymbol {w} $. Sie müssen nur das $ \ boldsymbol {w} $ finden, das den Ausdruck 0 macht.

\begin{split}\begin{aligned}
\frac{\partial}{\partial {\boldsymbol{w}}} L
&= \frac{\partial}{\boldsymbol{w}} (C + B\boldsymbol{w} + \boldsymbol{w}^T{A}\boldsymbol{w}) \\
&=\frac{\partial}{\partial {\boldsymbol{w}}} (C) + \frac{\partial}{\partial {\boldsymbol{w}}} ({B}{\boldsymbol{w}}) + \frac{\partial}{\partial {\boldsymbol{w}}} ({\boldsymbol{w}}^{T}{A}{\boldsymbol{w}}) \\
&={B} + {w}^{T}({A} + {A}^{T})
\end{aligned}\end{split}

Ich möchte, dass dies 0 ist

\boldsymbol{w}^T(A+A^T)=-B \\
\boldsymbol{w}^T(\boldsymbol{X}^{T}\boldsymbol{X}+(\boldsymbol{X}^{T}\boldsymbol{X})^T)=2\boldsymbol{y}^{T}\boldsymbol{X} \\
\boldsymbol{w}^T\boldsymbol{X}^{T}\boldsymbol{X}=\boldsymbol{y}^T\boldsymbol{X} \\
\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{w} = \boldsymbol{X}^T\boldsymbol{y} \\

Diese Form ist eine Form simultaner linearer Gleichungen, und die simultanen Gleichungen können nur gelöst werden, wenn $ \ boldsymbol {X} ^ {T} \ boldsymbol {X} $ regulär ist. Es ist nicht regelmäßig, wenn in einigen $ x $ eine starke Korrelation besteht, dh wenn eine der Datenspalten die andere erklären kann. Dieser Zustand wird als ** Multikollinearität ** bezeichnet und ist allgemein als Multikollinearität bekannt.

Vorausgesetzt, es ist regelmäßig

(\boldsymbol{X}^{T}\boldsymbol{X})^{-1}\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{w}=(\boldsymbol{X}^{T}\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y} \\
\boldsymbol{w}=(\boldsymbol{X}^{T}\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y}

Jetzt haben Sie $ \ boldsymbol {w} $.

Versuchen Sie es ehrlich mit Python zu implementieren

Die Daten verwenden Scikit-Learn-Diabetes-Daten (Diabetes). Lassen Sie uns herausfinden, wie das Ziel (Fortschritt nach einem Jahr) mit den BMI- und S5-Daten (ltg: Lamotriogin) zusammenhängt.

Schauen Sie sich zuerst die Daten an

Versuchen Sie zunächst, die Daten zu zeichnen. Da es zwei erklärende Variablen und das Ziel gibt, werden daraus 3D-Daten. Diagramme werden nicht über 3 Dimensionen hinaus gezeichnet.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns

%matplotlib inline

diabetes = datasets.load_diabetes()

df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)

fig=plt.figure()
ax=Axes3D(fig)

x1 = df['bmi']
x2 = df['s5']
y = diabetes.target

ax.scatter3D(x1, x2, y)
ax.set_xlabel("x1")
ax.set_ylabel("x2")
ax.set_zlabel("y")

plt.show()

Das Ergebnis ist das folgende Diagramm, das wie eine Steigung aussieht.

regression_multi_1.png

Versuche zu berechnen

Die Formel zum Finden von $ \ boldsymbol {w} $ lautete wie folgt. Es scheint eine normale Gleichung zu sein. $ \ boldsymbol {w} = (\ boldsymbol {X} ^ {T} \ boldsymbol {X}) ^ {-1} \ boldsymbol {X} ^ T \ boldsymbol {y} $ Versuchen Sie, dies so zu codieren, wie es ist Ich werde.

X = pd.concat([pd.Series(np.ones(len(df['bmi']))), df.loc[:,['bmi','s5']]], axis=1, ignore_index=True).values
y = diabetes.target

w = np.linalg.inv(X.T @ X) @ X.T @ y

Ergebnis:[152.13348416 675.06977443 614.95050478]

Die Matrixberechnung von Python ist intuitiv und nett. Übrigens, wenn es eine erklärende Variable gibt, ist das Ergebnis dasselbe wie eine einfache Regression. Es ist natürlich, weil es mit n erklärenden Variablen verallgemeinert wurde.

X = pd.concat([pd.Series(np.ones(len(df['bmi']))), df.loc[:,['bmi']]], axis=1, ignore_index=True).values
y = diabetes.target

w = np.linalg.inv(X.T @ X) @ X.T @ y
print(w)

[152.13348416 949.43526038]

Zeichnen wir ein Diagramm basierend auf den berechneten Werten, wenn zwei erklärende Variablen vorhanden sind.

fig=plt.figure()
ax=Axes3D(fig)

mesh_x1 = np.arange(x1.min(), x1.max(), (x1.max()-x1.min())/20)
mesh_x2 = np.arange(x2.min(), x2.max(), (x2.max()-x2.min())/20)
mesh_x1, mesh_x2 = np.meshgrid(mesh_x1, mesh_x2)

x1 = df['bmi'].values
x2 = df['s5'].values
y = diabetes.target
ax.scatter3D(x1, x2, y)
ax.set_xlabel("x1")
ax.set_ylabel("x2")
ax.set_zlabel("y")

mesh_y = w[1] * mesh_x1 + w[2] * mesh_x2 + w[0]
ax.plot_wireframe(mesh_x1, mesh_x2, mesh_y, color='red')

plt.show()

Das Ergebnis ist in der folgenden Abbildung dargestellt. Ich kann es anscheinend nicht richtig machen w regression_multi_2.png

Auswertung

Lassen Sie uns den Übereinstimmungsgrad von Ebenen mit einem Bestimmungskoeffizienten bewerten. Für den Bestimmungskoeffizienten $ R ^ 2 $ ist es notwendig, "Gesamtvariation" und "Rücklaufvariation" zu erhalten.

Der Bestimmungskoeffizient bestimmt, wie stark die erklärende Variable die Zielvariable erklärt, dh "wie stark die Regressionsvariation relativ zur Gesamtvariation ist". Verwendung der Summe der Quadrate (Dispersion) der Gesamtvariation und der Regressionsvariation

R^2=\frac{\sum_{i=0}^{N}(\hat{y}_i-\bar{y})^2}{\sum_{i=0}^{N}(y_i-\bar{y})^2}

Da die Gesamtvariation die Summe der Regressionsvariation und der Gesamtdifferenzvariation (vorhergesagter Wert und gemessener Wert) ist,

R^2=1-\frac{\sum_{i=0}^{N}(y_i-\hat{y}_i)^2}{\sum_{i=0}^{N}(y_i-\bar{y})^2}

Schreiben Sie dies in Python und berechnen Sie den Entscheidungskoeffizienten.

u = ((y-(X @ w))**2).sum()
v = ((y-y.mean())**2).sum()

R2 = 1-u/v
print(R2)

0.4594852440167805

Das Ergebnis war das.

Normalisierung, Standardisierung

Übrigens werden in diesem Beispiel die Werte von "BMI" und "ltg" verwendet, aber wenn die Anzahl der Variablen zunimmt, können beispielsweise die Anzahl der $ 10 ^ 5 $ -Ordnung und die Daten der $ 10 ^ {-5} $ -Ordnung gemischt werden. Es gibt auch Sex. In diesem Fall funktioniert die Berechnung möglicherweise nicht. Das Ausrichten von Daten unter Beibehaltung der Originaldaten wird als Normalisierung bezeichnet.

Min-Max-Skalierung

Die Min-Max-Skalierung transformiert den Minimalwert in -1 und den Maximalwert in 1. Das heißt, es berechnet $ x_ {i_ {new}} = \ frac {x_i-x_ {min}} {x_ {max} -x_ {min}} $.

Standardisierung

Die Standardisierung transformiert den Mittelwert in 0 und die Varianz in 1. Das heißt, es berechnet $ x_ {i_ {new}} = \ frac {x_i- \ bar {x}} {\ sigma} $.

Es wird ausführlich auf der folgenden Seite beschrieben.

Versuchen Sie, mit Python zu standardisieren

Ich habe versucht, mit Python zu rechnen, aber es ergab keinen Sinn, da die Diabetesdaten von scicit-learn bereits normalisiert zu sein scheinen.

Versuchen Sie mit scikit-learn zu rechnen

Verwenden Sie für die mehrfache Regression LinearRegression von scikit-learn und passen Sie sie einfach an die Trainingsdaten an.

from sklearn import linear_model

clf = linear_model.LinearRegression()
clf.fit(df[['bmi', 's5']], diabetes.target)

print("coef: ", clf.coef_)
print("intercept: ", clf.intercept_)
print("score: ", clf.score(df[['bmi', 's5']], diabetes.target))

coef:  [675.06977443 614.95050478]
intercept:  152.1334841628967
score:  0.45948524401678054

Nur das. Das Ergebnis ist das gleiche wie das Ergebnis ohne Scikit-Lernen.

Zusammenfassung

Wir haben uns von einer einfachen Regression zu einer multiplen Regression entwickelt. Normale Gleichung $ \ boldsymbol {w} = (\ boldsymbol {X} ^ {T} \ boldsymbol {X}) ^ {-1} \ boldsymbol {X} ^ T \ boldsymbol {y} $ Ich konnte mich auf mehrere erklärende Variablen erstrecken. Da mehrere erklärende Variablen zusammen skaliert werden müssen, müssen sie mit einer einheitlichen Granularität unter Verwendung einer als Standardisierung bezeichneten Technik berechnet werden.

Jetzt verstehen Sie die lineare Approximation.

Recommended Posts

Algorithmus für maschinelles Lernen (multiple Regressionsanalyse)
Algorithmus für maschinelles Lernen (Einzelregressionsanalyse)
Algorithmus für maschinelles Lernen (logistische Regression)
Algorithmus für maschinelles Lernen (Verallgemeinerung der linearen Regression)
Maschinelles Lernen mit Python (2) Einfache Regressionsanalyse
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 ~.
Algorithmus für maschinelles Lernen (einfaches Perzeptron)
Überwachtes maschinelles Lernen (Klassifikation / Regression)
Algorithmus für maschinelles Lernen (Support Vector Machine)
Stapelvorlage für maschinelles Lernen (Rückgabe)
Python Scikit-learn Lineare Regressionsanalyse Nichtlineare einfache Regressionsanalyse Maschinelles Lernen
<Kurs> Maschinelles Lernen Kapitel 6: Algorithmus 2 (k-Mittel)
Algorithmus für maschinelles Lernen (Unterstützung von Vektor-Maschinenanwendungen)
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)
Maschinelles Lernen: Überwacht - Lineare Diskriminanzanalyse
[Maschinelles Lernen] Verstehen der linearen multiplen Regression sowohl aus Scikit-Lernen als auch aus Mathematik
<Subjekt> Maschinelles Lernen Kapitel 3: Logistisches Regressionsmodell
Ich habe eine multiple Regressionsanalyse mit Polypoly-Regression versucht
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
[scikit-learn, matplotlib] Multiple Regressionsanalyse und 3D-Zeichnung
Gaußscher EM-Algorithmus mit gemischtem Modell [statistisches maschinelles Lernen]
EV3 x Python Maschinelles Lernen Teil 2 Lineare Regression
[Python] Datenanalyse, maschinelles Lernen (Kaggle) -Datenvorverarbeitung-
Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
Erstellen Sie ein Multi-Output-Modell für die Regressionsanalyse [Anfänger]
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Grundlagen des Lernens mit einem Lehrer Teil 3 - Multiple Regression (Implementierung) - (Anmerkungen) -
Zusammenfassung des Lernprogramms für maschinelles Lernen
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
Maschinelles Lernen studieren ~ matplotlib ~
Memo zum Kurs für maschinelles Lernen
Bibliothek für maschinelles Lernen dlib
Maschinelles Lernen (TensorFlow) + Lotto 6
Coursera Machine Learning Challenge in Python: ex1 (lineare Regression)