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, il s'agit de "l'analyse de régression simple" de base. Je me suis référé à la page suivante.
Une ligne droite sur le plan constituée de l'axe $ x $ et de l'axe $ y $ est représentée par
scikit-learn de python a plusieurs jeux de données de test. Cette fois, nous utiliserons le diabète (données sur le diabète) parmi eux. Vous pouvez essayer le code dans Google Colaboratory.
Tout d'abord, regardez les données de test.
Une explication détaillée peut être trouvée dans la documentation API pour 10 données. Les objectifs (progrès après un an) sont préparés.
Voyons comment les données IMC affectent les 10 éléments d'un diagramme de dispersion. Je vais aborder pourquoi l'IMC.
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)
L'axe horizontal est l'IMC et l'axe vertical est la progression. En regardant la figure, il semble que vous puissiez tracer une ligne droite qui monte vers la droite.
Pour un nombre $ N $ donné de colonnes $ (x, y) $, les paramètres $ A $ et $ B $ pour dessiner une belle ligne droite sont la ligne droite $ y = Ax + B $ et $ i $ th Vous pouvez trouver $ A $ et $ B $ qui minimisent la somme des carrés de la différence entre $ (x_i, y_i) $. En d'autres termes, trouvez $ A $ et $ B $ qui minimise
Plus précisément, l'équation ci-dessus est partiellement différenciée par $ A $ et $ B $ pour résoudre les équations simultanées, mais je vais l'omettre. Je pense que vous devriez absolument essayer d'écrire avec du papier et un crayon. Si $ \ sum_ {i = 1} ^ {N} x_i $ est représenté par $ n \ bar {x} $ et $ \ sum_ {i = 1} ^ {N} y_i $ est représenté par $ n \ bar {y} $ $ A $ et $ B $ sont
Vous pouvez coder $ A $ et $ B $ docilement, mais numpy a déjà une fonction utile, alors utilisez-la. Le dénominateur de $ A $ est la variance de la colonne $ x $ ($ 1 / n $), et la molécule est la covariance des colonnes $ x $ et $ 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)
Le résultat est le suivant. Notez que la variance (var) est divisée en dispersion d'échantillon et dispersion sans biais, et comme scikit-learn, qui sera décrit plus loin, est une dispersion sans biais, elle est calculée par dispersion sans biais. La dispersion de l'échantillon et la dispersion non biaisée seront décrites séparément.
S_xx: 0.0022675736961455507
S_xy: 2.1529144226397467
A: 949.43526038395
B: 152.1334841628967
En fait, np.cov [0] [0] est la distribution de x, il n'est donc pas nécessaire de la calculer, mais c'est fait comme ci-dessus pour la compréhension. Tracons la droite obtenue ici sur le diagramme de dispersion.
plt.scatter(df['bmi'], diabetes.target)
plt.plot(df['bmi'], A*df['bmi']+B, color='red')
En regardant le graphique résultant, vous pouvez voir qu'une belle ligne droite est tracée.
Faire de même avec scicit-learn rend les choses plus faciles. Vous pouvez voir qu'il peut être utilisé d'une manière ou d'une autre, mais pouvez-vous comprendre que si vous l'utilisez après avoir compris la théorie, vous aurez complètement faim.
from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()
model_lr.fit(x.to_frame(), y)
Seulement ça. Il semble que le premier argument de la méthode fit n'accepte que pandas.DataFrame, il est donc nécessaire de le forcer à DataFrame avec to_frame ([Reference](https://medium.com/@yamasaKit/scikit-learn%E3%81%] 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)).
Puisque la pente et la section sont respectivement coef_ et intercept_ (voir API) (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression)) Comparons-le avec le résultat précédent.
print("coef_: ", model_lr.coef_[0])
print("intercept: ", model_lr.intercept_)
coef_: 949.4352603839491
intercept: 152.1334841628967
Vous avez le même résultat.
Le coefficient de corrélation R est un coefficient qui indique à quel point les deux variables sont liées (dans quelle mesure elles s'influencent mutuellement) et prend un nombre compris entre -1 et 1. Le coefficient de corrélation $ r $ est la valeur obtenue en divisant la covariance de $ x $ et $ y $ par leurs écarts types respectifs, et est obtenue par la méthode corrcoef en numpy.
r = S_xy/(x.std(ddof=1)*y.std(ddof=1))
rr = np.corrcoef(x, y)[0][1]
0.5864501344746891
0.5864501344746891
C'est également la même valeur. Plus la valeur est élevée, plus la pertinence de chacun est forte.
Le coefficient de détermination est un indice de la correspondance entre la ligne droite obtenue et les données réelles, et plus il est proche de 1, plus il est proche des données d'origine.
Le coefficient de détermination peut être obtenu sur la base des valeurs de variation totale et de variation résiduelle, et est égal au carré du coefficient de corrélation. Pour plus de détails, voir ici.
Le coefficient de décision est obtenu par la méthode de score de la classe LinearRegression.
R = model_lr.score(x.to_frame(), y)
print("R: ", R)
print("r^2: ", r**2)
R: 0.3439237602253803
r^2: 0.3439237602253809
Ce sera égal.
Pour une analyse de régression simple, j'ai essayé l'implémentation python tout en vérifiant la théorie. Je pense que vous pouvez comprendre comment dessiner une ligne de régression et à quel point la ligne obtenue représente les données d'origine. Au fait, j'ai choisi l'IMC pour la cible car il avait le coefficient de corrélation le plus élevé. Je voudrais écrire sur la façon de vérifier cela.
Recommended Posts