Оптимальное сочетание переменных для минимизации выхода.

Вопрос или проблема

Честно говоря, я не на 100% уверен, насколько это проблема программирования или проблема науки о данных, но я рискну. Я разработал матрицу, состоящую из различных гиперпараметров, цель этих гиперпараметров – минимизировать значения определенного вывода, моя задача – найти две комбинации: одна, которая минимизирует вывод до значения ниже 10, и другая, которая даст мне наименьшее возможное значение вывода.
Я могу найти эти значения вручную, используя простую корреляционную матрицу, или просто поигравшись с значениями, но у меня возникают проблемы, когда я пытаюсь придумать идеи, как сделать этот процесс автоматическим с помощью кода на Python.

Чтобы привести пример того, как выглядят данные:

| Параметр 1 | Параметр 2 | Параметр 3 | Параметр 4 | Вывод |
|————–|————–|—————|————–|———-|
| 0.5_________ | 1___________ | 0.003_______ | 5___________ | 10 _____ |
| 0.5_________ | 1___________ | 0.003_______ | 15__________ | 8 ______ |
| 0.5_________ | 1___________ | 0.003_______ | 20__________ | 5 ______ |
| 0.5_________ | 1___________ | 0.005_______ | 5___________ | 45 _____ |
| 0.5_________ | 1___________ | 0.005_______ | 15__________ | 23 _____ |
| 0.5_________ | 1___________ | 0.005_______ | 20__________ | 235 ____ |
| 0.5_________ | 3___________ | 0.003_______ | 5___________ | 9 ______ |
| 0.5_________ | 3___________ | 0.003_______ | 15__________ | 7 ______ |
| 0.5_________ | 3___________ | 0.003_______ | 20__________ | 10 _____ |
| 0.5_________ | 3___________ | 0.005_______ | 5___________ | 45 _____ |
| 0.5_________ | 3___________ | 0.005_______ | 15__________ | 150 ____ |
| 0.5_________ | 3___________ | 0.005_______ | 20__________ | 85 _____ |
| 0.1_________ | 1___________ | 0.003_______ | 5___________ | 2 ______ |
| 0.1_________ | 1___________ | 0.003_______ | 15__________ | 3 ______ |
| 0.1_________ | 1___________ | 0.003_______ | 20__________ | 4 ______ |
| 0.1_________ | 1___________ | 0.005_______ | 5___________ | 15 _____ |
| 0.1_________ | 1___________ | 0.005_______ | 15__________ | 11 _____ |
| 0.1_________ | 1___________ | 0.005_______ | 20__________ | 17 _____ |
| 0.1_________ | 3___________ | 0.003_______ | 5___________ | 3 ______ |
| 0.1_________ | 3___________ | 0.003_______ | 15__________ | 1 ______ |
| 0.1_________ | 3___________ | 0.003_______ | 20__________ | 4 ______ |
| 0.1_________ | 3___________ | 0.005_______ | 5___________ | 75 _____ |
| 0.1_________ | 3___________ | 0.005_______ | 15__________ | 250 ____ |
| 0.1_________ | 3___________ | 0.005_______ | 20__________ | 95 _____ |

Таким образом, видно, что параметры 1 и 3 имеют значимость, так как меньшие значения этих параметров коррелируют с меньшими значениями вывода, что легко заметить при ручной работе с этими данными. Однако у меня нет идеи, как автоматизировать это в Python. Я не знаю, является ли это исключительно проблемой кода или это связано с использованием какой-то конкретной библиотеки/модели, чтобы получить наименьшие значения вывода.

Если кто-то сможет меня в этом направить, я буду весьма признателен.

Вот пример файла: Пример данных

Заранее спасибо.

Импортируйте и загрузите данные:

import pandas as pd
data = pd.read_csv('sample_parameters.csv')

Чтобы получить строки/параметры ниже 10, вы можете отфильтровать следующим образом:

rows_below10 = data[data.Output < 10]

