Настройка гиперпараметров — важный шаг в разработке моделей машинного обучения. Правильный набор гиперпараметров может существенно повлиять на производительность модели. В этой статье мы рассмотрим использование метаэвристических алгоритмов, в частности генетических алгоритмов (ГА) и оптимизации роя частиц (PSO), для настройки гиперпараметров. Мы применим эти алгоритмы для оптимизации гиперпараметров регрессора опорных векторов (SVR) с использованием библиотеки MEALPY.

Введение

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

Набор данных и предварительная обработка

Мы начнем с загрузки и предварительной обработки нашего набора данных. В этом примере мы будем использовать библиотеку MEALPY для оптимизации гиперпараметров модели SVR для задач регрессии. Набор данных загружается с помощью Pandas, а этапы предварительной обработки данных включают стандартное масштабирование и разделение на обучающие тесты.
Я бы начал с импорта необходимых библиотек.

from sklearn.svm import SVR #Regression Model
import pandas as pd # For data wrangling
from sklearn.model_selection import train_test_split # For data splitting
from sklearn.preprocessing import StandardScaler # For normal distribution of the data 
from sklearn.metrics import mean_squared_error,r2_score # For model evaluation
from mealpy.evolutionary_based.GA import BaseGA # metaheuristic algorithm for optimization and hyperparameter tuning
from mealpy.swarm_based.PSO import CL_PSO # metaheuristic algorithm for optimization and hyperparameter tuning
import numpy as np # for mathematical manipulation

Теперь давайте загрузим наши данные в фрейм данных pandas.

data = pd.read_excel(r"C:\Users\USER\Desktop\datasets\data 1.xlsx")
data.head()

Затем мы разделили и масштабировали данные для моделирования.

X = data.drop(columns="Y")
y = data["Y"]

X1 = X.values
y1 = y.values.reshape(-1, 1)
X_train1, X_test1, y_train1, y_test1 = train_test_split(X1, y1, test_size=0.2, random_state=8)

sc = StandardScaler()
X_train1 = sc.fit_transform(X_train1)
X_test1 = sc.transform(X_test1)

sc_y = StandardScaler()
y_train1 = sc_y.fit_transform(y_train1)
y_test1 = sc_y.transform(y_test1)

Генетический алгоритм настройки гиперпараметров

Мы начнем с генетических алгоритмов для настройки гиперпараметров. Генетические алгоритмы моделируют процесс естественного отбора для создания популяции потенциальных решений проблемы. Мы будем использовать BaseGA MEALPY для оптимизации гиперпараметров SVR. Начнем с определения нашей фитнес-функции.

# Define the SVR fitness function
def svr_fitness(solution):
    kernel_encoded = int(solution[0])
    c = solution[1]
    gamma = solution[2]
    epsilon = solution[3]
    
    kernel_decoded = ['linear', 'poly', 'rbf', 'precomputed'][kernel_encoded]
    
    svr = SVR(C=c, kernel=kernel_decoded, gamma=gamma, epsilon=epsilon)
    svr.fit(X_train1, y_train1.ravel())
    y_predict = svr.predict(X_test1)
    fitness = - r2_score(y_test1, y_predict)  # Minimize negative R^2 score
    return fitness

Определение границ гиперпараметров

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

1. Ядро: этот гиперпараметр определяет тип ядра, которое будет использоваться в модели регрессии опорных векторов (SVR). Он кодируется с использованием целочисленных значений [0, 1, 2, 3], представляющих различные типы ядра: линейное, полиномиальное (полиномиальное), радиальную базисную функцию (rbf) и предварительно вычисленное.

2. C : Параметр C управляет компромиссом между достижением низкой ошибки обучения и низкой ошибкой тестирования. Он представляет силу регуляризации и помогает предотвратить переоснащение. Диапазон значений [100, 1000] разделен на 100-кратные приращения, что позволяет исследовать различные степени регуляризации.

3. Гамма : Гамма — это коэффициент ядра для ядер «rbf» и «poly». Он определяет влияние каждого обучающего примера и влияет на гладкость границы решения. Значения выбираются логарифмически в диапазоне от 1e-10 до 1.

4. Эпсилон : Эпсилон — это эпсилон в функции потерь, нечувствительной к эпсилон, для SVR. Он контролирует допустимую погрешность при прогнозировании целевых значений. Как и гамма, значения эпсилон логарифмически дискретизируются в диапазоне от 1e-3 до 1.

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

