Вопрос или проблема
Честно говоря, я не на 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
раз, чтобы получить надежное среднее значение. Это делается автоматически для каждого гиперпараметра, который оценивается.
Ответ или решение
Чтобы минимизировать выходные значения, основанные на комбинациях гиперпараметров, вы можете использовать несколько способов автоматизации этого процесса с помощью 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
. Это позволит оптимизировать вашу модель и минимизировать выходные значения. Если у вас возникнут дополнительные вопросы или потребуется помощь в конкретных аспектах реализации, не стесняйтесь обращаться за помощью.