Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Membuka Kunci Ramalan Tepat dengan Regresi Polinomial

Membuka Kunci Ramalan Tepat dengan Regresi Polinomial

王林
王林asal
2024-08-12 18:36:32710semak imbas

Sampel data

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" }
]

Berapakah anggaran gaji dengan nilai ini?

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

Keputusan

Menggunakan Regression Polinomial nilai 13 jujukan ini ialah: 24814
Tetapi nilai yang betul ialah: 19550
Ralat: 5264

Jika saya meramalkan kedudukan 49 ia akan menjadi: 182441
Tetapi nilai yang betul ialah: 77150
Ralat: 105291

Ini ialah "algoritma tersembunyi" yang menghasilkan janjang:

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'}

Bagaimana untuk meramalkan nilai yang tepat?

Regression polinomial ialah teknik statistik yang boleh digunakan untuk memodelkan dan meramalkan hubungan antara dua pembolehubah. Walau bagaimanapun, dalam kes seperti ini, di mana terdapat beberapa pembolehubah yang terlibat (masa belajar, gaji, ketidakhadiran dan bandar), regresi polinomial mungkin tidak mencukupi untuk menangkap semua corak dalam siri masa.

Masalah yang dimaksudkan ialah contoh klasik siri masa, di mana kita perlu meramalkan nilai masa hadapan berdasarkan corak yang diperhatikan pada masa lalu.

Masalah ini boleh diselesaikan dengan pembelajaran mesin

  • Analisis semua hubungan antara pembolehubah
  • Uji berbilang hipotesis untuk mengetahui perkara yang menghasilkan janjang

Selain itu, adalah penting untuk menganalisis semua hubungan antara pembolehubah dan menguji pelbagai hipotesis untuk mengetahui perkara yang menghasilkan perkembangan. Ini mungkin termasuk:

  • Analisis penerokaan: Gunakan teknik analisis penerokaan untuk lebih memahami sifat siri masa dan mengenal pasti corak atau hubungan yang mungkin antara pembolehubah.

  • Ujian statistik: Jalankan ujian statistik untuk menyemak sama ada terdapat kepentingan dalam hubungan yang diperhatikan antara pembolehubah.

Penyelesaian lain ialah mencipta algoritma yang melakukan ini dengan hipotesis paling asas:

  • Uji pengaruh "jumlah hubungan" pada janjang: a+b->c, b+c->a, c+a->b, a+b+c->d, dsb (-> == mempengaruhi, menghasilkan )
  • Uji "penolakan hubungan", "bahagian hubungan", "petak hubungan", dll.

Algoritma ini untuk menguji "operasi perhubungan", ia akan menjadi pendekatan pembelajaran mesin langsung (atau pembelajaran mesin eksplisit). Ini bermakna algoritma tidak menggunakan teknik pembelajaran mesin lanjutan, sebaliknya melaksanakan peraturan dan struktur logik untuk mempelajari corak siri masa.

Dan dengan menguji hipotesis asas sahaja, hadnya ialah:

  • Terlebih muat: Algoritma mungkin terlalu mengkhususkan pada corak tertentu dalam set data terlatih dan tidak menggeneralisasikan dengan baik kepada data baharu.
  • Skala terhad: Jika set data sangat besar atau kompleks, algoritma mungkin tidak dapat menguji semua hipotesis yang mungkin dalam masa nyata.

Walaupun model pembelajaran mesin boleh:

  • Ketahui corak yang kompleks dan umumkan kepada data baharu, tanpa memerlukannya dinyatakan secara eksplisit.

Tetapi bagaimana dengan saiz sampel?

Sebelum mencari penyelesaian yang lebih kompleks, sebaiknya pastikan penyelesaian yang lebih mudah telah diuji secukupnya.

Jika kita memasukkan hanya 3 lagi baris jujukan janjang, kita boleh meramalkan nilai tepat menggunakan janjang polinomial

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'}
]

Sekarang

  • masa_belajar = 13 => Gaji Ramalan: 19550
  • masa_belajar = 49 => Gaji Ramalan: 77150

Jadi masalah ini boleh diselesaikan dengan regresi polinomial, asalkan sampel data mencukupi

Unlocking Accurate Predictions with Polynomial Regression

Adalah menarik untuk diperhatikan bahawa model hanya memerlukan sampel data sehingga baris 9 untuk membuat ramalan yang tepat. Ini menunjukkan bahawa terdapat corak biasa dalam siri masa yang boleh ditangkap dengan jumlah data yang terhad. Dan memang ada.

Kod lengkap

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()

Atas ialah kandungan terperinci Membuka Kunci Ramalan Tepat dengan Regresi Polinomial. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn