понедельник, 2 сентября 2024 г.

Regularization

Регуляризация - это важная техника в машинном обучении и математическом моделировании, которая помогает контролировать сложность моделей и избежать переобучения. Вот подробное объяснение:

Основное определение

Регуляризация - это метод, используемый для ограничения размера весовых коэффициентов в нейронных сетях или других моделях машинного обучения, чтобы предотвратить их чрезмерное увеличение во время обучения.

Цель и принцип работы

  • Предотвращение переобучения: Регуляризация помогает модели не слишком хорошо запоминать шум в обучающих данных.
  • Улучшение обобщающей способности: Это позволяет модели лучше работать на новых, неувиденных данных.
  • Ограничение степени свободы: Она ограничивает количество степеней свободы модели, делая ее менее подверженной переобучению.

Типы регуляризаций

  1. L1-регуляризация:
    • Добавляет к функции стоимости термин, пропорциональный абсолютному значению весов.
    • Уменьшает веса, но не устанавливает их в ноль.
  1. L2-регуляризация:
    • Добавляет к функции стоимости термин, пропорциональный квадрату весов.
    • Часто используется в стандартных нейронных сетях.
  1. Elastic Net:
    • Комбинированный подход, использующий как L1, так и L2 регуляризацию.
  1. Dropout:
    • Отключает случайно выбранные нейроны во время обучения.
    • Эффект аналогичен L2-регуляризации.

Применение в практике

  • В нейронных сетях: Регуляризация добавляется к функции стоимости.
  • В линейных моделях: Используются специальные метрики, такие как Ridge Regression или Lasso.
  • В деревьях решений: Реализована через ограничение глубины дерева.

Преимущества

  • Улучшение обобщающей способности модели.
  • Предотвращение чрезмерного роста весов.
  • Уменьшение риска переобучения.

Недостатки

  • Может сделать модель менее адаптивной к конкретным данным.
  • Требует тщательного выбора гиперпараметров.

Пример кода (Python)

from sklearn.linear_model import LogisticRegression import numpy as np # Создаем синтетические данные X = np.random.rand(1000, 10) y = np.random.randint(0, 2, 1000) # Создаем модель с L2-регуляризацией model = LogisticRegression(penalty='l2', C=0.01) # C - это хиперпараметр регуляризации # Обучаем модель model.fit(X, y) print("Коэффициенты:", model.coef_)

Этот пример демонстрирует использование L2-регуляризации в логистической регрессии с помощью библиотеки scikit-learn.

Регуляризация - это мощный инструмент в арсенале машинного обучения, который помогает создавать более устойчивые и обобщающие модели. Правильное применение регуляризации может значительно улучшить производительность модели на реальных данных.

----------------

В предоставленном коде параметр C действительно является гиперпараметром регуляризации, но его интервал не ограничен только диапазоном [0,1]. Давайте рассмотрим этот вопрос подробнее:

Определение параметра C

Параметр C в контексте LogisticRegression с L2-регуляризацией (penalty='l2') представляет собой обратную величину регуляризационного коэффициента. Он влияет на силу регуляризации:

  • Большее значение C означает меньшую регуляризацию.
  • Меньшее значение C означает большую регуляризацию.

Интервал значения C

Теоретически, C может принимать любое положительное значение. Однако в практических приложениях есть некоторые рекомендации:

  • Обычно C находится в диапазоне от 0.001 до 1000.
  • Значения меньше 0.001 могут привести к сильной регуляризации, что может вызвать переобучение.
  • Значения больше 1000 обычно не используются, так как они приводят к слабой регуляризации.

Примерные значения

  • 0.01 (как в вашем примере) - это довольно маленькое значение, что приводит к сильной регуляризации.
  • 1.0 - это нейтральное значение, где регуляризация равна 1.
  • 100 - это большое значение, что приводит к слабой регуляризации.

Выбор значения C

Выбор оптимального значения C зависит от конкретной задачи и данных. Обычно оно определяется экспериментально:

  1. Попробуйте несколько значений в диапазоне от 0.001 до 1000.
  2. Используйте кросс-валидацию для оценки производительности модели.
  3. Находите значение C, которое дает лучшие результаты на тестовой выборке.

Пример кода для поиска оптимального C

from sklearn.linear_model import LogisticRegression import numpy as np from sklearn.model_selection import GridSearchCV # Создаем синтетические данные X = np.random.rand(1000, 10) y = np.random.randint(0, 2, 1000) # Создаем модель с L2-регуляризацией и параметром C model = LogisticRegression(penalty='l2') # Определяем диапазон значений C для поиска param_grid = {'C': np.logspace(-3, 3, 20)} # Используем кросс-валидацию для поиска оптимального C grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy') grid_search.fit(X, y) print("Оптимальное значение C:", grid_search.best_params_) print("Наилучшая точность:", grid_search.best_score_) # Создаем модель с найденным оптимальным C optimal_model = LogisticRegression(penalty='l2', C=grid_search.best_params_['C']) optimal_model.fit(X, y)

