Analyse de régression avec Python

Bonjour, c'est Motty. Cette fois, j'ai décrit l'analyse de régression à l'aide de Python.

Régression

L'analyse de régression est une méthode de prédiction des données cibles à l'aide des données disponibles. A ce moment, la structure de la relation quantitative est appliquée aux données (modèle de régression). Si le modèle de régression est une ligne droite, on l'appelle une ligne de régression, et si la fonction d'ordre n est appliquée par régression polypoly, on parle de courbe de régression.

Comment déterminer le modèle

La méthode des moindres carrés est utilisée pour évaluer le modèle ajusté. L'invention concerne un procédé de sélection d'un coefficient qui minimise la somme des carrés des résidus lors de l'approximation des données obtenues par mesure avec une fonction telle qu'une ligne droite.

Méthode d'évaluation

Utilisez le coefficient de détermination. Plus ce nombre est élevé, meilleur est l'ajustement du modèle de régression aux données réelles. Si la valeur observée = y et la valeur estimée par la fonction est f, elle est exprimée par l'équation suivante.  2020-04-06 11.20.44.png

Si le modèle correspond parfaitement aux données, la valeur du facteur de décision sera 1.

Revenir

Pour les données avec du bruit ajouté à chacune des fonctions linéaires, quadratiques et cubiques J'ai appliqué une ligne de régression.

LinearRegression.py


import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

#sklearn
from sklearn.linear_model import LinearRegression as reg
from sklearn.metrics import r2_score

#Liés aux données
CI =["black","red","blue","yellow","green","orange","purple","skyblue"]#ColorIndex

N = 30 #Le nombre d'échantillons
x = np.linspace(1,10,N)
y1 = x *5 + np.random.randn(N)*5
y2 =  2*(x-2)*(x-7) +   np.random.randn(N)*5
y3 =  3*(x-1)*(x-4)*(x-7) +  np.random.randn(N)*10

x = x.reshape([-1,1])
y1 = y1.reshape([-1,1])
y2 = y2.reshape([-1,1])
y3 = y3.reshape([-1,1])

#Apprentissage
clf1, clf2, clf3 = reg(),reg(),reg()
clf1.fit(x,y1),clf2.fit(x,y2),clf3.fit(x,y3)

#x Valeur prévue pour les données
y1_pred,y2_pred,y3_pred = clf1.predict(x),clf2.predict(x),clf3.predict(x)

#dessin
fig = plt.figure(figsize = (15,15))
ax1,ax2,ax3 = fig.add_subplot(3,3,1),fig.add_subplot(3,3,2),fig.add_subplot(3,3,3)
#Data
ax1.scatter(x,y1,c = CI[1],label = "R^2 = {}".format(r2_score(y1,y1_pred)))
ax2.scatter(x,y2,c = CI[2],label = "R^2 = {}".format(r2_score(y2,y2_pred)))
ax3.scatter(x,y3,c = CI[3],label = "R^2 = {}".format(r2_score(y3,y3_pred)))
ax1.legend(),ax2.legend(),ax3.legend()
#Retour en ligne droite
ax1.plot(x,clf1.predict(x), c = CI[0])
ax2.plot(x,clf2.predict(x), c = CI[0])
ax3.plot(x,clf3.predict(x), c = CI[0])

fig.suptitle("RinearLegression", fontsize = 15)
ax1.set_title("1")
ax2.set_title("2")
ax3.set_title("3")

Sans surprise, les résultats montrent que l'ajustement de ligne droite est le meilleur pour les fonctions linéaires.

 2020-04-06 13.24.26.png

Régression polymérique

Il peut être approprié d'appliquer une courbe de régression telle qu'une fonction multi-ordre à un ensemble de données tel que 2 ou 3.

polynomial.py



import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as reg
from sklearn.metrics import r2_score
from sklearn.preprocessing import PolynomialFeatures as PF


#Liés aux données
CI =["black","red","blue","yellow","green","orange","purple","skyblue"]#ColorIndex
N = 10 #Le nombre d'échantillons
x = np.linspace(1,10,N)
y3 =  3*(x-1)*(x-4)*(x-7) +  np.random.randn(N)*10
x = x.reshape([-1,1])
y3 = y3.reshape([-1,1])


#Apprentissage
clf = reg()
clf.fit(x,y3)
#Commande
DegreeSet =[1,2,3] 
for dg in DegreeSet:
    
    pf = PF(degree = dg, include_bias = False)
    x_poly = pf.fit_transform(x)
    poly_reg = reg()
    poly_reg.fit(x_poly,y3)
    polypred = poly_reg.predict(x_poly)

    #x Valeur prévue pour les données
    pred = clf.predict(x)
    #dessin
    plt.scatter(x,y3,c = CI[dg], label = "R^2={}".format(r2_score(y3,polypred)))
    plt.plot(x, polypred,c = CI[0])
    plt.legend()
    plt.title("Regression")
    plt.show()

En conséquence, le modèle s'adapte bien et le coefficient de détermination est élevé chaque fois que l'ordre est augmenté à 1, 2 et 3.

 2020-04-06 15.06.49.png

Dois-je augmenter la commande?

Plus l'ordre est élevé, plus le modèle devient expressif et mieux il s'intègre dans les données, mais plus l'ordre est élevé, plus les performances de généralisation (surapprentissage) sont faibles. Pour résoudre un tel problème, il est conseillé d'utiliser une simple régression linéaire, AIC, ou d'autres pénalités.

(Lorsque nous avons réduit l'ajustement des données au modèle au problème de minimisation AIC Comme vous pouvez le voir dans la formule, des pénalités sont fixées pour l'augmentation dans l'ordre, et l'ordre optimal peut être sélectionné. )

Comme sklearn n'avait pas la bonne bibliothèque, je prévois d'évaluer le modèle en utilisant ma propre AIC dans le prolongement de cela.

Recommended Posts

Analyse de régression avec Python
Analyse de régression simple avec Python
Première analyse de régression simple en Python
Analyse d'association en Python
Expression de régression multiple en Python
Analyse des contraintes symétriques axiales avec Python
2. Analyse multivariée définie dans Python 1-1. Analyse de régression simple (scikit-learn)
2. Analyse multivariée décrite dans Python 2-1. Analyse de régression multiple (scikit-learn)
Analyse des ondes cérébrales avec Python: tutoriel Python MNE
Analyse du squelette planaire dans Python (2) Hotfix
Implémentation simple de l'analyse de régression avec Keras
Analyse de régression logistique Self-made avec python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
SendKeys en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Analyse de régression de Poisson
N-Gram en Python
Programmation avec Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
Méthode d'analyse de régression
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Régression linéaire en Python (statmodels, scikit-learn, PyMC3)
Régression linéaire en ligne en Python (estimation robuste)
J'ai essayé d'implémenter la régression logistique de Cousera en Python
Analyse résiduelle en Python (Supplément: règles Cochrane)
[Test statistique 2e année / quasi 1e année] Formation à l'analyse régressive avec Python (2)
[Test statistique 2e année / quasi 1e année] Formation à l'analyse régressive avec Python (1)
2. Analyse multivariée détaillée dans Python 2-3. Analyse de régression multiple [taux d’infection au COVID-19]
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python