# Define the hyperparameter bounds
param_bounds = {
    "kernel": [0, 1, 2, 3],  # 0: linear, 1: poly, 2: rbf 3: precomputed
    "C": list(range(100, 1001, 100)),
    "gamma": list(np.logspace(-10, 0, 10)),
    "epsilon": list(np.logspace(-3, 0, 10))
}

Определение проблемы оптимизации

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

fit_func: фитнес-функция является ключевым компонентом процесса оптимизации. Он количественно определяет, насколько хорошо набор гиперпараметров работает с точки зрения точности модели. В этом случае «svr_fitness» используется в качестве функции пригодности, оценивая отрицательную оценку R² прогнозов модели SVR.

lb: нижние границы определяют минимально допустимые значения для каждого гиперпараметра. Эти границы гарантируют, что алгоритм исследует допустимый диапазон конфигураций гиперпараметров. Нижние границы устанавливаются с использованием минимальных значений, извлеченных из param_bounds.

ub: наоборот, верхние границы устанавливают максимально допустимые значения для гиперпараметров. Эти границы ограничивают пространство исследования в разумных пределах. Верхние границы определяются максимальными значениями из `param_bounds`.

minmax: этот ключ определяет, связана ли проблема с минимизацией или максимизацией. Целью настройки гиперпараметров является минимизация функции пригодности (отрицательная оценка R²), обозначенная как «мин».

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

# Define the optimization problem dictionary
svr_problem = {
    "fit_func": svr_fitness,
    "lb": [min(param_bounds["kernel"]), min(param_bounds["C"]), min(param_bounds["gamma"]), min(param_bounds["epsilon"])],
    "ub": [max(param_bounds["kernel"]), max(param_bounds["C"]), max(param_bounds["gamma"]), max(param_bounds["epsilon"])],
    "minmax": "min"  # Minimize fitness (negative R^2)
}

Создание модели генетического алгоритма

Генетический алгоритм (ГА) служит механизмом оптимизации для изучения пространства гиперпараметров и выявления наиболее перспективных конфигураций. В этом разделе описывается процесс построения модели GA с использованием библиотеки MEALPY.

epoch = 50            # Number of generations/epochs
pop_size = 100        # Size of the population in each generation
pc = 0.95             # Crossover probability
pm = 0.05             # Mutation probability

# Instantiate the Genetic Algorithm model
ga_model = BaseGA(epoch, pop_size, pc, pm)
  • эпоха: количество поколений или итераций, которые будет выполнять GA. Каждое поколение включает в себя эволюцию популяции, основанную на скрещивании и мутации.
  • pop_size: размер популяции в каждом поколении. Большая популяция потенциально может привести к лучшему исследованию пространства поиска.
  • pc: вероятность кроссинговера, которая определяет, как часто особи в популяции будут подвергаться кроссинговеру для создания нового потомства.
  • pm: вероятность мутации, определяющая вероятность внесения небольших случайных изменений в отдельные особи в популяции.

После построения модели ГА следующим шагом является решение задачи оптимизации с использованием генетического алгоритма.

