ホームページ > バックエンド開発 > Python チュートリアル > 多項式回帰で正確な予測を可能にする

多項式回帰で正確な予測を可能にする

王林
リリース: 2024-08-12 18:36:32
オリジナル
733 人が閲覧しました

データサンプル

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'}
ログイン後にコピー

正確な値を予測するにはどうすればよいですか?

多項式回帰は、2 つの変数間の関係をモデル化し、予測するために使用できる統計手法です。ただし、このような場合、複数の変数 (学習時間、給与、欠勤、都市) が関係しているため、多項式回帰では時系列のすべてのパターンを捉えるのに十分ではない可能性があります。

問題となっている問題は、時系列の典型的な例であり、過去に観察されたパターンに基づいて将来の値を予測する必要があります。

この問題は機械学習

で解決できる可能性があります
  • 変数間のすべての関係を分析します
  • 複数の仮説をテストして、何が進行を生み出すのかを発見します

さらに、変数間のすべての関係を分析し、さまざまな仮説をテストして、何が進行を生み出すのかを発見することが不可欠な場合があります。これには以下が含まれる場合があります:

  • 探索的分析: 探索的分析手法を使用して、時系列の性質をより深く理解し、変数間の考えられるパターンや関係を特定します。

  • 統計的テスト: 統計的テストを実行して、変数間に観察される関係に有意性があるかどうかを確認します。

もう 1 つの解決策は、最も基本的な仮説を使用してこれを行うアルゴリズムを作成することです。

  • 進行に対する「関係和」の影響をテストします。 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート