← Назад к вопросам

Какие коэффициенты с помощью ML подбирать?

2.0 Middle🔥 121 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие коэффициенты подбирать с помощью 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

Практические рекомендации

Что подбирать в первую очередь:

  1. Learning rate — самый важный
  2. Batch size
  3. Регуляризация (alpha, dropout)
  4. Архитектура (глубина, ширина)
  5. Функции активации

Инструменты для подбора:

  • sklearn: GridSearchCV, RandomizedSearchCV
  • Optuna: современный фреймворк для оптимизации
  • Ray Tune: масштабируемая оптимизация
  • Weights & Biases: с историей экспериментов

Заключение

Разница между параметрами (которые обучаются) и гиперпараметрами (которые подбираются) — фундаментальна. Эффективный подбор гиперпараметров — часто важнее выбора алгоритма. Используй методы поиска, а не случайный перебор, и всегда валидируй на отложенном наборе данных.

Какие коэффициенты с помощью ML подбирать? | PrepBro