# Solve the optimization problem using the genetic algorithm
best_params, best_fitness = ga_model.solve(svr_problem)
2023/08/08 10:15:24 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: Solving single objective optimization problem.
2023/08/08 10:15:27 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 1, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.50302 seconds
2023/08/08 10:15:29 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 2, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.38361 seconds
2023/08/08 10:15:30 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 3, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.45136 seconds
2023/08/08 10:15:32 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 4, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.51826 seconds
2023/08/08 10:15:34 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 5, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 2.03275 seconds
2023/08/08 10:15:35 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 6, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.70323 seconds
2023/08/08 10:15:37 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 7, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.29202 seconds
2023/08/08 10:15:38 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 8, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.30940 seconds
2023/08/08 10:15:39 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 9, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.13348 seconds
2023/08/08 10:15:41 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 10, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.48909 seconds
2023/08/08 10:15:42 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 11, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 0.98406 seconds
2023/08/08 10:15:43 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 12, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.11401 seconds
2023/08/08 10:15:44 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 13, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.46043 seconds
2023/08/08 10:15:46 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 14, Current best: -0.8803839866677826, Global best: -0.8803839866677826, Runtime: 1.43844 seconds
2023/08/08 10:15:47 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 15, Current best: -0.8803839866677826, Global best: -0.8803839866677826, Runtime: 1.17525 seconds
2023/08/08 10:15:48 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 16, Current best: -0.8803839866677826, Global best: -0.8803839866677826, Runtime: 1.47366 seconds
2023/08/08 10:15:49 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 17, Current best: -0.8941071936072994, Global best: -0.8941071936072994, Runtime: 1.08602 seconds
2023/08/08 10:15:51 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 18, Current best: -0.8960245823511305, Global best: -0.8960245823511305, Runtime: 1.06896 seconds
2023/08/08 10:15:52 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 19, Current best: -0.9558305569023439, Global best: -0.9558305569023439, Runtime: 1.08948 seconds
2023/08/08 10:15:53 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 20, Current best: -0.9636627347273975, Global best: -0.9636627347273975, Runtime: 1.06011 seconds
2023/08/08 10:15:54 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 21, Current best: -0.9644962424849841, Global best: -0.9644962424849841, Runtime: 0.91661 seconds
2023/08/08 10:15:55 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 22, Current best: -0.9646775662235703, Global best: -0.9646775662235703, Runtime: 0.91448 seconds
2023/08/08 10:15:56 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 23, Current best: -0.9646775662235703, Global best: -0.9646775662235703, Runtime: 1.23127 seconds
2023/08/08 10:15:57 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 24, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.02627 seconds
2023/08/08 10:15:59 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 25, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 2.55495 seconds
2023/08/08 10:16:02 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 26, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 2.57574 seconds
2023/08/08 10:16:04 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 27, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 2.09470 seconds
2023/08/08 10:16:05 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 28, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 0.93346 seconds
2023/08/08 10:16:06 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 29, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.35720 seconds
2023/08/08 10:16:07 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 30, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.16948 seconds
2023/08/08 10:16:09 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 31, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.66557 seconds
2023/08/08 10:16:10 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 32, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.22858 seconds
2023/08/08 10:16:11 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 33, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.02662 seconds
2023/08/08 10:16:12 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 34, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.05620 seconds
2023/08/08 10:16:14 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 35, Current best: -0.9703544238550341, Global best: -0.9703544238550341, Runtime: 1.07375 seconds
2023/08/08 10:16:14 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 36, Current best: -0.9703544238550341, Global best: -0.9703544238550341, Runtime: 0.93133 seconds
2023/08/08 10:16:15 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 37, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.86276 seconds
2023/08/08 10:16:16 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 38, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.84094 seconds
2023/08/08 10:16:17 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 39, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.85900 seconds
2023/08/08 10:16:18 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 40, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.84072 seconds
2023/08/08 10:16:19 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 41, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.64984 seconds
2023/08/08 10:16:34 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 42, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 15.36737 seconds
2023/08/08 10:16:40 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 43, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 5.57040 seconds
2023/08/08 10:16:43 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 44, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.64214 seconds
2023/08/08 10:16:46 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 45, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 2.66113 seconds
2023/08/08 10:16:49 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 46, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.55517 seconds
2023/08/08 10:16:54 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 47, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 4.36036 seconds
2023/08/08 10:16:57 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 48, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.30097 seconds
2023/08/08 10:16:59 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 49, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 2.38395 seconds
2023/08/08 10:17:03 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 50, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.13199 seconds

Интерпретация оптимальных гиперпараметров

После запуска генетического алгоритма мы получаем оптимальные гиперпараметры, повышающие производительность модели регрессии опорных векторов (SVR). В этом разделе расшифровывается и представлена ​​лучшая конфигурация гиперпараметров, проливающая свет на ключевые варианты, которые способствуют успеху модели.

best_kernel_encoded = int(best_params[0])
best_c = best_params[1]
best_gamma = best_params[2]
best_epsilon = best_params[3]
best_kernel_decoded = ['linear', 'poly', 'rbf', 'precomputed'][best_kernel_encoded]

print("Best Hyperparameters using GA:")
print("Kernel:", best_kernel_decoded)
print("C:", best_c)
print("Gamma:", best_gamma)
print("Epsilon:", best_epsilon)
print("Best Fitness (R^2):", -best_fitness)  # Convert back to positive (R^2)

Затем мы создадим модель SVR с оптимизированными гиперпараметрами из генетического алгоритма и оценим ее производительность как в тестовом, так и в обучающем наборах, используя показатель R².

