Priprema za Classical ML intervju

Pitanja za Classical Machine Learning Engineer intervju

15 često postavljanih pitanja za Classical ML intervju. Pitanja pokrivaju različite nivoe, a odgovore možete vežbati naglas u našem treneru za intervjue.

Započni Classical ML AI intervjuKreditna kartica nije potrebna. Dostupna je 1 besplatna sesija.
Vežba tehničkog intervjua na engleskomRežim u kome kandidati kojima engleski nije maternji mogu da vežbaju tehničke intervjue.

Pitanja za početni nivo

1Koja je razlika između parametra modela i hiperparametra u nadgledanom učenju?

U nadgledanom mašinskom učenju, parametri modela su interne promenljive koje se uče direktno iz podataka za obuku putem optimizacionog algoritma (kao što su gradijentni spust ili normalne jednačine). Primeri uključuju regresione težine i pomeraj (bias) u linearnim modelima ili pragove grananja u stablima odlučivanja. Nasuprot tome, hiperparametri su spoljna konfiguraciona podešavanja definisana pre obuke koja upravljaju procesom učenja, kapacitetom modela ili arhitekturom. Oni se ne mogu naučiti direktno putem standardne minimizacije funkcije gubitka tokom obuke jer bi optimizator trivijalno preprilagodio model (overfitting, npr. postavljanjem dubine stabla na beskonačno). Primeri uključuju stopu učenja (learning rate), jačinu regularizacije (lambda/C), broj stabala u šumi i maksimalnu dubinu stabla. Hiperparametri se podešavaju korišćenjem validacionih podataka ili unakrsne validacije (cross-validation).

from sklearn.linear_model import Ridge
import numpy as np

X = np.array([[1.0], [2.0], [3.0]])
y = np.array([2.0, 4.0, 6.0])

# Hyperparameter: alpha (regularization strength set beforehand)
model = Ridge(alpha=1.0)

# Fitting optimizes internal parameters on training data
model.fit(X, y)

