2.1 Regresia liniară
Primul model adevărat: prezicem o valoare numerică (preț, temperatură, energie) printr-o combinație liniară a caracteristicilor.
Teorie
Modelul de bază
Cu o singură caracteristică, modelul este o dreaptă:
ŷ = w·x + b — w este panta (coeficientul),
b este interceptul.Cu mai multe caracteristici devine:
ŷ = w₁·x₁ + w₂·x₂ + … + wₙ·xₙ + bAntrenarea = găsirea valorilor w și b care fac predicțiile cât mai apropiate de valorile reale din train.
Funcția de cost
„Cât de apropiate" se măsoară cu eroarea pătratică medie (MSE):
MSE = (1/n) · Σ (yᵢ − ŷᵢ)²Ridicarea la pătrat pedepsește puternic erorile mari și face funcția derivabilă. Regresia liniară clasică găsește exact minimul acestei funcții.
Interpretarea coeficienților
Coeficientul wᵢ spune: „dacă xᵢ crește cu o unitate și restul rămâne
neschimbat, predicția crește cu wᵢ". Exemplu: la prețul caselor, un coeficient de 950
pentru suprafata înseamnă ~950 € în plus pentru fiecare m². Semnul negativ înseamnă
efect invers (de exemplu vechimea scade prețul).
Implementarea din scikit-learn
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
model = LinearRegression()
model.fit(X_train, y_train)
print(model.coef_) # w1, w2, ...
print(model.intercept_) # b
y_pred = model.predict(X_val)
print("MSE:", mean_squared_error(y_val, y_pred))
print("R²:", r2_score(y_val, y_pred)) # 1 = perfect, 0 = ca media
Problemă rezolvată: predicția producției de energie solară
Pe baza condițiilor meteo (radiație, temperatură, nebulozitate), prezicem energia produsă de panouri solare — o țintă numerică, deci regresie.
Soluția pas cu pas
1. Explorăm: heatmap → radiația e puternic corelată cu ținta. 2. Curățăm valorile lipsă. 3. Regresie liniară + validare locală. 4. Submisie.
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
feats = [c for c in train.columns if c not in ("SampleID", "energie")]
train[feats] = train[feats].fillna(train[feats].median())
test[feats] = test[feats].fillna(train[feats].median()) # medianele din TRAIN
X_tr, X_va, y_tr, y_va = train_test_split(train[feats], train["energie"],
test_size=0.2, random_state=42)
model = LinearRegression().fit(X_tr, y_tr)
print("MAE validare:", mean_absolute_error(y_va, model.predict(X_va)))
model.fit(train[feats], train["energie"]) # reantrenăm pe tot
pd.DataFrame({
"SampleID": test["SampleID"],
"energie": model.predict(test[feats]).round(2)
}).to_csv("submission.csv", index=False)
Probleme propuse
Pentru punctele (1,2), (2,4), (3,5), (4,8): calculează manual MSE pentru dreptele
ŷ = 2x și ŷ = 1.8x + 0.5. Care e mai bună? Verifică apoi cu
LinearRegression care este dreapta optimă.
Antrenează o regresie pe un dataset de case și scrie în limbaj natural ce înseamnă fiecare coeficient. Care feature are cel mai mare impact după standardizare?
Problema clasică de regresie de la simulările ONIA.
Reia problema din lecția 1.2, de data aceasta cu regresie liniară pe feature-uri meteo, și compară scorul cu abordarea prin medii.