Настройка гиперпараметров — важный шаг в разработке моделей машинного обучения. Правильный набор гиперпараметров может существенно повлиять на производительность модели. В этой статье мы рассмотрим использование метаэвристических алгоритмов, в частности генетических алгоритмов (ГА) и оптимизации роя частиц (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 для задач регрессии. И генетические алгоритмы, и оптимизация роя частиц являются мощными методами поиска оптимальных или почти оптимальных решений в сложных задачах оптимизации, и они могут значительно повысить производительность моделей машинного обучения. Используя эти алгоритмы, вы можете сэкономить время и силы в процессе настройки гиперпараметров.