পলিনোমিয়াল রিগ্রেশন (Polynomial Regression) হলো লিনিয়ার রিগ্রেশনের একটি এক্সটেনশন যেখানে ইনডিপেন্ডেন্ট ভেরিয়েবল (x) এবং ডিপেন্ডেন্ট ভেরিয়েবল (y)-এর সম্পর্ক nth-ডিগ্রি পলিনোমিয়াল দিয়ে মডেল করা হয়। এটি নন-লিনিয়ার সম্পর্ক মডেল করতে সক্ষম।
প্রয়োজনীয় লাইব্রেরি
pip install numpy pandas matplotlib scikit-learn
সম্পূর্ণ উদাহরণ
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score, mean_squared_error
# ১. ডেটা লোড (উদাহরণ CSV: Temperature vs Pressure)
# CSV ফাইল নেই তে সিনথেটিক ডেটা তৈরি
np.random.seed(42)
X = np.linspace(0, 10, 50).reshape(-1, 1)
y = 2 * X**3 - 5 * X**2 + 3 * X + 10 + np.random.randn(50, 1) * 20
# ২. লিনিয়ার রিগ্রেশন (বেসলাইন)
lin = LinearRegression()
lin.fit(X, y)
y_pred_lin = lin.predict(X)
# ৩. পলিনোমিয়াল রিগ্রেশন (ডিগ্রি ৩)
poly = PolynomialFeatures(degree=3, include_bias=False)
X_poly = poly.fit_transform(X)
lin2 = LinearRegression()
lin2.fit(X_poly, y)
y_pred_poly = lin2.predict(X_poly)
# ৪. মেট্রিক্স
print(f"Linear R²: {r2_score(y, y_pred_lin):.4f}")
print(f"Poly R²: {r2_score(y, y_pred_poly):.4f}")
print(f"Linear MSE: {mean_squared_error(y, y_pred_lin):.2f}")
print(f"Poly MSE: {mean_squared_error(y, y_pred_poly):.2f}")
# ৫. ভিজ্যুয়ালাইজেশন
plt.figure(figsize=(12, 5))
# লিনিয়ার
plt.subplot(1, 2, 1)
plt.scatter(X, y, color='blue', alpha=0.6, label='Data')
plt.plot(X, y_pred_lin, color='red', linewidth=2, label='Linear Fit')
plt.title('Linear Regression')
plt.xlabel('Temperature')
plt.ylabel('Pressure')
plt.legend()
plt.grid(True, alpha=0.3)
# পলিনোমিয়াল
plt.subplot(1, 2, 2)
plt.scatter(X, y, color='blue', alpha=0.6, label='Data')
# স্মুথ কার্ভের জন্য সর্ট করা X
X_sorted = np.sort(X, axis=0)
X_poly_sorted = poly.transform(X_sorted)
plt.plot(X_sorted, lin2.predict(X_poly_sorted), color='red', linewidth=2, label='Poly Fit (deg=3)')
plt.title('Polynomial Regression (degree=3)')
plt.xlabel('Temperature')
plt.ylabel('Pressure')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# ৬. নতুন প্রেডিকশন
new_temp = 110.0
print(f"Linear prediction at {new_temp}: {lin.predict([[new_temp]])[0][0]:.2f}")
print(f"Poly prediction at {new_temp}: {lin2.predict(poly.transform([[new_temp]]))[0][0]:.2f}")
মূল কনসেপ্টস
| কনসেপ্ট | বিবরণ |
|---|---|
| PolynomialFeatures | x থেকে x², x³, ... xⁿ ফিচার তৈরি করে |
| degree | পলিনোমিয়ালের ডিগ্রি (অতিরিক্ত ডিগ্রি = ওভারফিটিং রিস্ক) |
| include_bias=False | বায়াস টার্ম (x⁰=১) যোগ না করা, LinearRegression নিজেই হ্যান্ডেল করে |
| fit_transform vs transform | ট্রেনিং ডেটায় fit_transform, টেস্ট/নিউ ডেটায় transform |
ডিগ্রি নির্বাচন: ওভারফিটিং এড়ানো
from sklearn.model_selection import cross_val_score
degrees = range(1, 8)
cv_scores = []
for d in degrees:
poly = PolynomialFeatures(degree=d, include_bias=False)
X_poly = poly.fit_transform(X)
lin = LinearRegression()
scores = cross_val_score(lin, X_poly, y, cv=5, scoring='r2')
cv_scores.append(scores.mean())
print(f"Degree {d}: CV R² = {scores.mean():.4f}")
# সেরা ডিগ্রি বেছে নিন (সাধারণত যেখানে CV স্কোর পিক করে)
import matplotlib.pyplot as plt
plt.plot(degrees, cv_scores, 'o-')
plt.xlabel('Polynomial Degree')
plt.ylabel('Cross-Validation R²')
plt.title('Degree Selection')
plt.show()
সেরা অনুশীলন
- ডেটা স্কেল করুন (
StandardScaler) পলিনোমিয়াল ফিচার তৈরির আগে—বড় ডিগ্রি হলে সংখ্যা খুব বড় হয়। - ক্রস-ভ্যালিডেশন দিয়ে অপ্টিমাল ডিগ্রি বেছে নিন।
- রেগুলারাইজেশন (Ridge/Lasso) ব্যবহার করুন হাই-ডিগ্রি পলিনোমিয়ালে।
Pipelineব্যবহার করে স্টেপস চেইন করুন:Pipeline([('poly', PolynomialFeatures()), ('scaler', StandardScaler()), ('lin', LinearRegression())])।