Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Машинное обучение на практике (пишем обучающиеся алгормы)


Ну что ж, поехали. Начнём с самой простого алгоритма.

Линейная регрессия.

Пусть нам нужно вычислить ориентировочную стоимость аренды квартиры в зависимости от её площади (в определённом городе или районе, где цены более-менее однородны). Как решать задачу? Подход машинного обучения таков: нам нужны примеры обучающих данных о площади квартиры x и стоимости её аренды y, т.е. пары , где i -- номер пары данных (например, при площади 30 м2 стоимость 20000, тогда x=30, y=20000). Взяв реальные данные из объявлений в интернете, я построил график: цена в зависимости от площади.

Линейная регрессия подразумевает, что мы упрощаем эту зависимость до прямой линии g(x) = a0 + a1*x. Для наших данных это выглядит так:

Уравнение прямой на этом графике: g(x) = 3 + 1087*x, т.е. a0=3, a1=1087

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

Итак, нам нужно провести наилучшую прямую. Для этого нужно выработать критерий, что такое "хорошая" прямая. Очевидно, идеальная прямая проходит через все заданные предложенные точки. Точно также очевидно, что в нашем случае точно пройти через все точки невозможно, но нужно постараться провести её как можно ближе ко всем точкам. Самая популярная мера удалённости для подобных задач -- это квадрат отклонения:

Т.е. разница между вычисленным значением (в нашем примере цены квартиры) и реальным значением возведённая в квадрат. Чем больше это значение -- тем хуже совпадение.

Если вычислить среднее по всем обучающим данным, то мы получим функцию ошибки обучения: , где m -- это количество обучающих данных. Можно сказать, это "штрафная" функция за качество обучения (в английской терминологии cost function). Чем она больше -- тем хуже наша формула.

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

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

Например горизонтальная прямая a0=50000, a1=0, получаем Q=1.36e10 ***
*** Для тех кто не знаком -- это экспоненциальный формат записи чисел, который означает число 1.36 * 10000000000 -- число с 10 нулями (в данном случае 10 миллиардов). Это удобно для записи больших чисел. Например тысяча записывается как 1e3, миллион 1e6 и т.д. И последний пример 1.5e1 -- означает 1.5*10, т.е. 15. Надеюсь разобрались.
На графике эта прямая выглядит так:

Очевидно хочется увеличить угол наклона, например так a0=50000, a1=1000. Получим Q=3.81e9, т.е. ошибка уже в 3 раза меньше.

Если подбирать a0, a1, стремясь к минимальному значению Q, то получим ту прямую, которая была показана в самом начале, и Q=2.10e+9

Итак, мы формализовали задачу -- свели её к поиску минимума функции, а для этого существует множество хороших алгоритмов. О них мы и поговорим в следующем выпуске. А пока подведём итог.

1) Нам нужен набор обучающих данных (x, y)
2) Мы строим линейную модель приближения y(x) функцией g(x) = a0 + a1*x
3) Для подбора параметров a0 и a1 нам нужно минимизировать функцию ошибки Q(a0,a1)


В избранное