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

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, il s'agit de "l'analyse de régression simple" de base. Je me suis référé à la page suivante.

De base

Une ligne droite sur le plan constituée de l'axe $ x $ et de l'axe $ y $ est représentée par $ y = Ax + B $. $ A $ est une pente et $ B $ est également appelé une section. La régression simple consiste à trouver $ A $ et $ B $ pour tracer une belle ligne droite sur de nombreuses combinaisons de $ x $ et $ y $. Les humains peuvent en quelque sorte tracer une ligne droite comme "Est-ce que c'est comme ça?", Mais c'est une approche pour laisser l'ordinateur le dessiner.

thème

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.

Préparation

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

Comment résoudre une régression simple

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 $ \ sum_ {i = 1} ^ {N} (y_i- (Ax + B)) ^ 2 $.

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 $ A = \ frac {\ sum_ {i = 1} ^ {n} (x_i- \ bar {x}) (y_i- \ bar {y})} {\ sum_ { i = 1} ^ {n} (x_i- \ bar {x}) ^ 2} $ $ B = \ bar {y} -A \ bar {x} $. À ce stade, si vous mettez les $ (x_i, y_i) $ donnés dans la formule ci-dessus, vous pouvez facilement trouver $ A $ et $ B $.

Implémentons-le honnêtement avec python.

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.

Il y avait

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.

bmi_vs_target_2.png

Faites de même avec scicit-learn

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.

Compréhension approfondie (coefficient de corrélation R et coefficient de détermination R2)

Coefficient de corrélation

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.

Coefficient de décision

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.

Résumé

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

Algorithme d'apprentissage automatique (analyse de régression unique)
Algorithme d'apprentissage automatique (analyse de régression multiple)
Apprentissage automatique avec python (2) Analyse de régression simple
Algorithme d'apprentissage automatique (perceptron simple)
Algorithme d'apprentissage automatique (régression logistique)
Python Scikit-learn Analyse de régression linéaire Analyse de régression simple non linéaire Apprentissage automatique
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 ~.
Analyse de régression simple avec Python
Machine learning supervisé (classification / régression)
Algorithme d'apprentissage automatique (machine vectorielle de support)
Modèle d'empilage d'apprentissage automatique (retour)
2. Analyse multivariée décrite dans Python 1-2. Analyse de régression simple (algorithme)
<Course> Machine learning Chapitre 6: Algorithme 2 (k-means)
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)
Implémentation simple de l'analyse de régression avec Keras
Apprentissage automatique: analyse discriminante linéaire supervisée
[Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et des mathématiques
feuille de triche de l'algorithme scikit learn
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
<Subject> Machine learning Chapitre 3: Modèle de régression logistique
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
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Algorithme EM modèle mixte gaussien [apprentissage automatique statistique]
Bases de l'apprentissage avec un enseignant Partie 1-Régression simple- (Remarque)
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
Histoire de l'analyse de données par apprentissage automatique
2. Analyse multivariée définie dans Python 1-1. Analyse de régression simple (scikit-learn)
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
Calculer le coefficient de régression d'une analyse de régression simple avec python
Étudier l'apprentissage automatique ~ matplotlib ~
Mémo du cours d'apprentissage automatique
Bibliothèque d'apprentissage automatique dlib
Apprentissage automatique (TensorFlow) + Lotto 6