Этот пример демонстрирует, как можно использовать GridSearchCV для автоматического определения оптимального значения C в заданном диапазоне.

Scaler, StandardScaler

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)
X_test_scaled = scaler.transform(x_test)

FinTech

https://spb.hse.ru/ba/dataanalytics/news/476329702.html#:~:text=%D0%98%20%D0%BD%D0%B0%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%2C%20QT%20%E2%80%93%20Quantitative%20Trader,%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D0%B9%2C%20%D0%BA%D0%B0%D0%BA%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE%2C%20%D0%B2%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D1%87%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%BD%D1%8B%D1%85.

воскресенье, 1 сентября 2024 г.

Gradient, Boost

https://gs-ml.blogspot.com/2024/09/gradient-boost-boosting.html

https://www.phind.com/search?cache=ud4cei6pah74jkekibvjrdsx

Оптимизируемые гиперпараметры

В вашем коде вы оптимизируете следующие гиперпараметры Gradient Boosting Regressor:

  1. n_estimators (количество деревьев)
  2. max_depth (максимальная глубина дерева)
  3. learning_rate (скорость обучения)
  4. min_samples_split (минимальное количество образцов для разделения узла)
  5. min_samples_leaf (минимальное количество образцов в листе)

Диапазоны гиперпараметров

Вы определяете диапазоны для каждого гиперпараметра следующим образом:

n_estimators_range = range(50, 301, 50)

max_depth_range = range(3, 11, 2)

learning_rate_range = [0.001, 0.01, 0.1, 0.5]

min_samples_split_range = [2, 5, 10, 15]

min_samples_leaf_range = [1, 2, 4]

param_grid = dict(

    n_estimators=n_estimators_range,

    max_depth=max_depth_range,

    learning_rate=learning_rate_range,

    min_samples_split=min_samples_split_range,

    min_samples_leaf=min_samples_leaf_range

)

Это создает сетку параметров, где каждый гиперпараметр имеет несколько возможных значений.

----------------------------------------------------------------------------

Кроссвалидация

Кроссвалидация выполняется внутри функции evaluate_model, которая вызывается GridSearchCV:

def evaluate_model(params):

    model = GradientBoostingRegressor(**params)

    return -cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error').mean()

  • X_train и y_train используются для обучения модели
  • cv=5 указывает на использование 5-кратной кроссвалидации
  • scoring='neg_mean_squared_error' использует отрицательную среднюю квадратичную ошибку как метрику оценки

GridSearchCV автоматически применяет эту функцию для каждой комбинации параметров, оценивая производительность модели и выбирая лучшую комбинацию параметров.

-----------------------------------------------------------------------------

5-кратная кроссвалидация (5-fold cross-validation) - это метод оценки качества модели, который разделяет данные на 5 равных подмножеств (фолдов). Затем модель обучается на 4 из 5 фолдов и оценивается на оставшемся фолде. Этот процесс повторяется 5 раз, используя каждый фолд в качестве тестового набора один раз.

Основные характеристики 5-кратной кроссвалидации:

  1. Разделение данных: Общий набор данных разделен на 5 равных фолдов.
  1. Процесс оценки:
    • 4 фолда используются для обучения модели
    • 1 фолд используется для оценки модели
  1. Повторение: Процесс повторяется 5 раз, каждый раз с другим фолдом в качестве тестового набора.
  1. Оценка: Средняя оценка производительности модели получается за все 5 итераций.

Преимущества 5-кратной кроссвалидации:

  • Экономит данные по сравнению с leave-one-out cross-validation
  • Меньше чувствителен к случайному выбору фолдов по сравнению с leave-one-out
  • Хорошо балансирует между переобучением и недообучением

Недостатки:

  • Может быть менее точным для очень маленьких наборов данных
  • Не учитывает взаимодействия между фолдами

В контексте вашего кода, вы используете 5-кратную кроссвалидацию в функции evaluate_model:

---------------------------------------------------------------------------

5-кратная кроссвалидация (5-fold cross-validation) - это метод оценки качества модели, который разделяет данные на 5 равных подмножеств (фолдов). Затем модель обучается на 4 из 5 фолдов и оценивается на оставшемся фолде. Этот процесс повторяется 5 раз, используя каждый фолд в качестве тестового набора один раз.