# Create SVR model with optimized hyperparameters from GA
svr_optimized = SVR(kernel=best_kernel_decoded, C=best_c, gamma=best_gamma, epsilon=best_epsilon)
svr_optimized.fit(X_train1, y_train1.ravel())

# Make predictions on train and test set and calculate R^2 score
pred_test = svr_optimized.predict(X_test1)
pred_train = svr_optimized.predict(X_train1)
r2_test = r2_score(y_test1, pred_test)
r2_train = r2_score(y_train1, pred_train)
print("R^2 score of Train set prediction using GA:", r2_train)
print("R^2 score of Test set prediction using GA:", r2_test)
R^2 score of Test set prediction using GA: 0.978509667165826
R^2 score of Train set prediction using GA: 0.9789348583806831

Приведенная выше оценка показывает, насколько мощным является генетический алгоритм при поиске оптимальных гиперпараметров модели. Чтобы дополнительно проверить мастерство метаэвристического алгоритма для настройки гиперпараметров, мы кратко использовали реализацию оптимизации роя частиц (PSO), как мы сделали с генетическим алгоритмом (GA).

from mealpy.swarm_based.PSO import CL_PSO

# Defining the PSO Algorithm
epoch = 50           # Number of generations/epochs
pop_size = 100       # Size of the swarm in each generation
c_local = 1.2        # Local cognitive coefficient
w_min = 0.4          # Minimum inertia weight
w_max = 0.9          # Maximum inertia weight
max_flag = 7         # Maximum number of particles to be replaced

# Instantiate the PSO model
pso_model = CL_PSO(epoch, pop_size, c_local, w_min, w_max, max_flag)
  • c_local: локальный когнитивный коэффициент, влияющий на вес предыдущей лучшей позиции частицы.
  • w_min и w_max: они определяют минимальный и максимальный веса инерции, регулируя баланс между разведкой и эксплуатацией.
  • max_flag: максимальное количество частиц, которые будут заменены во время итерации, увеличивая разнообразие.

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

# Solve the optimization problem using the PSO algorithm
best_params_pso, best_fitness_pso = pso_model.solve(svr_problem)
2023/08/08 10:15:24 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: Solving single objective optimization problem.
2023/08/08 10:15:27 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 1, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.50302 seconds
2023/08/08 10:15:29 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 2, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.38361 seconds
2023/08/08 10:15:30 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 3, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.45136 seconds
2023/08/08 10:15:32 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 4, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.51826 seconds
2023/08/08 10:15:34 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 5, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 2.03275 seconds
2023/08/08 10:15:35 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 6, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.70323 seconds
2023/08/08 10:15:37 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 7, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.29202 seconds
2023/08/08 10:15:38 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 8, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.30940 seconds
2023/08/08 10:15:39 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 9, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.13348 seconds
2023/08/08 10:15:41 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 10, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.48909 seconds
2023/08/08 10:15:42 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 11, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 0.98406 seconds
2023/08/08 10:15:43 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 12, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.11401 seconds
2023/08/08 10:15:44 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 13, Current best: -0.8551661748697635, Global best: -0.8551661748697635, Runtime: 1.46043 seconds
2023/08/08 10:15:46 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 14, Current best: -0.8803839866677826, Global best: -0.8803839866677826, Runtime: 1.43844 seconds
2023/08/08 10:15:47 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 15, Current best: -0.8803839866677826, Global best: -0.8803839866677826, Runtime: 1.17525 seconds
2023/08/08 10:15:48 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 16, Current best: -0.8803839866677826, Global best: -0.8803839866677826, Runtime: 1.47366 seconds
2023/08/08 10:15:49 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 17, Current best: -0.8941071936072994, Global best: -0.8941071936072994, Runtime: 1.08602 seconds
2023/08/08 10:15:51 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 18, Current best: -0.8960245823511305, Global best: -0.8960245823511305, Runtime: 1.06896 seconds
2023/08/08 10:15:52 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 19, Current best: -0.9558305569023439, Global best: -0.9558305569023439, Runtime: 1.08948 seconds
2023/08/08 10:15:53 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 20, Current best: -0.9636627347273975, Global best: -0.9636627347273975, Runtime: 1.06011 seconds
2023/08/08 10:15:54 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 21, Current best: -0.9644962424849841, Global best: -0.9644962424849841, Runtime: 0.91661 seconds
2023/08/08 10:15:55 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 22, Current best: -0.9646775662235703, Global best: -0.9646775662235703, Runtime: 0.91448 seconds
2023/08/08 10:15:56 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 23, Current best: -0.9646775662235703, Global best: -0.9646775662235703, Runtime: 1.23127 seconds
2023/08/08 10:15:57 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 24, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.02627 seconds
2023/08/08 10:15:59 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 25, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 2.55495 seconds
2023/08/08 10:16:02 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 26, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 2.57574 seconds
2023/08/08 10:16:04 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 27, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 2.09470 seconds
2023/08/08 10:16:05 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 28, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 0.93346 seconds
2023/08/08 10:16:06 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 29, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.35720 seconds
2023/08/08 10:16:07 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 30, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.16948 seconds
2023/08/08 10:16:09 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 31, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.66557 seconds
2023/08/08 10:16:10 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 32, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.22858 seconds
2023/08/08 10:16:11 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 33, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.02662 seconds
2023/08/08 10:16:12 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 34, Current best: -0.9647564434251795, Global best: -0.9647564434251795, Runtime: 1.05620 seconds
2023/08/08 10:16:14 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 35, Current best: -0.9703544238550341, Global best: -0.9703544238550341, Runtime: 1.07375 seconds
2023/08/08 10:16:14 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 36, Current best: -0.9703544238550341, Global best: -0.9703544238550341, Runtime: 0.93133 seconds
2023/08/08 10:16:15 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 37, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.86276 seconds
2023/08/08 10:16:16 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 38, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.84094 seconds
2023/08/08 10:16:17 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 39, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.85900 seconds
2023/08/08 10:16:18 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 40, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.84072 seconds
2023/08/08 10:16:19 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 41, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 0.64984 seconds
2023/08/08 10:16:34 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 42, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 15.36737 seconds
2023/08/08 10:16:40 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 43, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 5.57040 seconds
2023/08/08 10:16:43 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 44, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.64214 seconds
2023/08/08 10:16:46 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 45, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 2.66113 seconds
2023/08/08 10:16:49 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 46, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.55517 seconds
2023/08/08 10:16:54 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 47, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 4.36036 seconds
2023/08/08 10:16:57 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 48, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.30097 seconds
2023/08/08 10:16:59 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 49, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 2.38395 seconds
2023/08/08 10:17:03 AM, INFO, mealpy.swarm_based.PSO.CL_PSO: >Problem: P, Epoch: 50, Current best: -0.9719079046215082, Global best: -0.9719079046215082, Runtime: 3.13199 seconds

