Ответ
При прочих равных условиях (например, при использовании неглубоких деревьев) начальное смещение (bias) обычно выше у алгоритма случайного леса (Random Forest).
Почему так:
-
Случайный лес (Random Forest): Это бэггинг-ансамбль. Он строит множество независимых, недообученных (high-bias) деревьев (часто с небольшой глубиной) и усредняет их предсказания. Усреднение помогает снизить дисперсию, но не сильно уменьшает смещение, заложенное в каждом слабом ученике.
-
Градиентный бустинг (Gradient Boosting): Это бустинг-ансамбль. Он строит деревья последовательно, где каждое новое дерево обучается предсказывать остатки (ошибки) предыдущих моделей. Этот процесс целенаправленно уменьшает смещение на каждой итерации. Первое дерево в бустинге действительно имеет высокое смещение, но каждое последующее его корректирует.
Простая аналогия:
- Случайный лес: Спросить мнение 100 первокурсников и усреднить его. Средний ответ будет стабильным (низкая дисперсия), но может быть далёк от истины (высокое смещение).
- Бустинг: Спросить эксперта, затем спросить другого эксперта, где ошибся первый, затем третьего — где ошибся предыдущий дуэт, и т.д. Итоговый ответ будет гораздо точнее (низкое смещение).
Практический пример:
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# Генерируем нелинейные данные
X = np.random.rand(1000, 5)
y = X[:, 0]**2 + np.sin(X[:, 1]*10) + np.random.randn(1000)*0.1
X_train, X_test, y_train, y_test = train_test_split(X, y)
# Слабое дерево (высокий bias)
weak_tree = DecisionTreeRegressor(max_depth=2)
weak_tree.fit(X_train, y_train)
# Случайный лес из слабых деревьев
rf = RandomForestRegressor(n_estimators=100, max_depth=2)
rf.fit(X_train, y_train)
# Градиентный бустинг из слабых деревьев
gb = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=2)
gb.fit(X_train, y_train)
# Оцениваем bias как ошибку на обучающей выборке
print(f"Bias (Weak Tree): {mean_squared_error(y_train, weak_tree.predict(X_train)):.4f}")
print(f"Bias (Random Forest): {mean_squared_error(y_train, rf.predict(X_train)):.4f}")
print(f"Bias (Gradient Boosting): {mean_squared_error(y_train, gb.predict(X_train)):.4f}")
# Скорее всего, bias у Random Forest будет ближе к Weak Tree, а у Boosting — значительно ниже.