Строки, которые дают наименьший Output, можно получить следующим образом (существует несколько строк, которые соответствуют этому условию):

min_rows = data[data.Output == data.Output.min()]

Визуализация первых 3000 строк, отсортированных по Output (черная линия обозначает Output > 10.

введите описание изображения здесь

#Визуализация
from matplotlib import pyplot as plt

f, axs = plt.subplots(ncols=data.shape[1], figsize=(8, 4), layout="tight")

data_sorted = data.sort_values(by='Output')[:3000]
for col, ax in zip(data_sorted.columns, axs):
    im = ax.matshow(data_sorted[[col]].values, aspect="auto", cmap='OrRd')
    ax.axis('off')
    ax.set_title(col, fontsize=8)

cb = f.colorbar(mappable=im, ax=axs[-1], label="вывод")
f.subplots_adjust(wspace=0.1)
f.suptitle(f'Первые {len(data_sorted)} строк (отсортировано)')

#Отметить расположение Output > 10
axs[-1].axhline(
    np.argwhere(data_sorted.Output < 10)[-1],
    color="black", linewidth=2, linestyle=":"
)

Библиотека scikit-learn имеет функционал для автоматического выбора/настройки гиперпараметров. В ней есть такие опции, как GridSearchCV для выполнения поиска по всей сетке возможных комбинаций гиперпараметров и RandomizedSearchCV для выборки комбинаций гиперпараметров и их оценки. Также есть и другие схемы.

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

Два примера с страницы примеров sklearn: 1, 2.

Ответ или решение

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

Шаг 1: Импорт библиотек и загрузка данных

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

import pandas as pd

# Загрузка данных из файла
data = pd.read_csv('sample_parameters.csv')

Шаг 2: Фильтрация данных

Чтобы получить комбинации гиперпараметров, при которых выходное значение меньше 10, вы можете воспользоваться фильтрацией:

# Получение строк с выходными значениями ниже 10
rows_below_10 = data[data.Output < 10]

# Вывод отфильтрованных данных
print(rows_below_10)

Также вы можете извлечь строки с минимальным выходным значением:

# Поиск строк с минимальным выходным значением
min_rows = data[data.Output == data.Output.min()]

# Вывод строк с минимальным выходом
print(min_rows)

Шаг 3: Визуализация данных

Для визуализации и лучшего понимания распределения выходных значений в зависимости от гиперпараметров, вы можете построить график:

import matplotlib.pyplot as plt

# Визуализация первых 3000 строк, отсортированных по выходным значениям
data_sorted = data.sort_values(by='Output')[:3000]

plt.figure(figsize=(10, 6))
plt.subplot(1, 1, 1)
plt.scatter(data_sorted.index, data_sorted.Output, c='b', marker='o')
plt.axhline(y=10, color='r', linestyle='--')
plt.title('Распределение выходных значений')
plt.xlabel('Индекс')
plt.ylabel('Выходное значение')
plt.show()

Шаг 4: Оптимизация гиперпараметров с помощью Grid Search

Для более продвинутой автоматизации, вы можете использовать GridSearchCV из библиотеки scikit-learn. Этот метод позволит вам протестировать множество комбинаций гиперпараметров и выбрать наилучший вариант:

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression  # или другую модель

# Предположим, что у вас есть матрица входов X и вектор выхода y
X = data[['Parameter 1', 'Parameter 2', 'Parameter 3', 'Parameter 4']]
y = data['Output']

# Определение модели
model = LinearRegression()

# Определение параметров для поиска
param_grid = {
    'fit_intercept': [True, False],
    'normalize': [True, False]
}

# Выполнение Grid Search
grid_search = GridSearchCV(model, param_grid, scoring='neg_mean_squared_error', cv=5)
grid_search.fit(X, y)

# Вывод лучших параметров и лучшего результата
print("Лучшие параметры:", grid_search.best_params_)
print("Лучший результат:", -grid_search.best_score_)

Вывод

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

Оцените материал
Добавить комментарий

Капча загружается...