Maison  >  Article  >  développement back-end  >  Débloquer des prédictions précises avec la régression polynomiale

Débloquer des prédictions précises avec la régression polynomiale

王林
王林original
2024-08-12 18:36:32711parcourir

Échantillon de données

date = [
 { "study_time": 1, "salary":  350, "absences": 5, "city": "San Francisco" },
 { "study_time": 2, "salary": 1600, "absences": 4, "city": "London" },
 { "study_time": 3, "salary": 2450, "absences": 3, "city": "Paris" },
 { "study_time": 4, "salary": 5150, "absences": 5, "city": "San Francisco" },
 { "study_time": 5, "salary": 5800, "absences": 4, "city": "London" },
 { "study_time": 6, "salary": 6050, "absences": 3, "city": "Paris" }
]

Quel est le salaire estimé avec ces valeurs ?

{ "study_time": 13, "salary": ???, "absences": 5, "city": "San Francisco" }

Résultats

En utilisant la Régression polynomiale la valeur 13 de cette séquence serait : 24814
Mais la valeur correcte était : 19550
Erreur : 5264

Si je devais prédire la position 49 ce serait : 182441
Mais la valeur correcte était : 77150
Erreur : 105291

C'était "algorithme caché" qui produit la progression :

x = 0
absences_base = 50
salary_base = 1000

data = []

for i in range(50):
    if x == 0:
        x += 1
        data.append({
            "study_time": i + 1,
            "salary": (i * salary_base + (300 * 2 * (i + 1))) - (5 * absences_base),
            "absences": 5,
            "city": "San Francisco"
        })
    elif x == 1:
        x += 1
        data.append({
            "study_time": i + 1,
            "salary": (i * salary_base + (200 * 2 * (i + 1))) - (4 * absences_base),
            "absences": 4,
            "city": "London"
        })
    else:
        x = 0
        data.append({
            "study_time": i + 1,
            "salary": (i * salary_base + (100 * 2 * (i + 1))) - (3 * absences_base),
            "absences": 3,
            "city": "Paris"
        })

for entry in data:
    print(entry)
{'study_time': 1, 'salary': 350, 'absences': 5, 'city': 'San Francisco'}
{'study_time': 2, 'salary': 1600, 'absences': 4, 'city': 'London'}
{'study_time': 3, 'salary': 2450, 'absences': 3, 'city': 'Paris'}
{'study_time': 4, 'salary': 5150, 'absences': 5, 'city': 'San Francisco'}
{'study_time': 5, 'salary': 5800, 'absences': 4, 'city': 'London'}
{'study_time': 6, 'salary': 6050, 'absences': 3, 'city': 'Paris'}
{'study_time': 7, 'salary': 9950, 'absences': 5, 'city': 'San Francisco'}
{'study_time': 8, 'salary': 10000, 'absences': 4, 'city': 'London'}
{'study_time': 9, 'salary': 9650, 'absences': 3, 'city': 'Paris'}
{'study_time': 10, 'salary': 14750, 'absences': 5, 'city': 'San Francisco'}
{'study_time': 11, 'salary': 14200, 'absences': 4, 'city': 'London'}
{'study_time': 12, 'salary': 13250, 'absences': 3, 'city': 'Paris'}
{'study_time': 13, 'salary': 19550, 'absences': 5, 'city': 'San Francisco'}

Comment prédire la valeur exacte ?

La régression polynomiale est une technique statistique qui peut être utilisée pour modéliser et prédire la relation entre deux variables. Cependant, dans des cas comme celui-ci, où plusieurs variables sont impliquées (durée des études, salaire, absences et ville), la régression polynomiale peut ne pas être suffisante pour capturer tous les modèles de la série chronologique.

Le problème en question est un exemple classique de série chronologique, où nous devons prédire les valeurs futures en fonction de modèles observés dans le passé.

Ce problème pourrait être résolu grâce à l'apprentissage automatique

  • Analyser toutes les relations entre les variables
  • Testez plusieurs hypothèses pour découvrir ce qui produit la progression

De plus, il peut être essentiel d'analyser toutes les relations entre les variables et de tester diverses hypothèses pour découvrir ce qui produit la progression. Cela peut inclure :

  • Analyse exploratoire : utilisez des techniques d'analyse exploratoire pour mieux comprendre la nature de la série chronologique et identifier des modèles ou des relations possibles entre les variables.

  • Tests statistiques : Effectuer des tests statistiques pour vérifier s'il y a une signification dans les relations observées entre les variables.

Une autre solution serait de créer un algorithme qui fasse cela avec les hypothèses les plus élémentaires :

  • Tester l'influence des "sommes relationnelles" sur la progression : a+b->c, b+c->a, c+a->b, a+b+c->d, etc (-> == influence, produit)
  • Testez les "soustractions relationnelles", les "divisions relationnelles", les "carrés relationnels", etc.

