воскресенье, 29 сентября 2024 г.
четверг, 26 сентября 2024 г.
воскресенье, 15 сентября 2024 г.
Razinkov, RL, Monte, Carlo
Методы Монте-Карло. Контроль: On-Policy. Лекция 5 по обучению с подкреплению.
https://rutube.ru/video/a65ca0a73c9e0df57e90a7a89460a342/
RL, DRL Course 2023,
Практическое занятие 1. Cross-Entropy Method.
https://www.youtube.com/watch?v=6K5F6o93R3k&list=PLTlO6nV_TaGDnoLFO09f1fvR6loAW8vOO&index=2
понедельник, 2 сентября 2024 г.
Regularization
Регуляризация - это важная техника в машинном обучении и математическом моделировании, которая помогает контролировать сложность моделей и избежать переобучения. Вот подробное объяснение:
Основное определение
Регуляризация - это метод, используемый для ограничения размера весовых коэффициентов в нейронных сетях или других моделях машинного обучения, чтобы предотвратить их чрезмерное увеличение во время обучения.
Цель и принцип работы
- Предотвращение переобучения: Регуляризация помогает модели не слишком хорошо запоминать шум в обучающих данных.
- Улучшение обобщающей способности: Это позволяет модели лучше работать на новых, неувиденных данных.
- Ограничение степени свободы: Она ограничивает количество степеней свободы модели, делая ее менее подверженной переобучению.
Типы регуляризаций
- L1-регуляризация:
- Добавляет к функции стоимости термин, пропорциональный абсолютному значению весов.
- Уменьшает веса, но не устанавливает их в ноль.
- L2-регуляризация:
- Добавляет к функции стоимости термин, пропорциональный квадрату весов.
- Часто используется в стандартных нейронных сетях.
- Elastic Net:
- Комбинированный подход, использующий как L1, так и L2 регуляризацию.
- 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 зависит от конкретной задачи и данных. Обычно оно определяется экспериментально:
- Попробуйте несколько значений в диапазоне от 0.001 до 1000.
- Используйте кросс-валидацию для оценки производительности модели.
- Находите значение 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)
воскресенье, 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:
- n_estimators (количество деревьев)
- max_depth (максимальная глубина дерева)
- learning_rate (скорость обучения)
- min_samples_split (минимальное количество образцов для разделения узла)
- 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-кратной кроссвалидации:
- Разделение данных: Общий набор данных разделен на 5 равных фолдов.
- Процесс оценки:
- 4 фолда используются для обучения модели
- 1 фолд используется для оценки модели
- Повторение: Процесс повторяется 5 раз, каждый раз с другим фолдом в качестве тестового набора.
- Оценка: Средняя оценка производительности модели получается за все 5 итераций.
Преимущества 5-кратной кроссвалидации:
- Экономит данные по сравнению с leave-one-out cross-validation
- Меньше чувствителен к случайному выбору фолдов по сравнению с leave-one-out
- Хорошо балансирует между переобучением и недообучением
Недостатки:
- Может быть менее точным для очень маленьких наборов данных
- Не учитывает взаимодействия между фолдами
В контексте вашего кода, вы используете 5-кратную кроссвалидацию в функции evaluate_model:
5-кратная кроссвалидация (5-fold cross-validation) - это метод оценки качества модели, который разделяет данные на 5 равных подмножеств (фолдов). Затем модель обучается на 4 из 5 фолдов и оценивается на оставшемся фолде. Этот процесс повторяется 5 раз, используя каждый фолд в качестве тестового набора один раз.
Основные характеристики 5-кратной кроссвалидации:
- Разделение данных: Общий набор данных разделен на 5 равных фолдов.
- Процесс оценки:
- 4 фолда используются для обучения модели
- 1 фолд используется для оценки модели
- Повторение: Процесс повторяется 5 раз, каждый раз с другим фолдом в качестве тестового набора.
- Оценка: Средняя оценка производительности модели получается за все 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. Вот что означают эти значения:
- Значения отображаются на оси Y.
- Высота столбца соответствует важности признака - выше столбец, тем больше важность признака.
- Общая сумма всех значений равна 1, так как это вероятностный распределитель.
- Признаки с большей высотой столбца более важны для предсказания целевой переменной.
- Признаки с низкой высотой могут быть удалены без существенного влияния на производительность модели.
- Важные признаки обычно связаны напрямую с целевой переменной и содержат полезную информацию для прогнозирования.
- Незначительные признаки могут быть избыточными или неинформативными.
- Сортировка признаков по важности помогает понять, какие факторы наиболее сильно влияют на результат.
- Это инструмент для интерпретации модели и выбора признаков для дальнейшего анализа или использования в других моделях.
- Важно помнить, что важность признака не всегда отражает его абсолютную важность для задачи, а скорее относительное значение в контексте данной конкретной модели.
График позволяет быстро оценить, какие признаки наиболее важны для вашей модели Gradient Boosting Regressor, что может быть полезно для дальнейшего анализа или улучшения модели.
---------------------------------------------------------------------------------------------------------
"Active vs Predicted Values" показывает распределение фактических значений целевой переменной против предсказанных значений модели. Вот что на нем можно увидеть:
- Распределение точек: На графике будут отображены точки, представляющие каждое наблюдение. Каждая точка представляет собой пару (actual value, predicted value).
- Точечная диаграмма: Это тип диаграммы, где каждая точка представляет отдельное наблюдение.
- Отношение фактического и предсказанного: По оси X находятся фактические значения целевой переменной, а по оси Y - предсказанные значения.
- Распределение точек вокруг линии y=x: Идеальные предсказания были бы сосредоточены вдоль линии y=x. Отклонения от этой линии показывают степень дисперсии.
- Вертикальное смещение: Если точки склонны отклоняться вверх или вниз, это может указывать на систематическое смещение модели.
- Распределение точек: Распределение точек вокруг линии y=x может дать представление о том, как хорошо модель справляется с различными уровнями целевой переменной.
- Изолированные точки: Отдаленные точки могут указывать на аномалии или неправильные предсказания.
- Корреляция: Точечная диаграмма также показывает общую направленность распределения точек, что может дать представление о коэффициенте корреляции между фактическими и предсказанными значениями.
Этот график полезен для:
- Проверки наличия систематических ошибок
- Анализа дисперсии предсказаний
- Выявления аномалий в данных или модели
- Оценки общего уровня согласованности между фактическими и предсказанными значениями
Обычно эта диаграмма используется вместе с другими метриками, такими как RMSE или R-squared, для комплексной оценки производительности модели.
----------------------------------------------------------------------------------------------------------
График "Distribution of Residuals" показывает распределение остатков (residuals) между фактическими и предсказанными значениями. Остатки - это разница между фактическим значением и предсказанным значением модели. Вот что на этом графике можно увидеть:
- Распределение остатков: По оси X отображаются остатки, а по оси Y - частота их появления.
- Симметричность: Если распределение примерно симметрично относительно нуля, это может указывать на хорошую работу модели.
- Среднее значение: Вертикальная линия в середине графика показывает среднее значение остатков (обычно около нуля для хорошо обученной модели).
- Медиана: Вертикальная линия слева от среднего показывает медиану (обычно также близко к нулю).
- Распределение: Форма распределения может дать представление о том, как модель справляется с различными уровнями целевой переменной.
- Отсутствие систематических ошибок: Если распределение не склонно отклоняться в одну сторону, это может указывать на отсутствие систематических ошибок в предсказаниях.
- Дисперсия: Широкость распределения может показать дисперсию остатков, что дает представление о точности предсказаний.
- Аномалии: Отдаленные точки могут указывать на аномальные наблюдения или неправильные предсказания.
- Нормальное распределение: Если распределение похоже на нормальное распределение, это может быть признаком хорошей работы модели.
- Смещение: Если распределение смещено в одну сторону, это может указывать на необходимость корректировки модели.
Этот график особенно полезен для:
- Проверки наличия систематических ошибок
- Выявления аномальных наблюдений
- Оценки дисперсии остатков
- Проверки на соответствие распределения нормальному
Обычно этот анализ используется вместе с другими метриками, такими как RMSE или R-squared, для комплексной оценки производительности модели и выявления потенциальных проблем с ее работой.
Gradient, Boost, Boosting
ModelTrainingGradientBoost.pyimport 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()