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.
In einer einfachen Regressionsanalyse haben wir $ A $ und $ B $ gefunden, um die ungefähren Geraden
Mit anderen Worten, wenn die Formel der geraden Linie
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
\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 $
\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} $.
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.
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.
Die Formel zum Finden von $ \ boldsymbol {w} $ lautete wie folgt. Es scheint eine normale Gleichung zu sein.
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
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.
Ü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.
Die Min-Max-Skalierung transformiert den Minimalwert in -1 und den Maximalwert in 1. Das heißt, es berechnet
Die Standardisierung transformiert den Mittelwert in 0 und die Varianz in 1. Das heißt, es berechnet
Es wird ausführlich auf der folgenden Seite beschrieben.
Ich habe versucht, mit Python zu rechnen, aber es ergab keinen Sinn, da die Diabetesdaten von scicit-learn bereits normalisiert zu sein scheinen.
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.
Wir haben uns von einer einfachen Regression zu einer multiplen Regression entwickelt. Normale Gleichung
Jetzt verstehen Sie die lineare Approximation.
Recommended Posts