#classic_ML



Линейные модели (часть 1)



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



В общем случае линейная модель в машинном обучении выглядит следующим образом. В задаче регрессии:



f(x[1], x[2], ..., x[d]) = w1 * x[1] + w2 * x[2] + ... + wd * x[d]



Где x[1], x[2], ..., x[d] - признаки объекта x,

w[1], w[2], ..., w[d] - веса этих признаков в нашей модели, о подборе которых мы еще поговорим далее.



В задаче классификации на два класса:



То же самое выражение для f, но выбор класса осуществляется по знаку f (>0 - отвечаем класс 1, <0 - отвечаем класс 0).



В задаче классификации на много классов:



Строим свою f для каждого класса (считаем его 1, а все остальные 0), а дальше выбор класса при прогнозе делаем по принципу «какая f больше, тем классом и отвечаем». Такой подход называется One-vs-all («один против всех» в русской локализации).



Остается сделать буквально пару ремарок:



1) Разумеется, случай f = 0 тоже возможен, но если признаки это просто вещественные числа, математически маловероятен. Поэтому хоть в случае f = 0 и было бы правильно отказываться от классификации, можно приписать его куда угодно - хоть в класс 0, хоть в класс 1, различия в теоретической части будут не очень большими.



2) Вы могли заметить, что все веса в формуле для регрессии умножаются на признаки. Но наверно было бы неплохо предусмотреть некий свободный коэффициент w0 (в английской литературе intercept), просто добавляемый к формуле выше, чтобы при нулевых значениях признаков прогноз не был обязан быть нулем (ну например, прогнозируете вы температуру воздуха где-нибудь в ОАЭ, ясно, что почти при любых значениях признаков нуля по Цельсию вам ожидать не стоит). Однако оказывается, что пока мы пишем формулы, а не реализуем алгоритм в программном коде, предусматривать ничего и не надо. Представьте, что в нашем объекте был добавлен искусственно еще один признак х0, который всегда равен 1. Тогда коэффициент перед ним и будет нашим w0. Значит можем писать формулы как писали раньше, только не забываем, что спрятали там вот такой костыль 🙂



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



L(w1, ... ,wd) = ((y1 - f(x1))^2 + (y2 - f(x2))^2 + ... + (yN - f(xN))^2) / N



(Кто хочет спросить, где же в формуле веса w, напомню, что они сидят в формуле для f)



Начав со случайных значений весов, шаг за шагом вы будете приближаться к оптимальным весам, пересчитывая антиградиент L по w и добавляя его к весам. Когда ошибка перестанет существенно меняться, вы можете считать что с какой-то точностью нашли минимум L, и уж по крайней мере полученные веса достаточно неплохие для вашей задачи.