Основные характеристики 5-кратной кроссвалидации:

  1. Разделение данных: Общий набор данных разделен на 5 равных фолдов.
  1. Процесс оценки:
    • 4 фолда используются для обучения модели
    • 1 фолд используется для оценки модели
  1. Повторение: Процесс повторяется 5 раз, каждый раз с другим фолдом в качестве тестового набора.
  1. Оценка: Средняя оценка производительности модели получается за все 5 итераций.

Преимущества 5-кратной кроссвалидации:

  • Экономит данные по сравнению с leave-one-out cross-validation
  • Меньше чувствителен к случайному выбору фолдов по сравнению с leave-one-out
  • Хорошо балансирует между переобучением и недообучением

Недостатки:

  • Может быть менее точным для очень маленьких наборов данных
  • Не учитывает взаимодействия между фолдами

В контексте вашего кода, вы используете 5-кратную кроссвалидацию в функции 

evaluate_model:

return -cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error').mean()

Здесь cv=5 указывает на использование 5-кратной кроссвалидации для оценки производительности модели


Feature Importance, Charts

Признаки на графике "Feature Importance" показывают важность каждого признака для модели Gradient Boosting Regressor. Вот что означают эти значения:

  1. Значения отображаются на оси Y.
  1. Высота столбца соответствует важности признака - выше столбец, тем больше важность признака.
  1. Общая сумма всех значений равна 1, так как это вероятностный распределитель.
  1. Признаки с большей высотой столбца более важны для предсказания целевой переменной.
  1. Признаки с низкой высотой могут быть удалены без существенного влияния на производительность модели.
  1. Важные признаки обычно связаны напрямую с целевой переменной и содержат полезную информацию для прогнозирования.
  1. Незначительные признаки могут быть избыточными или неинформативными.
  1. Сортировка признаков по важности помогает понять, какие факторы наиболее сильно влияют на результат.
  1. Это инструмент для интерпретации модели и выбора признаков для дальнейшего анализа или использования в других моделях.
  1. Важно помнить, что важность признака не всегда отражает его абсолютную важность для задачи, а скорее относительное значение в контексте данной конкретной модели.

График позволяет быстро оценить, какие признаки наиболее важны для вашей модели Gradient Boosting Regressor, что может быть полезно для дальнейшего анализа или улучшения модели.

---------------------------------------------------------------------------------------------------------

"Active vs Predicted Values" показывает распределение фактических значений целевой переменной против предсказанных значений модели. Вот что на нем можно увидеть:

  1. Распределение точек: На графике будут отображены точки, представляющие каждое наблюдение. Каждая точка представляет собой пару (actual value, predicted value).
  1. Точечная диаграмма: Это тип диаграммы, где каждая точка представляет отдельное наблюдение.
  1. Отношение фактического и предсказанного: По оси X находятся фактические значения целевой переменной, а по оси Y - предсказанные значения.
  1. Распределение точек вокруг линии y=x: Идеальные предсказания были бы сосредоточены вдоль линии y=x. Отклонения от этой линии показывают степень дисперсии.
  1. Вертикальное смещение: Если точки склонны отклоняться вверх или вниз, это может указывать на систематическое смещение модели.
  1. Распределение точек: Распределение точек вокруг линии y=x может дать представление о том, как хорошо модель справляется с различными уровнями целевой переменной.
  1. Изолированные точки: Отдаленные точки могут указывать на аномалии или неправильные предсказания.
  1. Корреляция: Точечная диаграмма также показывает общую направленность распределения точек, что может дать представление о коэффициенте корреляции между фактическими и предсказанными значениями.

Этот график полезен для:

  • Проверки наличия систематических ошибок
  • Анализа дисперсии предсказаний
  • Выявления аномалий в данных или модели
  • Оценки общего уровня согласованности между фактическими и предсказанными значениями

Обычно эта диаграмма используется вместе с другими метриками, такими как RMSE или R-squared, для комплексной оценки производительности модели.

----------------------------------------------------------------------------------------------------------

График "Distribution of Residuals" показывает распределение остатков (residuals) между фактическими и предсказанными значениями. Остатки - это разница между фактическим значением и предсказанным значением модели. Вот что на этом графике можно увидеть:

  1. Распределение остатков: По оси X отображаются остатки, а по оси Y - частота их появления.
  1. Симметричность: Если распределение примерно симметрично относительно нуля, это может указывать на хорошую работу модели.
  1. Среднее значение: Вертикальная линия в середине графика показывает среднее значение остатков (обычно около нуля для хорошо обученной модели).
  1. Медиана: Вертикальная линия слева от среднего показывает медиану (обычно также близко к нулю).
  1. Распределение: Форма распределения может дать представление о том, как модель справляется с различными уровнями целевой переменной.
  1. Отсутствие систематических ошибок: Если распределение не склонно отклоняться в одну сторону, это может указывать на отсутствие систематических ошибок в предсказаниях.
  1. Дисперсия: Широкость распределения может показать дисперсию остатков, что дает представление о точности предсказаний.
  1. Аномалии: Отдаленные точки могут указывать на аномальные наблюдения или неправильные предсказания.
  1. Нормальное распределение: Если распределение похоже на нормальное распределение, это может быть признаком хорошей работы модели.
  1. Смещение: Если распределение смещено в одну сторону, это может указывать на необходимость корректировки модели.