# Learned parameters
print(f"Weight (Parameter): {model.coef_[0]:.4f}")
print(f"Intercept (Parameter): {model.intercept_:.4f}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

2Koje pretpostavke uvodi linearna regresija metodom najmanjih kvadrata i kako dijagnostika reziduala otkriva narušavanja tih pretpostavki?

Linearna regresija metodom najmanjih kvadrata (Ordinary Least Squares - OLS) oslanja se na nekoliko osnovnih pretpostavki: 1. Linearnost: Odnos između prediktora i ciljne promenljive je linearan po parametrima. 2. Nezavisnost grešaka: Opservacije i rezidualne greške su međusobno nezavisne (nema autokorelacije). 3. Homoskedastičnost: Članovi greške imaju konstantnu varijansu na svim nivoima prediktora. 4. Normalnost reziduala: Članovi greške su normalno raspodeljeni (neophodno za validne intervale poverenja i testiranje hipoteza). 5. Odsustvo multikolinearnosti: Prediktori nisu linearno zavisni (matrica dizajna je punog ranga kolona). Dijagnostika reziduala otkriva narušavanja na sledeći način: - Grafik reziduala u odnosu na prilagođene vrednosti (Residuals vs. Fitted Values plot): Zakrivljenost ili nenasumični obrasci ukazuju na nelinearnost; oblik levka ili lepeze ukazuje na heteroskedastičnost (nekonstantnu varijansu). - Normalni Q-Q grafik (Normal Q-Q plot): Sistematsko odstupanje od prave dijagonalne linije (npr. S-krive ili teški repovi) ukazuje na odstupanje od normalne raspodele. - Grafik reziduala po redosledu/vremenu (Residuals vs. Order/Time plot): Sistematski trendovi ili ciklični obrasci ukazuju na autokorelisane greške. - Grafik poluge / Kukove distance (Leverage / Cook's Distance plot): Identifikuje autlajere sa visokim uticajem koji disproporcionalno pomeraju prilagođeni model.

import numpy as np
import statsmodels.api as sm

np.random.seed(42)
X = np.linspace(1, 10, 50)
# Quadratic underlying pattern creates a linearity violation
y = 2 * X + 0.5 * (X ** 2) + np.random.normal(0, 2, 50)

X_with_const = sm.add_constant(X)
model = sm.OLS(y, X_with_const).fit()
residuals = model.resid

print(f"Mean Residual: {np.mean(residuals):.4f}")
print(f"Curvature in residuals indicates model misspecification.")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

3Kako logistička regresija modeluje binarnu klasifikaciju i koja je uloga sigmoidne funkcije?

Logistička regresija modeluje binarnu klasifikaciju procenom aposteriorne verovatnoće klase $P(Y=1|X)$. Kako bi se obezbedilo da predviđene verovatnoće ostanu u granicama $(0, 1)$, logistička regresija modeluje logit (log-odds) pozitivne klase kao linearnu funkciju ulaza: $\ln\left(\frac{p}{1-p}\right) = w^T x + b$. Sigmoidna (logistička) funkcija, $\sigma(z) = \frac{1}{1 + e^{-z}}$, služi kao funkcija povezivanja koja preslikava bilo koji realan linearni skor $z = w^T x + b \in (-\infty, +\infty)$ monotono u validnu verovatnoću $p \in (0, 1)$. Odluke o diskretnim klasama donose se primenom praga odlučivanja $\tau$ (obično 0.5): $\hat{y} = 1$ ako je $P(Y=1|X) \ge \tau$, u suprotnom $0$. Pošto je $\sigma(z) = 0.5$ tačno kada je $z = 0$, granica odlučivanja u prostoru obeležja je linearna hiperravan $w^T x + b = 0$, što standardnu logističku regresiju čini linearnim klasifikatorom.

import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

w = np.array([1.5, -2.0])
b = 0.5
x = np.array([2.0, 1.0])

z = np.dot(w, x) + b
prob = sigmoid(z)
threshold = 0.5
pred = int(prob >= threshold)

print(f"Log-odds (z): {z:.2f}")
print(f"Probability: {prob:.4f}")
print(f"Class Prediction: {pred}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

4Šta je L2 regularizacija i kako Ridge regresija menja funkciju cilja i procene koeficijenata?

L2 regularizacija (Ridge regresija) dodaje kazneni član proporcionalan zbiru kvadrata težina funkciji gubitka običnih najmanjih kvadrata (OLS - Ordinary Least Squares): $$\min_w \|y - Xw\|_2^2 + \lambda \|w\|_2^2$$ Analitički, Ridge modifikuje normalne jednačine dodavanjem $\lambda I$ Gramovoj matrici pre invertovanja: $$w_{\text{ridge}} = (X^T X + \lambda I)^{-1} X^T y$$ Ključni uticaji na funkciju cilja i procene koeficijenata: 1. Smanjivanje (shrinkage): Koeficijenti se smanjuju ka nuli proporcionalno varijansi i korelaciji obeležja, smanjujući složenost modela bez njihovog potpunog svođenja na tačnu nulu. 2. Multikolinearnost i invertibilnost: Kada su obeležja kolinearna ili $p > N$, matrica $X^T X$ je singularna ili loše uslovljena. Dodavanje $\lambda I$ obezbeđuje da $(X^T X + \lambda I)$ bude strogo pozitivno definitna i invertibilna matrica, što stabilizuje procene parametara. 3. Kompromis između pristrasnosti i varijanse (bias-variance trade-off): Povećanje $\lambda$ uvodi namernu pristrasnost u procene koeficijenata uz značajno smanjenje varijanse, što rezultira manjom očekivanom greškom generalizacije na neviđenim podacima. 4. Zahtev za skaliranjem obeležja: Pošto kazneni član tretira sve težine podjednako, obeležja u većim razmerama bila bi disproporcionalno regularizovana. Obeležja moraju biti standardizovana (nulta srednja vrednost, jedinična varijansa) pre treniranja modela.

import numpy as np

def ridge_regression(X, y, alpha):
    X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0)
    n_features = X_std.shape[1]
    
    I = np.eye(n_features)
    beta = np.linalg.inv(X_std.T @ X_std + alpha * I) @ X_std.T @ y
    return beta

X = np.array([[1.0, 2.0], [2.0, 4.1], [3.0, 5.9], [4.0, 8.2]])
y = np.array([2.1, 4.0, 6.2, 8.1])
weights = ridge_regression(X, y, alpha=1.0)
print('Ridge Weights:', weights)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

5Kako stablo odlučivanja rekurzivno particioniše prostor obeležja i koji se kriterijumi koriste za izbor podela pri klasifikaciji?

Stablo odlučivanja particioniše prostor obeležja pomoću pohlepnog algoritma odozgo nadole koji se naziva **rekurzivno binarno particionisanje**. Počevši od korenog čvora sa svim podacima za obuku, algoritam pretražuje sva obeležja i moguće vrednosti praga kako bi pronašao jednu podelu poravnatu sa osom ($X_j \le t$) koja maksimizuje smanjenje nečistoće. Skup podataka se deli na dva čvora potomka, i ovaj postupak se rekurzivno primenjuje na svaki čvor potomak sve dok se ne dostigne kriterijum zaustavljanja (npr. maksimalna dubina, minimalan broj uzoraka po listu ili čisti čvorovi). Pošto podele evaluiraju jedno po jedno obeležje u odnosu na prag, rezultujuće granice odlučivanja su ortogonalne hiperravni (pravougaoni regioni poravnati sa osama u prostoru obeležja). Za evaluaciju i izbor najbolje podele u stablima klasifikacije koriste se dva glavna kriterijuma nečistoće: 1. **Džinijeva nečistoća (Gini Impurity, koristi se u CART)**: Meri verovatnoću da slučajno izabran uzorak bude pogrešno klasifikovan ako bi bio nasumično označen u skladu sa distribucijom klasa u čvoru. Za $K$ klasa sa udelima $p_k$: $$I_G = 1 - \sum_{k=1}^K p_k^2$$ 2. **Entropija i informacioni dobitak (koriste se u ID3, C4.5)**: Entropija meri neodređenost u čvoru: $H = -\sum_{k=1}^K p_k \log_2(p_k)$. Podela se bira tako da se maksimizuje **informacioni dobitak** (Information Gain), koji predstavlja entropiju roditeljskog čvora umanjenu za ponderisani prosek entropija čvorova potomaka: $$IG = H(\text{parent}) - \sum_{c \in \{\text{left, right}\}} \frac{N_c}{N} H(c)$$ Obe metrike dostižu 0 kada je čvor potpuno čist (svi uzorci pripadaju jednoj klasi), a dostižu maksimum kada su klase ravnomerno raspoređene.

import numpy as np

def gini(labels):
    _, counts = np.unique(labels, return_counts=True)
    p = counts / len(labels)
    return 1.0 - np.sum(p ** 2)

def entropy(labels):
    _, counts = np.unique(labels, return_counts=True)
    p = counts / len(labels)
    return -np.sum(p * np.log2(p + 1e-12))

# Evenly split node (impure) vs single-class node (pure)
impure_node = np.array([0]*10 + [1]*10)
pure_node = np.array([0]*20)

print(f"Impure - Gini: {gini(impure_node):.2f}, Entropy: {entropy(impure_node):.2f}")
print(f"Pure   - Gini: {gini(pure_node):.2f}, Entropy: {entropy(pure_node):.2f}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

6Šta je k-najbližih suseda (k-nearest neighbors) i kako donosi predikcije za klasifikaciju i regresiju?

k-najbližih suseda (kNN) je neparametrijski, na instancama zasnovan (leni) algoritam nadgledanog učenja. On ne trenira eksplicitni parametarski model; umesto toga, čuva skup podataka za obuku i sve proračune vrši tokom faze inferencije (inference). Tok predikcije: 1. Izračunavanje razdaljine: Kada se evaluira upitna instanca, algoritam računa njenu razdaljinu do svih sačuvanih instanci za obuku koristeći definisanu metriku (kao što su euklidska, Menhetn ili razdaljina Minkovskog). 2. Izbor suseda: Bira $k$ instanci za obuku sa najmanjom razdaljinom do upitne instance. 3. Agregacija: - Klasifikacija: Dodeljuje klasu većinskim glasanjem (mod) među $k$ suseda (ili glasanjem ponderisanim razdaljinom). - Regresija: Predviđa kontinualnu ciljnu vrednost uzimanjem lokalnog proseka (aritmetičke sredine ili medijane) ciljnih vrednosti $k$ suseda (ili proseka ponderisanog razdaljinom). Pošto proračuni razdaljine direktno zavise od razmera obeležja (feature scales), normalizacija ili standardizacija obeležja je ključna kako bi se sprečilo da obeležja velikih magnituda dominiraju u proračunima razdaljine.

from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
from sklearn.preprocessing import StandardScaler
import numpy as np

X_train = np.array([[1000.0, 1.0], [2000.0, 2.0], [1500.0, 1.5], [5000.0, 5.0]])
y_cls = np.array([0, 0, 0, 1])
y_reg = np.array([10.0, 20.0, 15.0, 50.0])

# Feature scaling is mandatory for distance-based algorithms
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)

# 1. Classification (Majority Vote)
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_scaled, y_cls)

# 2. Regression (Local Average)
reg = KNeighborsRegressor(n_neighbors=3)
reg.fit(X_scaled, y_reg)

query = scaler.transform([[1800.0, 1.8]])
print('Classification:', clf.predict(query))
print('Regression:', reg.predict(query))
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

7Formulišite pretpostavku o uslovnoj nezavisnosti kod naivnog Bajesovog klasifikatora (naive Bayes) i objasnite zašto on može dobro funkcionisati čak i kada je ta pretpostavka narušena.

Pretpostavka o uslovnoj nezavisnosti kod naivnog Bajesovog klasifikatora glasi da su, pod uslovom zadate klase Y = y, sva obeležja X_1, X_2, ..., X_d međusobno nezavisna: P(X_1, ..., X_d | Y = y) = \prod_{j=1}^d P(X_j | Y = y). Primenom Bajesove teoreme, aposteriorna verovatnoća je: P(Y = y | X) \propto P(Y = y) \prod_{j=1}^d P(X_j | Y = y), gde je P(Y = y) apriorna verovatnoća klase, a P(X_j | Y = y) uslovna verodostojnost obeležja za datu klasu (npr. Gausova za neprekidna obeležja, multinomijalna za prebrojavanja). Naivni Bajes u praksi često funkcioniše dobro uprkos narušavanju nezavisnosti zato što se klasifikacija oslanja na pravilo odlučivanja argmax (argmax_y P(Y=y | X)), a ne na tačnu kalibraciju verovatnoća. Čak i ako korelacije među obeležjima dovedu do precenjenih ili izobličenih predviđenih verovatnoća, tačna klasa često zadržava najviši relativni rang. Sve dok korelacija ne promeni redosled verodostojnosti klasa, odluka o klasifikaciji 0-1 ostaje tačna.

from sklearn.naive_bayes import GaussianNB
import numpy as np

X = np.array([[1.0, 1.1], [1.2, 0.9], [-1.0, -1.2], [-0.8, -1.1]])
y = np.array([1, 1, 0, 0])

model = GaussianNB()
model.fit(X, y)
# Prediction uses argmax over class posterior scores
print("Predicted class:", model.predict([[1.1, 1.0]]))
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

Pitanja za srednji nivo

8Izvedite ili objasnite analitičko rešenje u zatvorenom obliku za OLS (Ordinary Least Squares) i navedite kada ono jedinstveno postoji.

Ciljna funkcija običnih najmanjih kvadrata (OLS) minimizuje rezidualni zbir kvadrata: $S(\beta) = \|y - X\beta\|^2 = (y - X\beta)^T (y - X\beta) = y^T y - 2\beta^T X^T y + \beta^T X^T X \beta$. Izjednačavanjem gradijenta po $\beta$ sa nulom: $$\nabla_\beta S(\beta) = -2 X^T y + 2 X^T X \beta = 0 \implies X^T X \beta = X^T y$$ Ovo su normalne jednačine. Kada je $X^T X$ nesingularna (invertibilna) matrica, jedinstveno rešenje u zatvorenom obliku glasi: $$\hat{\beta} = (X^T X)^{-1} X^T y$$ Geometrijski, $\hat{y} = X\hat{\beta} = X(X^T X)^{-1} X^T y = H y$ predstavlja ortogonalnu projekciju ciljnog vektora $y$ na prostor kolona matrice dizajna $X$, gde je $H$ projekciona (hat) matrica. Rešenje postoji jedinstveno ako i samo ako je $X^T X$ invertibilna, što zahteva da matrica dizajna $X$ dimenzija $N \times P$ ima pun rang po kolonama ($Rank(X) = P$). To zahteva $N \ge P$ i odsustvo egzaktne multikolinearnosti (nijedno obeležje nije linearna kombinacija drugih). Ako matrica $X$ nema pun rang, $X^T X$ je singularna, što dovodi do beskonačno mnogo rešenja, što se obično rešava regularizacijom ili primenom Mur-Penrouzove pseudoinverzne matrice (Moore-Penrose pseudoinverse) $X^+ y$.

import numpy as np

# Design matrix X (with intercept column) and target y
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4]])
y = np.array([2.1, 3.9, 6.2, 8.0])

