[PYTHON] Algorithme d'apprentissage automatique (analyse de régression multiple)

introduction

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.

De base

Dans une analyse de régression simple, nous avons trouvé $ A $ et $ B $ pour soustraire les droites approximatives $ y = Ax + B $ pour $ N $ $ (x, y) $ sur le plan. Plus précisément, la somme des carrés de la différence entre la ligne droite et le $ i $ ème point est $ \ sum_ {i = 1} ^ {N} (y_i- (Ax + B)) ^ 2 $ est le plus petit. J'ai demandé $ A $ et $ B $. La régression multiple consiste à trouver le coefficient lorsque la variable (variable explicative) qui était une en régression simple est augmentée.

En d'autres termes, si la formule de la ligne droite est $ y = w_0x_0 + w_1x_1 + \ cdots + w_nx_n $ ($ x_0 = 1 $), alors $ (w_0, w_1, \ cdots, w_n) $ doit être obtenu. Devenir.

Comment résoudre la régression multiple

À 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 ). La somme des carrés de la différence par rapport à la valeur mesurée $ hat {y} $ est $ \ sum_ {i = 1} ^ {n} (y- \ hat {y}) ^ 2 $, alors transformez ceci Aller. Notez que $ (w_0, w_1, \ cdots, w_n) $ est $ \ boldsymbol {w} $, et toutes les variables explicatives sont la matrice $ \ boldsymbol {X} $.

\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 $ L = CB \ boldsymbol {w} - \ boldsymbol { w} ^ {T} Un \ boldsymbol {w} $. Puisque $ L $ est une fonction quadratique de $ \ boldsymbol {w} $, $ \ boldsymbol {w} $, qui minimise $ L $, est une différenciation partielle de $ L $ par $ \ boldsymbol {w} $. Il vous suffit de trouver le $ \ boldsymbol {w} $ qui rend l'expression 0.

\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} $.

Essayez de l'implémenter honnêtement avec python

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.

Premier regard sur les donné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.

regression_multi_1.png

Essayez de calculer

La formule pour trouver $ \ boldsymbol {w} $ était la suivante. Cela semble être appelé une équation normale. $ \ boldsymbol {w} = (\ boldsymbol {X} ^ {T} \ boldsymbol {X}) ^ {-1} \ boldsymbol {X} ^ T \ boldsymbol {y} $ Essayez de coder ceci tel quel Je vais.

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

Évaluation

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.

Normalisation, standardisation

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.

Mise à l'échelle Min-Max

La mise à l'échelle Min-Max transforme la valeur minimale en -1 et la valeur maximale en 1. Autrement dit, il calcule $ x_ {i_ {new}} = \ frac {x_i-x_ {min}} {x_ {max} -x_ {min}} $.

Standardisation

La standardisation transforme la moyenne en 0 et la variance en 1. Autrement dit, il calcule $ x_ {i_ {new}} = \ frac {x_i- \ bar {x}} {\ sigma} $.

Il est écrit en détail sur la page suivante.

Essayez de standardiser avec python

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.

Essayez de calculer avec scikit-learn

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.

Résumé

Nous sommes passés d'une simple régression à une régression multiple. Équation normale $ \ boldsymbol {w} = (\ boldsymbol {X} ^ {T} \ boldsymbol {X}) ^ {-1} \ boldsymbol {X} ^ T \ boldsymbol {y} $ J'ai pu m'étendre à plusieurs variables explicatives. Puisque plusieurs variables explicatives doivent être mises à l'échelle, elles doivent être calculées avec une technique appelée standardisation.

Vous comprenez maintenant l'approximation linéaire.

Recommended Posts

Algorithme d'apprentissage automatique (analyse de régression multiple)
Algorithme d'apprentissage automatique (analyse de régression unique)
Algorithme d'apprentissage automatique (régression logistique)
Algorithme d'apprentissage automatique (généralisation de la régression linéaire)
Apprentissage automatique avec python (2) Analyse de régression simple
Algorithme d'apprentissage automatique (résumé de régression linéaire et régularisation)
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
Régression logistique d'apprentissage automatique
Régression linéaire d'apprentissage automatique
Machine Learning: Supervision - Régression linéaire
Comprendre l'apprentissage automatique ~ régression de crête ~.
Algorithme d'apprentissage automatique (perceptron simple)
Machine learning supervisé (classification / régression)
Algorithme d'apprentissage automatique (machine vectorielle de support)
Modèle d'empilage d'apprentissage automatique (retour)
Python Scikit-learn Analyse de régression linéaire Analyse de régression simple non linéaire Apprentissage automatique
<Course> Machine learning Chapitre 6: Algorithme 2 (k-means)
Algorithme d'apprentissage automatique (prise en charge de l'application de machine vectorielle)
Les débutants en apprentissage automatique essaient la régression linéaire
Classification et régression dans l'apprentissage automatique
Apprentissage automatique
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 7 Analyse de régression
Algorithme d'apprentissage automatique (méthode de descente de gradient)
Apprentissage automatique: analyse discriminante linéaire supervisée
[Apprentissage automatique] Comprendre la régression multiple linéaire à partir de scikit-learn et des mathématiques
<Subject> Machine learning Chapitre 3: Modèle de régression logistique
J'ai essayé l'analyse de régression multiple avec régression polypoly
Algorithme d'apprentissage automatique (implémentation de la classification multi-classes)
<Cours> Machine learning Chapitre 1: Modèle de régression linéaire
[Python] Première analyse de données / apprentissage automatique (Kaggle)
Résumé de la classification et de la mise en œuvre des algorithmes d'apprentissage automatique
<Cours> Machine learning Chapitre 4: Analyse des principaux composants
<Cours> Machine learning Chapitre 2: Modèle de régression non linéaire
Prévision du cours des actions à l'aide de l'apprentissage automatique (édition de retour)
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
Algorithme d'apprentissage du dictionnaire
Analyse de régression de Poisson
Méthode d'analyse de régression
[Memo] Apprentissage automatique
Classification de l'apprentissage automatique
Exemple d'apprentissage automatique
[scikit-learn, matplotlib] Analyse de régression multiple et dessin 3D
Algorithme EM modèle mixte gaussien [apprentissage automatique statistique]
EV3 x Python Machine Learning Partie 2 Régression linéaire
[Python] Analyse de données, pratique du machine learning (Kaggle) -Prétraitement des données-
Analyse de l'utilisation de l'espace partagé par l'apprentissage automatique
Créer un modèle à sorties multiples pour l’analyse de régression [Débutant]
Histoire de l'analyse de données par apprentissage automatique
Bases de l'apprentissage avec un enseignant Partie 3-Régression multiple (mise en œuvre) - (Notes) -
Résumé du didacticiel d'apprentissage automatique
Apprentissage automatique sur le surapprentissage
Apprentissage automatique ⑤ Résumé AdaBoost
Apprentissage automatique: supervisé - AdaBoost
Défis d'apprentissage automatique de Coursera en Python: ex2 (retour logistique)
Machine de vecteur de support d'apprentissage automatique
Étudier l'apprentissage automatique ~ matplotlib ~
Mémo du cours d'apprentissage automatique
Bibliothèque d'apprentissage automatique dlib
Apprentissage automatique (TensorFlow) + Lotto 6
Coursera Machine Learning Challenge en Python: ex1 (régression linéaire)