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

Одним из наиболее широко используемых методов машинного обучения в мире науки о данных является полиномиальная регрессия. Полиномиальная регрессия определяется на основе взаимосвязи между входными и выходными данными модели с полиномом nгопорядка. Если порядок один, полином по существу станет линейной регрессией. Итак, полиномиальная регрессия в простейшем виде определяется как:

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

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

Далее я попытаюсь показать, как сформировать процесс оптимизации для модели полиномиальной регрессии в Python.

I. Концепция оптимизации:

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

Если мы подумаем о полиноме двух степеней, таком как показанный на рисунке ниже, очень легко найти минимизированное решение задачи. Глобальные минимумы показаны красной точкой при X = 0:

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

· Исходное состояние, с которого начинается процесс оптимизации

· Целевая функция, которая является функцией, подлежащей оптимизации

· Ограничения, которые накладывают, где решение должно быть расположено

I. Формулирование модели оптимизации в Python

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

Сначала мы импортируем пакеты:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

Здесь я выбрал набор случайных чисел, которые будут использоваться в качестве входных и выходных данных. Диаграмма рассеяния для этого набора данных показана на рисунке 2:

X = np.array([0.1,1,2,2.5,3.1,4.5,5,8,10,12,15,20])
y = np.array([0.5,2.5,4,15,17,22,25.5,15.5,22,32,35,42])
plt.scatter(X, y, color = 'red')
plt.xlabel('Inputs')
plt.ylabel('Outputs')
plt.grid(True)

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

X_train, X_test, y_train, y_test= train_test_split(X, y, random_state = 42, test_size = 0.3 )
lr = LinearRegression().fit(X_train.reshape(-1,1), y_train)
lr.score(X_test.reshape(-1,1), y_test)

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

lr = LinearRegression().fit(X.reshape(-1,1), y)
y_pred = lr.predict(X.reshape(-1,1))
plt.scatter(X,y, color = 'red')
plt.plot(X, y_pred)
plt.xlabel('Inputs')
plt.ylabel('Outputs')
plt.grid(True)

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

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

def objective(x):
  x = np.array(x)
  x = x.reshape(-1,1)
  y = lr.predict(x)
  return y

Теперь давайте определим некоторые ограничения для нашей задачи оптимизации. Я хотел бы установить ограничение для входов и другое для выходов. Предположим, мы хотим, чтобы входное значение было между 6 и 9, как:

И результат должен быть между 20 и 25 как:

Мы называем границы входных данных нашим первым ограничением и определяем его следующим образом:

b_mins = 6
b_max = 9
def const1(x):
  a1 = x - b_mins
  a2 = b_max - x
  a3 = [a2,a1]
  return a3

Как видно, ограничение задано в виде функции. a1 и a2 представляют собой верхнюю и нижнюю границы входных данных, они объединены в пары и представлены a3.

Другое ограничение может быть определено аналогичным образом:

c_min = 20
c_max = 25
def const2(x):
  y = objective(x)
  a1 = y - c_min
  a2 = c_max - y
  a3 =[a2,a1]
  return a3

Затем необходимо определить типы ограничений и обработать функции следующим образом:

con1 = {'type': 'ineq', 'fun': const1}
con2 = {'type': 'ineq', 'fun': const2}
con = [con1, con2]

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

Здесь мы импортируем функцию минимизации библиотеки scipy:

from scipy.optimize import minimize

и он будет использоваться следующим образом:

sol = minimize(fun=objective, x0 = [10], method='COBYLA', constraints=con)

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

Объект sol содержит следующие результаты решения:

fun: 20.000000000000004
maxcv: 0.0
message: 'Optimization terminated successfully.'
nfev: 10
status: 1
success: True
x: array([7.23940605])

Как видно, оптимизация завершилась успешно, и функцию удалось минимизировать при входном значении примерно 7,24.

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

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

Я хотел бы завершить эту статью упоминанием о том, что существуют различные пакеты оптимизации, доступные в Python, которые не требуют такого объема планирования и предварительного формулирования, как, например, Pulp или Мистика.

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

I. Вывод

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