Этот график особенно полезен для:

  • Проверки наличия систематических ошибок
  • Выявления аномальных наблюдений
  • Оценки дисперсии остатков
  • Проверки на соответствие распределения нормальному

Обычно этот анализ используется вместе с другими метриками, такими как RMSE или R-squared, для комплексной оценки производительности модели и выявления потенциальных проблем с ее работой.


Gradient, Boost, Boosting

ModelTrainingGradientBoost.py
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
from itertools import product

# Загрузка данных
cali_housing = fetch_california_housing()

X = pd.DataFrame(cali_housing.data, columns=cali_housing.feature_names)
y = pd.Series(cali_housing.target)

# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Определение диапазонов для гиперпараметров
n_estimators_range = range(50, 301, 50)
max_depth_range = range(3, 11, 2)
learning_rate_range = [0.001, 0.01, 0.1, 0.5]
min_samples_split_range = [2, 5, 10, 15]
min_samples_leaf_range = [1, 2, 4]

# Создание всех возможных комбинаций гиперпараметров
param_grid = dict(
n_estimators=n_estimators_range,
max_depth=max_depth_range,
learning_rate=learning_rate_range,
min_samples_split=min_samples_split_range,
min_samples_leaf=min_samples_leaf_range
)


# Функция для оценки модели
def evaluate_model(params):
model = GradientBoostingRegressor(**params)
return -cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error').mean()


# Настройка GridSearchCV
grid_search = GridSearchCV(
estimator=GradientBoostingRegressor(random_state=42),
param_grid=param_grid,
cv=5,
n_jobs=-1,
verbose=2,
error_score='raise',
scoring='neg_mean_squared_error'
)

try:
# Запуск GridSearchCV
grid_search.fit(X_train, y_train)
except Exception as e:
print(f"Произошла ошибка при запуске GridSearchCV: {e}")
else:
# Получаем лучшую модель
best_model = grid_search.best_estimator_

# Оценка лучшей модели на тестовой выборке
y_pred = best_model.predict(X_test)

mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f'Лучшие параметры: {grid_search.best_params_}')
print(f'Mean Squared Error: {mse}')
print(f'Mean Absolute Error: {mae}')
print(f'R^2 Score: {r2}')

# Визуализация важности признаков
feature_importance = best_model.feature_importances_
feature_names = X.columns
plt.figure(figsize=(12, 8))
plt.bar(feature_names, feature_importance)
plt.title('Feature Importance')
plt.xlabel('Features')
plt.ylabel('Importance')
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

# График предсказаний vs реальных значений
plt.figure(figsize=(10, 6))
plt.scatter(y_test, best_model.predict(X_test))
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('Actual Values')
plt.ylabel('Predicted Values')
plt.title('Actual vs Predicted Values')
plt.show()

# Дополнительная проверка на тестовой выборке
scores = cross_val_score(best_model, X_test, y_test, cv=5, scoring='neg_mean_squared_error')
print(f"Cross-validation scores on test set: {-scores}")

# Визуализация распределения ошибок
residuals = y_test - best_model.predict(X_test)
plt.figure(figsize=(10, 6))
plt.hist(residuals, bins=30, edgecolor='black')
plt.axvline(x=np.mean(residuals), color='red', linestyle='dashed', linewidth=2, label=f'Mean: {np.mean(residuals)}')
plt.axvline(x=np.median(residuals), color='green', linestyle='dotted', linewidth=2,
label=f'Median: {np.median(residuals)}')
plt.title('Distribution of Residuals')
plt.xlabel('Residuals')
plt.ylabel('Frequency')
plt.legend()
plt.show()

# Визуализация важности признаков по группам
group_feature_importance = {}
for i in range(len(feature_importance)):
if not round(feature_importance[i], 2) in group_feature_importance:
group_feature_importance[round(feature_importance[i], 2)] = []
group_feature_importance[round(feature_importance[i], 2)].append(i)

plt.figure(figsize=(12, 6))
for importance, indices in sorted(group_feature_importance.items()):
plt.bar(range(indices[-len(indices):]), [feature_importance[i] for i in indices[-len(indices):]],
label=f'{importance:.2f}')
plt.title('Grouped Feature Importances')
plt.xlabel('Features')
plt.ylabel('Importance')
plt.legend()
plt.show()