1import numpy as np
2from sklearn.metrics import mean_squared_error
3
4def train_gradient_boosted_regressor(
5 X_train, y_train, X_val, y_val,
6 n_estimators=500, lr=0.01, max_depth=4
7):
8 """Gradient boosted regressor with early stopping."""
9
10 residuals = y_train.copy()
11 trees = []
12 val_scores = []
13 best_val, patience_ctr = np.inf, 0
14
15 for i in range(n_estimators):
16 tree = DecisionTreeRegressor(
17 max_depth=max_depth,
18 min_samples_leaf=5
19 )
20 tree.fit(X_train, residuals)
21 pred = tree.predict(X_train)
22 residuals -= lr * pred
23 trees.append((lr, tree))
24
25 val_pred = predict(trees, X_val)
26 val_mse = mean_squared_error(y_val, val_pred)
27 val_scores.append(val_mse)
28
29 if val_mse < best_val - 1e-4:
30 best_val = val_mse
31 patience_ctr = 0
32 else:
33 patience_ctr += 1
34 if patience_ctr >= 20:
35 break
36
37 return trees, val_scores