Хорошо, давайте посмотрим на оптимизированные гиперпараметры и производительность.

pso_best_kernel_encoded = int(best_params_pso[0])
pso_best_c = best_params_pso[1]
pso_best_gamma = best_params_pso[2]
pso_best_epsilon = best_params_pso[3]
pso_best_kernel_decoded = ['linear', 'poly', 'rbf', 'precomputed'][pso_best_kernel_encoded]

print("Best Hyperparameters using PSO:")
print("Kernel:", pso_best_kernel_decoded)
print("C:", pso_best_c)
print("Gamma:", pso_best_gamma)
print("Epsilon:", pso_best_epsilon)
print("Best Fitness (R^2):", -best_fitness_pso)  # Convert back to positive (R^2)

Теперь мы создадим модель SVR с оптимизированными гиперпараметрами из алгоритма PSO и оценим ее производительность как в тестовом, так и в обучающем наборах, используя показатель R².

# Create SVR model with optimized hyperparameters from PSO
svr_optimized_pso = SVR(kernel=pso_best_kernel_decoded, C=pso_best_c, gamma=pso_best_gamma, epsilon=pso_best_epsilon)
svr_optimized_pso.fit(X_train1, y_train1.ravel())

# Make predictions on train and test set and calculate R^2 score
pred_train_pso = svr_optimized_pso.predict(X_train1)
pred_test_pso = svr_optimized_pso.predict(X_test1)

r2_train_pso = r2_score(y_train1, pred_train_pso)
r2_test_pso = r2_score(y_test1, pred_test_pso)

print("R^2 score of Train set prediction using PSO:", r2_train_pso)
print("R^2 score of test set prediction using PSO:", r2_test_pso)
R^2 score of Train set prediction using PSO: 0.978840873734026
R^2 score of test set prediction using PSO : 0.9719079046215082

Да, хорошая производительность, доказательство эффективной настройки гиперпараметров с помощью метаэвристического алгоритма.

Заключение

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