Какие коэффициенты с помощью ML подбирать?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие коэффициенты подбирать с помощью ML
Введение
В машинном обучении есть различие между коэффициентами (parameters), которые модель обучает сама, и гиперпараметрами, которые мы подбираем вручную. За 10+ лет практики разобрался, какие подходы эффективны для каждого случая.
1. Параметры модели (обучаются автоматически)
Это весовые коэффициенты, которые модель подбирает во время обучения:
Линейная регрессия
from sklearn.linear_model import LinearRegression
X_train = np.array([[1, 2], [2, 3], [3, 4]])
y_train = np.array([1, 2, 3])
model = LinearRegression()
model.fit(X_train, y_train)
print(model.coef_) # [0.5, 0.5]
print(model.intercept_) # 0.0
# y = 0.5*x1 + 0.5*x2 + 0.0
Модель сама подбирает coefficients и intercept минимизируя MSE через нормальное уравнение или градиентный спуск.
Нейронные сети
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dense(64, activation="relu"),
tf.keras.layers.Dense(1)
])
model.compile(optimizer="adam", loss="mse")
model.fit(X_train, y_train, epochs=50)
# Все веса в слоях обучаются автоматически
print(model.get_weights()) # Список матриц весов
2. Гиперпараметры (подбираем вручную или через поиск)
Это конфигурационные параметры, которые влияют на процесс обучения:
Гиперпараметры оптимизатора
from sklearn.linear_model import SGDRegressor
model = SGDRegressor(
learning_rate=0.01, # темп обучения
n_epochs=100, # количество эпох
batch_size=32, # размер батча
momentum=0.9, # момент
random_state=42
)
Методы подбора:
- Grid Search — перебор всех комбинаций
- Random Search — случайный перебор
- Bayesian Optimization — умный поиск
Grid Search пример
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressor
param_grid = {
"n_estimators": [10, 50, 100],
"max_depth": [5, 10, 15],
"min_samples_split": [2, 5, 10]
}
rf = RandomForestRegressor()
grid_search = GridSearchCV(
estimator=rf,
param_grid=param_grid,
cv=5, # 5-fold cross-validation
scoring="neg_mean_squared_error",
n_jobs=-1 # используй все ядра
)
grid_search.fit(X_train, y_train)
print(f"Best params: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")
Random Search (быстрее для больших пространств)
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform
param_dist = {
"n_estimators": randint(10, 200),
"max_depth": randint(5, 30),
"learning_rate": uniform(0.001, 0.1)
}
random_search = RandomizedSearchCV(
estimator=GradientBoostingRegressor(),
param_distributions=param_dist,
n_iter=20, # Попыток
cv=5,
random_state=42,
n_jobs=-1
)
random_search.fit(X_train, y_train)
3. Bayesian Optimization (продвинутый подбор)
Умный алгоритм, который учится из прошлых попыток:
from skopt import gp_minimize
from sklearn.model_selection import cross_val_score
def objective(params):
learning_rate, max_depth = params
model = XGBRegressor(
learning_rate=learning_rate,
max_depth=int(max_depth),
random_state=42
)
# Возвращаем отрицательный скор (для минимизации)
score = -cross_val_score(
model, X_train, y_train,
cv=5,
scoring="neg_mean_squared_error"
).mean()
return score
# Границы параметров
space = [
(0.001, 0.1), # learning_rate
(3, 15) # max_depth
]
result = gp_minimize(
objective,
space,
n_calls=50,
n_initial_points=10,
random_state=42
)
print(f"Best params: learning_rate={result.x[0]}, max_depth={int(result.x[1])}")
4. Коэффициенты регуляризации (важный класс гиперпараметров)
Контролируют сложность модели и предотвращают переобучение:
L1 регуляризация (Lasso)
from sklearn.linear_model import LassoCV
# alpha — коэффициент регуляризации
model = LassoCV(
alphas=np.logspace(-3, 0, 100), # 10^-3 to 10^0
cv=5
)
model.fit(X_train, y_train)
print(f"Best alpha: {model.alpha_}")
L2 регуляризация (Ridge)
from sklearn.linear_model import RidgeCV
model = RidgeCV(
alphas=np.logspace(-3, 3, 100)
)
model.fit(X_train, y_train)
print(f"Best alpha: {model.alpha_}")
Elastic Net (комбинация L1 и L2)
from sklearn.linear_model import ElasticNetCV
model = ElasticNetCV(
alphas=np.logspace(-3, 1, 100),
l1_ratio=[0.1, 0.5, 0.7, 0.9, 0.95], # соотношение L1/L2
cv=5
)
model.fit(X_train, y_train)
5. Dropout и другие техники регуляризации в нейросетях
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Dense(256, activation="relu"),
tf.keras.layers.Dropout(0.5), # отключение 50% нейронов
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(1)
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss="mse"
)
model.fit(X_train, y_train, epochs=50, validation_split=0.2)
6. Early Stopping (дополнительный механизм регуляризации)
early_stopping = tf.keras.callbacks.EarlyStopping(
monitor="val_loss",
patience=10, # остановка если нет улучшений 10 эпох
restore_best_weights=True
)
model.fit(
X_train, y_train,
epochs=1000,
validation_split=0.2,
callbacks=[early_stopping]
)
7. Ensemble методы — подбор весов комбинирования
from sklearn.ensemble import VotingRegressor
from sklearn.linear_model import Ridge
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
voting = VotingRegressor(
estimators=[
(ridge, Ridge()),
(rf, RandomForestRegressor()),
(gb, GradientBoostingRegressor())
],
weights=[1, 2, 3] # Подбираются вручную или через поиск
)
voting.fit(X_train, y_train)
8. Производство: Online Learning и A/B тесты
В боевых условиях параметры иногда нужно подбирать на лету:
from sklearn.linear_model import SGDRegressor
model = SGDRegressor(warm_start=True)
# Обучение на потоке данных
for batch in data_batches:
X_batch, y_batch = batch
model.partial_fit(X_batch, y_batch) # Обновление весов
# Можно менять параметры между батчами
model.learning_rate = 0.01 if epoch < 50 else 0.001
Практические рекомендации
Что подбирать в первую очередь:
- Learning rate — самый важный
- Batch size
- Регуляризация (alpha, dropout)
- Архитектура (глубина, ширина)
- Функции активации
Инструменты для подбора:
- sklearn: GridSearchCV, RandomizedSearchCV
- Optuna: современный фреймворк для оптимизации
- Ray Tune: масштабируемая оптимизация
- Weights & Biases: с историей экспериментов
Заключение
Разница между параметрами (которые обучаются) и гиперпараметрами (которые подбираются) — фундаментальна. Эффективный подбор гиперпараметров — часто важнее выбора алгоритма. Используй методы поиска, а не случайный перебор, и всегда валидируй на отложенном наборе данных.