Ajustement de courbe en Python (avec exemples)



Souvent, vous souhaiterez peut-être ajuster une courbe à un ensemble de données en Python.

L’exemple étape par étape suivant explique comment ajuster les courbes aux données en Python à l’aide de la fonction numpy.polyfit() et comment déterminer quelle courbe correspond le mieux aux données.

Étape 1 : Créer et visualiser des données

Commençons par créer un faux ensemble de données, puis créons un nuage de points pour visualiser les données :

import pandas as pd
import matplotlib.pyplot as plt

#create DataFrame
df = pd.DataFrame({'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
                   'y': [3, 14, 23, 25, 23, 15, 9, 5, 9, 13, 17, 24, 32, 36, 46]})

#create scatterplot of x vs. y
plt.scatter(df.x, df.y)

Étape 2 : Ajuster plusieurs courbes

Ajustons ensuite plusieurs modèles de régression polynomiale aux données et visualisons la courbe de chaque modèle dans le même tracé :

import numpy as np

#fit polynomial models up to degree 5
model1 = np.poly1d(np.polyfit(df.x, df.y, 1))
model2 = np.poly1d(np.polyfit(df.x, df.y, 2))
model3 = np.poly1d(np.polyfit(df.x, df.y, 3))
model4 = np.poly1d(np.polyfit(df.x, df.y, 4))
model5 = np.poly1d(np.polyfit(df.x, df.y, 5))

#create scatterplot
polyline = np.linspace(1, 15, 50)
plt.scatter(df.x, df.y)

#add fitted polynomial lines to scatterplot 
plt.plot(polyline, model1(polyline), color='green')
plt.plot(polyline, model2(polyline), color='red')
plt.plot(polyline, model3(polyline), color='purple')
plt.plot(polyline, model4(polyline), color='blue')
plt.plot(polyline, model5(polyline), color='orange')
plt.show()

Pour déterminer quelle courbe correspond le mieux aux données, nous pouvons examiner le R carré ajusté de chaque modèle.

Cette valeur nous indique le pourcentage de variation de la variable de réponse qui peut être expliquée par la ou les variables prédictives du modèle, ajustées en fonction du nombre de variables prédictives.

#define function to calculate adjusted r-squared
def adjR(x, y, degree):
    results = {}
    coeffs = np.polyfit(x, y, degree)
    p = np.poly1d(coeffs)
    yhat = p(x)
    ybar = np.sum(y)/len(y)
    ssreg = np.sum((yhat-ybar)**2)
    sstot = np.sum((y - ybar)**2)
    results['r_squared'] = 1- (((1-(ssreg/sstot))*(len(y)-1))/(len(y)-degree-1))

    return results

#calculated adjusted R-squared of each model
adjR(df.x, df.y, 1)
adjR(df.x, df.y, 2)
adjR(df.x, df.y, 3)
adjR(df.x, df.y, 4)
adjR(df.x, df.y, 5)

{'r_squared': 0.3144819}
{'r_squared': 0.5186706}
{'r_squared': 0.7842864}
{'r_squared': 0.9590276}
{'r_squared': 0.9549709}

À partir du résultat, nous pouvons voir que le modèle avec le R-carré ajusté le plus élevé est le polynôme du quatrième degré, qui a un R-carré ajusté de 0,959 .

Étape 3 : Visualisez la courbe finale

Enfin, nous pouvons créer un nuage de points avec la courbe du modèle polynomial du quatrième degré :

#fit fourth-degree polynomial
model4 = np.poly1d(np.polyfit(df.x, df.y, 4))

#define scatterplot
polyline = np.linspace(1, 15, 50)
plt.scatter(df.x, df.y)

#add fitted polynomial curve to scatterplot
plt.plot(polyline, model4(polyline), '--', color='red')
plt.show()

Nous pouvons également obtenir l’équation de cette ligne en utilisant la fonction print() :

print(model4)

          4          3         2
-0.01924 x + 0.7081 x - 8.365 x + 35.82 x - 26.52

L’équation de la courbe est la suivante :

y = -0,01924x 4 + 0,7081x 3 – 8,365x 2 + 35,82x – 26,52

Nous pouvons utiliser cette équation pour prédire la valeur de la variable de réponse en fonction des variables prédictives du modèle. Par exemple si x = 4 alors nous prédirions que y = 23,32 :

y = -0,0192(4) 4 + 0,7081(4) 3 – 8,365(4) 2 + 35,82(4) – 26,52 = 23,32

Ressources additionnelles

Une introduction à la régression polynomiale
Comment effectuer une régression polynomiale en Python

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *