Învățare supervizată

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ₙ + b

Antrenarea = 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).

Coeficienții pot fi comparați între ei ca importanță doar dacă datele au fost standardizate înainte.

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ă

Predicția producției de energie solară Ușor Rezolvată — 100p

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

1. Dreapta de mână Exercițiu

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ă.

2. Interpretarea coeficienților Exercițiu

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?

3. Predicția prețului unei case Platformă

Problema clasică de regresie de la simulările ONIA.

4. Temperatura medie zilnică Platformă

Reia problema din lecția 1.2, de data aceasta cu regresie liniară pe feature-uri meteo, și compară scorul cu abordarea prin medii.