Pas à pas sur la théorie, l'implémentation en python et l'analyse à l'aide de scikit-learn sur l'algorithme précédemment repris dans "Classification of Machine Learning" J'étudierai avec. Je l'écris pour un apprentissage personnel, alors j'aimerais que vous oubliez toute erreur.
Cette fois, j'aimerais développer une analyse de régression simple et faire une «analyse de régression multiple». Je me suis référé à la page suivante.
Dans une analyse de régression simple, nous avons trouvé $ A $ et $ B $ pour soustraire les droites approximatives
En d'autres termes, si la formule de la ligne droite est
À partir de maintenant, ce sera presque comme l'article auquel j'ai fait référence, mais j'essaierai de l'écrire aussi facilement que possible.
Si la formule de la droite se présente sous la forme d'une matrice,
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} $ non pertinents sont les constantes, donc $ \ boldsymbol {X} ^ {T} \ boldsymbol {X} = A $, $ -2 \ boldsymbol {y} ^ {T} \ boldsymbol { Si X} = B $, $ \ boldsymbol {y} ^ {T} \ boldsymbol {y} = C $, la somme minimale des carrés $ L $ est
\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}
Je veux que ce soit 0, donc
\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} \\
Cette forme est une forme d'équations linéaires simultanées, et les équations simultanées ne peuvent être résolues que si $ \ boldsymbol {X} ^ {T} \ boldsymbol {X} $ est régulier. Ce n'est pas régulier s'il y a une forte corrélation dans certains $ x $, c'est-à-dire si l'une des colonnes de données peut expliquer l'autre. Cet état est appelé ** multicollinéarité **, communément appelée multicollinéarité.
En supposant que c'est régulier
(\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}
Vous avez maintenant $ \ boldsymbol {w} $.
Les données utilisent les données scikit-learn sur le diabète (diabète). Voyons comment les données cibles (progression après un an) et IMC, S5 (ltg: lamotriogine) sont liées.
Tout d'abord, essayez de tracer les données. Puisqu'il y a deux variables explicatives et la cible, cela devient des données 3D. Les graphiques ne sont pas dessinés au-delà de 3 dimensions.
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()
Le résultat est le graphique suivant, qui ressemble à une pente.
La formule pour trouver $ \ boldsymbol {w} $ était la suivante. Cela semble être appelé une équation normale.
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
résultat:[152.13348416 675.06977443 614.95050478]
Le calcul de la matrice de python est intuitif et agréable. Soit dit en passant, s'il y a une variable explicative, le résultat est le même que la régression simple. Il est naturel car généralisé à n variables explicatives.
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]
Trouvons un graphique basé sur les valeurs calculées lorsqu'il y a deux variables explicatives.
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()
Le résultat est illustré dans la figure ci-dessous. Je n'arrive pas à pouvoir le faire correctement w
Evaluons le degré de coïncidence des plans avec un coefficient de détermination. Pour le coefficient de détermination $ R ^ 2 $, il faut obtenir «variation totale» et «variation de retour».
Le coefficient de détermination détermine dans quelle mesure la variable explicative explique la variable objective, c'est-à-dire «combien la variation de régression est par rapport à la variation totale». Utilisation de la somme des carrés (dispersion) de la variation totale et de la variation de régression
R^2=\frac{\sum_{i=0}^{N}(\hat{y}_i-\bar{y})^2}{\sum_{i=0}^{N}(y_i-\bar{y})^2}
Puisque la variation totale est la somme de la variation de régression et de la variation de différence totale (valeur prédite et valeur mesurée),
R^2=1-\frac{\sum_{i=0}^{N}(y_i-\hat{y}_i)^2}{\sum_{i=0}^{N}(y_i-\bar{y})^2}
Écrivez ceci en python et calculez le coefficient de décision.
u = ((y-(X @ w))**2).sum()
v = ((y-y.mean())**2).sum()
R2 = 1-u/v
print(R2)
0.4594852440167805
Le résultat était que.
En passant, dans cet exemple, les valeurs de "BMI" et "ltg" sont utilisées, mais si le nombre de variables augmente, par exemple, le nombre de $ 10 ^ 5 $ order et les données de $ 10 ^ {-5} $ order peuvent être mélangés. Il y a aussi le sexe. Si cela se produit, le calcul peut ne pas fonctionner. L'alignement des données tout en préservant les données d'origine s'appelle la normalisation.
La mise à l'échelle Min-Max transforme la valeur minimale en -1 et la valeur maximale en 1. Autrement dit, il calcule
La standardisation transforme la moyenne en 0 et la variance en 1. Autrement dit, il calcule
Il est écrit en détail sur la page suivante.
J'ai essayé de calculer avec python, mais cela n'avait aucun sens car les données sur le diabète de scicit-learn semblent avoir déjà été normalisées.
Pour la régression multiple, utilisez LinearRegression de scikit-learn et ajustez simplement les données d'entraînement.
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
Seulement ça. Le résultat est le même que le résultat sans scikit-learn.
Nous sommes passés d'une simple régression à une régression multiple. Équation normale
Vous comprenez maintenant l'approximation linéaire.