# Normal equations: (X^T X)^(-1) X^T y
beta_hat = np.linalg.inv(X.T @ X) @ X.T @ y
H = X @ np.linalg.inv(X.T @ X) @ X.T
y_hat = H @ y

print(f"Beta: {beta_hat}")
print(f"Predictions: {y_hat}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

9Šta je procena maksimalne verodostojnosti (MLE - Maximum Likelihood Estimation) i kako ona dovodi do funkcije cilja unakrsne entropije u logističkoj regresiji?

Procena maksimalne verodostojnosti (MLE - Maximum Likelihood Estimation) je metod za procenu parametara modela $\theta$ odabirom vrednosti koje maksimizuju funkciju verodostojnosti $L(\theta) = P(\mathcal{D}|\theta)$ posmatranog skupa podataka. U binarnoj logističkoj regresiji, svaka oznaka $y_i \in \{0, 1\}$ se modeluje kao nezavisna Bernulijeva slučajna promenljiva uslovljena sa $x_i$, sa verovatnoćom uspeha $p_i = \sigma(w^T x_i + b)$. Funkcija raspodele verovatnoća za opservaciju $i$ glasi $P(y_i|x_i) = p_i^{y_i} (1 - p_i)^{1 - y_i}$. Pod pretpostavkom da su uzorci i.i.d. (nezavisni i identično raspodeljeni), zajednička verodostojnost je: $$L(w, b) = \prod_{i=1}^N p_i^{y_i} (1 - p_i)^{1 - y_i}$$ Primenom prirodnog logaritma proizvod se prevodi u računski pogodniju sumu logaritamskih verodostojnosti: $$\ell(w, b) = \sum_{i=1}^N \left[ y_i \ln(p_i) + (1 - y_i) \ln(1 - p_i) \right]$$ Pošto se optimizacioni algoritmi standardno formulišu kao problemi minimizacije, negiramo logaritamsku verodostojnost i normalizujemo je veličinom uzorka $N$, čime dobijamo negativnu logaritamsku verodostojnost (NLL - Negative Log-Likelihood), što tačno odgovara binarnoj unakrsnoj entropiji (funkciji logaritamskog gubitka): $$J(w, b) = -\frac{1}{N} \sum_{i=1}^N \left[ y_i \ln(p_i) + (1 - y_i) \ln(1 - p_i) \right]$$ Ova funkcija cilja je konveksna u odnosu na linearne logite/težine, pa odgovarajući numerički rešavači optimizuju globalnu funkciju cilja. Stroga konveksnost i konačna jedinstvena MLE procena zahtevaju dodatne uslove kao što su dovoljan rang matrice obeležja, regularizacija i odsustvo savršenog razdvajanja klasa.

import numpy as np

y_true = np.array([1, 0, 1, 1])
y_prob = np.array([0.9, 0.2, 0.8, 0.4])

# Binary cross-entropy (Negative Log-Likelihood)
epsilon = 1e-15  # prevent log(0)
y_prob = np.clip(y_prob, epsilon, 1 - epsilon)
bce_loss = -np.mean(y_true * np.log(y_prob) + (1 - y_true) * np.log(1 - y_prob))

print(f"Binary Cross-Entropy Loss: {bce_loss:.4f}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

10Kako gradijentni spust optimizuje ciljnu funkciju u klasičnom ML-u (Machine Learning), i kako brzina učenja, konvergencija i konveksnost utiču na obuku?

Gradijentni spust minimizuje empirijsku funkciju gubitka iterativnim ažuriranjem parametara modela u suprotnom smeru od gradijenta ciljne funkcije u odnosu na te parametre: $\theta_{t+1} = \theta_t - \eta \nabla L(\theta_t)$. Ključni faktori koji utiču na obuku obuhvataju: 1. Brzina učenja ($\eta$): Kontroliše veličinu koraka. Ako je postavljena na suviše malu vrednost, konvergencija je izuzetno spora i obuka može zastati. Ako je postavljena na preveliku vrednost, ažuriranja će preskočiti minimum, što dovodi do oscilacija ili numeričke divergencije. 2. Konvergencija: Određuje se praćenjem kriterijuma zaustavljanja kao što su mala norma gradijenta ($||\nabla L(\theta)|| \le \epsilon$), minimalna promena parametara ili stagnacija funkcije gubitka kroz uzastopne iteracije. 3. Konveksnost: Kod konveksnih ciljnih funkcija (npr. standardna OLS linearna regresija ili logistička regresija), svaki lokalni minimum je garantovano i globalni minimum, što omogućava pouzdanu konvergenciju gradijentnog spusta uz odgovarajuće veličine koraka. Kod nekonveksnih ciljnih funkcija (npr. višeslojne neuronske mreže), prostor funkcije gubitka sadrži višestruke lokalne minimume, sedlaste tačke i platoe, čineći konačno rešenje osetljivim na inicijalizaciju. 4. Optimizacija nasuprot generalizaciji: Konvergencija na funkciji gubitka skupa za obuku odražava uspeh optimizacije, dok funkcija gubitka na validacionom skupu procenjuje generalizaciju. Postizanje niskog gubitka na obuci uz visoku grešku na validaciji ukazuje na preprilagođavanje (overfitting), a ne na neuspeh optimizacije.

import numpy as np

def gradient_descent(X, y, lr=0.01, max_iters=1000, tol=1e-6):
    n_samples, n_features = X.shape
    theta = np.zeros(n_features)
    prev_loss = float('inf')
    
    for i in range(max_iters):
        predictions = X @ theta
        error = predictions - y
        loss = (1 / (2 * n_samples)) * np.dot(error, error)
        
        if abs(prev_loss - loss) < tol:
            print(f'Converged at iteration {i}')
            break
        prev_loss = loss
        
        grad = (1 / n_samples) * (X.T @ error)
        theta -= lr * grad
        
    return theta
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

11Uporedite L1, L2 i ElasticNet regularizaciju u pogledu proređenosti modela, korelisanih obeležja i praktičnog izbora modela.

L1 (Lasso), L2 (Ridge) i ElasticNet regularizacija razlikuju se po formulaciji kazne, geometriji ograničenja, proređenosti i načinu rukovanja korelisanim prediktorima: 1. Proređenost i geometrija: - L1 koristi kaznu apsolutne vrednosti ($\lambda \|w\|_1$). Njena granica ograničenja je romb/politop sa oštrim temenima na koordinatnim osama. Kada konture funkcije gubitka preseku ove uglove, težine se svode na tačnu nulu, čime se vrši automatska selekcija obeležja. - L2 koristi kaznu kvadratne euklidske norme ($\lambda \|w\|_2^2$). Njena granica ograničenja je glatka hipersfera bez oštrih uglova, koja asimptotski smanjuje težine ka nuli, ali ih retko postavlja na tačnu nulu. 2. Korelisana obeležja: - Pri jakoj kolinearnosti, L1 ima tendenciju da proizvoljno izabere jedno obeležje iz grupe korelisanih prediktora i postavi preostale koeficijente na nulu, što dovodi do nestabilnih procena kroz ponovno uzorkovanje. - L2 zadržava sva korelisana obeležja, raspoređujući težine među njima i smanjujući ih zajedno. 3. ElasticNet: - Kombinuje obe kazne: $\lambda_1 \|w\|_1 + \lambda_2 \|w\|_2^2$ (često parametrizovano sa $\alpha$ i $l_1\_\text{ratio}$). - Pruža proređenost i selekciju obeležja karakterističnu za Lasso, uz očuvanje efekta grupisanja iz Ridge regularizacije, birajući klastere korelisanih prediktora zajedno. Posebno je koristan kada je $p > N$ ili u prisustvu izražene multikolinearnosti.

from sklearn.linear_model import Ridge, Lasso, ElasticNet
import numpy as np

np.random.seed(42)
X1 = np.random.randn(100, 1)
X2 = X1 + np.random.randn(100, 1) * 0.01  # highly correlated
X = np.hstack([X1, X2])
y = 3 * X1.ravel() + np.random.randn(100) * 0.1

ridge = Ridge(alpha=1.0).fit(X, y)
lasso = Lasso(alpha=0.1).fit(X, y)
elastic = ElasticNet(alpha=0.1, l1_ratio=0.5).fit(X, y)

print('Ridge coefs:', ridge.coef_)
print('Lasso coefs:', lasso.coef_)
print('ElasticNet coefs:', elastic.coef_)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

12Koja je razlika između Ridž regresije (Ridge regression), regresije glavnih komponenti (Principal Component Regression – PCR) i metode parcijalnih najmanjih kvadrata (Partial Least Squares – PLS) na konceptualnom nivou?

Ridž regresija, regresija glavnih komponenti (PCR – Principal Component Regression) i metoda parcijalnih najmanjih kvadrata (PLS – Partial Least Squares) su tri linearne tehnike koje se koriste za rešavanje problema multikolinearnosti i visoke dimenzionalnosti, ali se razlikuju po načinu na koji smanjuju varijansu i po tome da li je smanjenje kontinualno ili nadgledano: 1. Ridž regresija: Zadržava svih $p$ originalnih obeležja i primenjuje kontinualno smanjenje (shrinkage) magnituda koeficijenata putem L2 regularizacije. Ne konstruiše latentne komponente niže dimenzionalnosti niti odbacuje dimenzije obeležja; umesto toga, smanjuje varijansu duž pravaca sa malim sopstvenim vrednostima matrice $X^T X$. 2. Regresija glavnih komponenti (PCR): Dvostepena metoda nenadgledanog smanjenja dimenzionalnosti. Prvo primenjuje analizu glavnih komponenti (PCA – Principal Component Analysis) isključivo na matricu prediktora $X$ kako bi pronašla ortogonalne pravce maksimalne varijanse, zadržava prvih $k$ glavnih komponenti i uklapa OLS (Ordinary Least Squares) regresiju na tih $k$ komponenti. Pošto PCA zanemaruje ciljnu promenljivu $y$, PCR nosi rizik odbacivanja komponenti koje imaju malu varijansu u $X$, ali visoku prediktivnu moć za $y$. 3. Metoda parcijalnih najmanjih kvadrata (PLS): Nadgledana metoda smanjenja dimenzionalnosti. Konstruiše $k$ ortogonalnih latentnih komponenti pronalaženjem linearnih kombinacija u $X$ koje maksimizuju kovarijansu između $X$ i odziva $y$. Eksplicitnim uključivanjem informacija o ciljnoj promenljivoj, PLS identifikuje komponente koje objašnjavaju i varijansu obeležja i varijaciju odziva.

from sklearn.linear_model import Ridge, LinearRegression
from sklearn.decomposition import PCA
from sklearn.cross_decomposition import PLSRegression
from sklearn.pipeline import make_pipeline

# 1. Ridge: Regularized full feature space
ridge = Ridge(alpha=1.0)

# 2. PCR: Unsupervised PCA followed by OLS
pcr = make_pipeline(PCA(n_components=2), LinearRegression())

# 3. PLS: Supervised latent component projection and regression
pls = PLSRegression(n_components=2)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

Pitanja za napredni nivo

13Kako savremene implementacije algoritma gradient boosting kao što su XGBoost, LightGBM i CatBoost optimizuju obučavanje ili na različit način obrađuju tabelarne atribute?

Savremeni GBDT (Gradient Boosted Decision Trees) okviri se značajno razlikuju u algoritmima za pronalaženje tačaka deljenja, strategijama rasta stabla i obradi tabelarnih/kategoričkih atributa: 1. XGBoost: Tradicionalno se oslanja na egzaktno pohlepno (greedy) deljenje ili približno deljenje zasnovano na skici kvantila (a kasnije i Fast Hist), koristi rast stabla po nivoima (level-wise / depth-wise), a nedostajuće vrednosti rešava učenjem optimalnog podrazumevanog smera grane tokom pretrage tačke deljenja. 2. LightGBM: Koristi pronalaženje tačaka deljenja zasnovano na histogramima (grupisanje kontinualnih atributa u diskretne intervale, obično 256), rast stabla po listovima (leaf-wise / best-first) radi brže redukcije funkcije gubitka, Gradient-based One-Side Sampling (GOSS) kako bi zadržao instance sa velikim gradijentom dok uzorkuje one sa malim, i Exclusive Feature Bundling (EFB) za spajanje međusobno isključivih retkih atributa. Za kategoričke promenljive pronalazi optimalna deljenja sortiranjem histogramskih korpi ($O(K \log K)$). 3. CatBoost: Koristi simetrična stabla odlučivanja (oblivious decision trees) gde svi čvorovi na datoj dubini dele potpuno isto pravilo deljenja, omogućavajući brzo vektorizovano izračunavanje na CPU/GPU jedinicama. Njegova primarna inovacija jesu naručene ciljne statistike (Ordered Target Statistics) i uređeni boosting, koji računaju statistike ciljne promenljive preko nasumičnih permutacija podataka za obučavanje kako bi se sprečilo curenje ciljne promenljive (target leakage) i pomeranje predikcija.

from catboost import CatBoostClassifier
import lightgbm as lgb
import pandas as pd

df = pd.DataFrame({
    'city': ['NY', 'LDN', 'NY', 'PAR', 'LDN', 'TOK'],
    'age': [25, 42, 30, 22, 55, 38],
    'target': [1, 0, 1, 0, 1, 0]
})
cat_cols = ['city']
df['city'] = df['city'].astype('category')

# LightGBM handles pandas 'category' dtype natively via integer binning
lgb_clf = lgb.LGBMClassifier(max_depth=3, n_estimators=10)
lgb_clf.fit(df[['city', 'age']], df['target'])

# CatBoost handles categorical column names natively with ordered TS
cb_clf = CatBoostClassifier(iterations=10, cat_features=cat_cols, verbose=False)
cb_clf.fit(df[['city', 'age']], df['target'])
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

14Kako biste odlučili da li je prilagođena funkcija gubitka (custom loss) prikladna za model zasnovan na algoritmu povećanja gradijenta (gradient boosting) u uslovima asimetričnih poslovnih troškova?

Odluka o implementaciji prilagođene funkcije gubitka u algoritmu povećanja gradijenta (gradient boosting) pod asimetričnim poslovnim troškovima zahteva procenu da li se asimetrija može obraditi u kasnijoj fazi putem kalibracije verovatnoća i podešavanja praga, ili ona suštinski menja prostor optimizacije tokom izgradnje stabala: 1. Podešavanje praga naspram prilagođene funkcije gubitka: Za klasifikacione zadatke sa asimetričnim troškovima greške (npr. lažno negativni rezultati koštaju $10\times$ više od lažno pozitivnih), standardna unakrsna entropija (cross-entropy) jeste ispravno pravilo ocenjivanja čiji je cilj procena aposteriornih verovatnoća $P(y=1|x)$, ali kalibraciju treba proveriti i po potrebi korigovati na validacionim podacima. Pomeranje praga odlučivanja na osnovu matrice poslovnih troškova $\tau = \frac{C_{FP}}{C_{FP} + C_{FN}}$ ili primena težina uzoraka često je čistije rešenje i izbegava definisanje prilagođenih izvoda. Međutim, za asimetričnu regresiju (npr. asimetrični pinball gubitak za potražnju inventara) ili nelinearne poslovne kazne gde standardne funkcije cilja ne mogu voditi pronalaženje podela, prilagođena funkcija gubitka je opravdana. 2. Matematički zahtevi za GBDT (Gradient Boosted Decision Trees): U modelima drugog reda (XGBoost, LightGBM), prilagođena funkcija gubitka $L(y, \hat{y})$ obično zahteva izračunljive gradijente prvog reda ($g_i = \partial L / \partial \hat{y}_i$) i validne vrednosti zakrivljenosti/Hesijana drugog reda ($h_i = \partial^2 L / \partial \hat{y}_i^2$) za proračun dobitka pri podeli i težina listova ($w^* = -\sum g_i / (\sum h_i + \lambda)$). Hesijani bi trebalo da budu nenegativni ili bezbedno aproksimirani/ograničeni radi numeričke stabilnosti; neke implementacije podržavaju funkcije cilja prvog reda ili približne funkcije, pa je ovaj zahtev specifičan za konkretan radni okvir. Nediferencijabilne ili prekidne poslovne metrike treba zameniti glatkim surogatnim aproksimacijama (npr. Huberizovane ili log-cosh varijante).

import numpy as np
import xgboost as xgb

def asymmetric_mse_objective(preds, dtrain):
    labels = dtrain.get_label()
    residual = preds - labels
    # Penalize underestimation (residual < 0) 5x more heavily than overestimation
    penalty = np.where(residual < 0, 5.0, 1.0)
    grad = 2.0 * penalty * residual
    hess = 2.0 * penalty
    return grad, hess

# Usage:
# model = xgb.train(params, dtrain, obj=asymmetric_mse_objective)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

15Šta je LambdaMART i kako prilagođava gradijentno pojačavanje (gradient boosting) za ciljeve mašinskog učenja za rangiranje (Learning-to-Rank)?

LambdaMART je LTR (Learning-to-Rank) algoritam koji kombinuje MART (Multiple Additive Regression Trees / Gradient Boosting) sa LambdaRank okvirom. Kod rangiranja, ciljne metrike poput NDCG (Normalized Discounted Cumulative Gain) i MAP zavise od diskretnog redosleda sortiranja (rangova), što ih čini ravnim na gotovo svim tačkama i nediferencijabilnim u odnosu na kontinualne rezultate modela. LambdaMART ovo zaobilazi konstruisanjem virtuelnih gradijenata, nazvanih „lambda gradijenti” ($\lambda_{ij}$), za parove stavki $(i, j)$ unutar istog upita. Osnovni gradijent po parovima potiče iz logističkog gubitka na razlike u rezultatima ($s_i - s_j$). LambdaMART skalira ovaj gradijent tačnom promenom ciljne metrike rangiranja ($|\Delta \text{NDCG}_{ij}|$) koja bi nastala ako bi se pozicije dokumenta $i$ i dokumenta $j$ zamenile: $$\lambda_{ij} = \frac{-\sigma}{1 + e^{\sigma(s_i - s_j)}} |\Delta \text{NDCG}_{ij}|$$ Za svaki pojedinačni dokument $i$, neto gradijent se računa agregiranjem lambda vrednosti po parovima za sve parove koji uključuju dokument $i$: $\lambda_i = \sum_{j: j \succ i} \lambda_{ij} - \sum_{k: i \succ k} \lambda_{ki}$. Standardna regresiona stabla u ansamblu pojačavanja zatim prilagođavaju ove složene lambda gradijente po dokumentu u svakoj iteraciji pojačavanja, direktno optimizujući metrike rangiranja na nivou cele liste.

import lightgbm as lgb
import numpy as np

# Simulated query-grouped data: 2 queries with 3 docs each
X = np.random.randn(6, 10)
y = np.array([3, 1, 0, 2, 0, 1])  # Relevance grades (0-3)
group = [3, 3]                     # Query group sizes

train_data = lgb.Dataset(X, label=y, group=group)
params = {
    'objective': 'lambdarank',
    'metric': 'ndcg',
    'ndcg_eval_at': [1, 3],
    'learning_rate': 0.1,
    'n_estimators': 50
}

ranker = lgb.train(params, train_data)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom