Всем привет!

В прошлый раз я познакомил вас с несколькими библиотеками машинного обучения, написанными на языке программирования Dart, на простом примере использования в классе LinearRegressor. Но что такое линейная регрессия? Засучим рукава и попробуем разобраться.

Проще говоря, регрессия — это когда кто-то пытается предсказать число в зависимости от набора переменных (также известных как признаки, независимые переменные).

Представьте, что у вас есть задача спрогнозировать ̶s̶t̶o̶c̶k̶ ̶p̶r̶i̶c̶e̶s̶ цены на жилье — допустим, вы хотите продать свой дом и получить справедливую цену за свое помещение. Таким образом, первым подходом к решению этой задачи может быть случайное угадывание значения. Да, отлично. Может быть, кого-то устраивает такой подход, но я считаю плохой идеей продавать свой дом по слишком низкой случайной цене (в этом случае вы получаете слишком мало денег) или, наоборот, запредельно высокой цене (в этом случае нет один купит ваш дом).

Должен быть более разумный способ прогнозирования цен на жилье. Мы должны выбрать функцию, в зависимости от которой может измениться цена. Например, это может быть расстояние в метрах до ближайшей станции метро. Скажем, наш дом находится в 500 метрах от станции метро. Так что же это нам дает? Если честно, ничего. По крайней мере, на данный момент. Эта информация может иметь смысл только в ее множестве — мы должны собрать несколько примеров домов с указанием их цен и расстояний до ближайших станций метро. Хорошо, скажем, мы собрали некоторую информацию:

Итак, мы видим, что наша возможная цена дома находится между первой и третьей записью, поскольку 500 метров больше 250 метров и меньше 800 метров. Хорошо, например, стоимость может быть $480000. Эта оценка намного лучше, чем случайные догадки, но все же догадки. Можем ли мы улучшить наш прогноз? Ответ положительный. Здесь вступает в игру математика. Просто внимательно посмотрите на данные. Вам это что-то напоминает? Могу подсказать:

Это система линейных уравнений! Чтобы лучше предсказать цену на произвольное расстояние, нам нужно найти значение «х». Таким образом, мы можем умножить расстояние на «х» и получить цену! Есть несколько способов найти «x», но, к сожалению, мы никогда не сможем найти точное значение.

В машинном обучении мы называем такой «x» «коэффициентом» или «весом» и обычно обозначаем его как «w» (обозначает «вес»). Характеристики, которые в нашем случае являются только одной переменной (расстояние до ближайшей станции метро), мы обычно обозначаем как «x». Результаты мы характеризуем как «y». В нашем примере у нас есть только один признак и один коэффициент.

Геометрически, найдя коэффициент, мы пытаемся найти наклон линии. Именно поэтому мы называем алгоритм «Линейная регрессия»:

по оси Y — значения цен; Ось X - значения расстояния.

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

Мы видим, что перпендикуляр к оси X, линия, начинающаяся с точки x=180 (180 метров от ближайшей станции метро), пересекает нашу прогнозную линию по координате Y, что чуть больше $500000 — это наша прогнозируемая цена дом, который находится в 180 метрах от ближайшей станции метро.

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

Как вы можете заметить, наши данные достаточно необъективны — все точки находятся в верхней части графика. Это означает, что найти только один коэффициент недостаточно. Поэтому нам нужно это учитывать. Вспомним уравнение прямой в двумерном пространстве:

Термин «w_0» — это то, что мы хотим рассмотреть, означая «насколько наша линия смещена от начала координат».

В библиотеке ml_algo первым способом нахождения коэффициента является так называемое Решение в закрытой форме. Подробнее об алгоритме решения вы узнаете из моих следующих статей — следите за обновлениями. Коэффициент можно найти с помощью закрытого решения библиотеки ml_algo следующим образом:

Последние две инструкции выводят следующее:

Coefficients: (514310.0, -56.05095291137695)
Prediction: 
DataFrame (1 x 1)
       price
486284.53125

Первый коэффициент, 514310, — это наш коэффициент смещения (термин «w_0»), а второй, -56,05, — коэффициент нашей характеристики (расстояние до ближайшей станции метро) (термин «w_1»).

Сумма в $486 284 выглядит более точной, чем наше предположение в $480 000, которое мы сделали выше.

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

Следующий пункт нашего путешествия — задача Обычных наименьших квадратов.

Вот и все!

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

Ваше здоровье :)