首頁 > 後端開發 > Python教學 > 透過多項式迴歸解鎖準確的預測

透過多項式迴歸解鎖準確的預測

王林
發布: 2024-08-12 18:36:32
原創
729 人瀏覽過

資料樣本

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": 13, "salary": ???, "absences": 5, "city": "San Francisco" }
登入後複製

結果

使用多項式迴歸此序列的值13將是:24814
但正確的值是:19550
錯誤:5264

如果我預測位置 49,它將是:182441
但正確的值是:77150
錯誤:105291

這是產生級數的「隱藏演算法」:

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'}
登入後複製

如何預測準確值?

多項式迴歸是一種統計技術,可用於建模和預測兩個變數之間的關係。然而,在這種涉及多個變數(學習時間、工資、缺勤和城市)的情況下,多項式迴歸可能不足以捕捉時間序列中的所有模式。

所討論的問題是時間序列的典型範例,我們需要根據過去觀察到的模式來預測未來值。

這個問題可以透過機器學習

來解決
  • 分析變數之間的所有關係
  • 測試多個假設以發現是什麼產生了進展

此外,分析變數之間的所有關係並測試各種假設以發現產生進展的因素也很重要。這可能包括:

  • 探索性分析:使用探索性分析技術來更好地理解時間序列的性質並識別變數之間可能的模式或關係。

  • 統計檢定:進行統計檢定以檢查觀察到的變數之間的關係是否具有顯著性。

另一個解法是建立一個演算法,用最基本的假設來做到這一點:

  • 檢定「關係和」對級數的影響: a+b->c、b+c->a、c+a->b、a+b+c->d 等(->== 影響、產生)
  • 檢定「關係減法」、「關係除法」、「關係平方」等

這種用於測試「關係運算」的演算法,它將是一種直接機器學習(或顯式機器學習)方法。這意味著演算法不使用先進的機器學習技術,而是實現規則和邏輯結構來學習時間序列模式。

只測試基本假設,其限制為:

  • 過度擬合:演算法可能過度專注於訓練資料集中的特定模式,而不能很好地推廣到新資料。
  • 可擴展性有限:如果資料集非常大或複雜,演算法可能無法即時測試所有可能的假設。

雖然機器學習模型可以:

  • 學習複雜模式並推廣到新數據,無需明確指定它們。

但樣本量又如何呢?

在尋找更複雜的解決方案之前,最好確保更簡單的解決方案已經過充分的測試。

如果我們只包含 3 行級數序列,我們就可以使用多項式級數預測準確值

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'}
]
登入後複製

現在

  • 學習時間 = 13 =>預計薪資:19550
  • 學習時間 = 49 =>預計薪資:77150

所以這個問題可以用多項式迴歸來解決,只要資料樣本夠

Unlocking Accurate Predictions with Polynomial Regression

有趣的是,模型只需要第 9 行之前的資料樣本即可做出準確的預測。這顯示時間序列中存在一個規則模式,可以用有限的資料量來擷取。確實有。

完整程式碼

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

登入後複製

以上是透過多項式迴歸解鎖準確的預測的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板