Cet algorithme de test des "opérations relationnelles", ce serait une approche de machine learning direct (ou explicite machine learning). Cela signifie que l'algorithme n'utilise pas de techniques avancées d'apprentissage automatique, mais implémente plutôt des règles et des structures logiques pour apprendre des modèles de séries chronologiques.

Et en testant uniquement des hypothèses de base, les limites seraient :

  • Surajustement : l'algorithme peut se spécialiser sur des modèles spécifiques dans l'ensemble de données formé et ne pas bien se généraliser aux nouvelles données.
  • Évolutivité limitée : Si l'ensemble de données est très volumineux ou complexe, l'algorithme peut ne pas être en mesure de tester toutes les hypothèses possibles en temps réel.

Alors qu'un modèle d'apprentissage automatique peut :

  • Apprenez des modèles complexes et généralisez-les à de nouvelles données, sans avoir besoin de les spécifier explicitement.

Mais qu’en est-il de la taille de l’échantillon ?

Avant de rechercher des solutions plus complexes, il est préférable de s'assurer qu'une solution plus simple a été correctement testée.

Si nous incluons seulement 3 lignes supplémentaires de la séquence de progression, nous pouvons prédire la valeur exacte en utilisant la progression polynomiale

date = [
 { "study_time": 1, "salary":  350, "absences": 5, "city": "San Francisco" },
 { "study_time": 2, "salary": 1600, "absences": 4, "city": "London" },
 { "study_time": 3, "salary": 2450, "absences": 3, "city": "Paris" },
 { "study_time": 4, "salary": 5150, "absences": 5, "city": "San Francisco" },
 { "study_time": 5, "salary": 5800, "absences": 4, "city": "London" },
 { "study_time": 6, "salary": 6050, "absences": 3, "city": "Paris" },
 {'study_time': 7, 'salary': 9950, 'absences': 5, 'city': 'San Francisco'},
 {'study_time': 8, 'salary': 10000, 'absences': 4, 'city': 'London'},
 {'study_time': 9, 'salary': 9650, 'absences': 3, 'city': 'Paris'}
]

Maintenant

  • study_time = 13 => Salaire prévu : 19550
  • study_time = 49 => Salaire prévu : 77150

Ce problème peut donc être résolu avec la régression polynomiale, tant que l'échantillon de données est suffisant

Unlocking Accurate Predictions with Polynomial Regression

Il est intéressant de noter que le modèle n'a besoin que d'un échantillon de données jusqu'à la ligne 9 pour faire des prédictions précises. Cela suggère qu'il existe un modèle régulier dans la série chronologique qui peut être capturé avec une quantité limitée de données. Et il y en avait vraiment.

Code complet

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

data = pd.DataFrame({
    "study_time": [1, 2, 3, 4, 5, 6, 7, 8, 9],
    "absences": [5, 4, 3, 5, 4, 3, 5, 4, 3],
    "San Francisco": [0, 1, 0, 0, 1, 0, 0, 1, 0], # dummy variables
    "London": [0, 0, 1, 0, 0, 1, 0, 0, 1], # dummy variables
    "Paris": [1, 0, 0, 1, 0, 0, 1, 0, 0], # dummy variables
    "salary": [350, 1600, 2450, 5150, 5800, 6050, 9950, 10000, 9650]
}) 

# Independent and dependent variables
X = data[["study_time", "absences", "San Francisco", "London", "Paris"]]
y = data["salary"]

# Creating polynomial characteristics of degree 2
characteristics_2 = PolynomialFeatures(degree=2)
x_pol_2 = characteristics_2.fit_transform(X)
y_pol_2 = model2.predict(x_pol_2)

# Fitting the linear regression model
model2 = LinearRegression()
model2.fit(x_pol_2, y)

# New data provided for prediction
new_data = pd.DataFrame({
    "study_time": [13],
    "absences": [5],
    "San Francisco": [0],
    "London": [0],
    "Paris": [1]
})

# Polynomial transformation of the new data
new_data_pol_2 = characteristics_2.transform(new_data)
predicted_salary = model2.predict(new_data_pol_2)

print("Predicted Salary:", int(predicted_salary[0]) )

# Plot
plt.subplot(1, 1, 1)
plt.scatter(new_data["study_time"], predicted_salary, color='green', label='Predicted Salary')

plt.scatter(data["study_time"], y, color='blue', label='Real Salary')
plt.scatter(data["study_time"], y_pol_2, color='red', label='Polynomial Fit', marker='x')
plt.title("Polynomial Regression - Salary and Study Time")
plt.xlabel("Study Time")
plt.ylabel("Salary") 
plt.legend()
plt.show()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn