Изменения

Перейти к: навигация, поиск

Вариации регрессии

5908 байт добавлено, 19:29, 17 февраля 2020
м
Байесовская регрессия: fixed lex mistake
Диагональная матрица <tex>\lambda I_n</tex> называется '''гребнем'''.
===Примеры кода=======Пример кода для Scikit-learn====
<font color = green># импорт библиотек</font>
'''from''' sklearn.datasets '''import''' make_regression
Точность предсказания для данного датасета и параметров:
<font color = green>>>></font> 0.8171822749108134
 
====Пример на языке Java====
Пример гребневой регрессии с применением <code>smile.regression.RidgeRegression</code><ref>[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]</ref>
 
<code>Maven</code> зависимость:
<dependency>
<groupId>com.github.haifengl</groupId>
<artifactId>smile-core</artifactId>
<version>1.5.2</version>
</dependency>
 
'''import''' smile.data.NominalAttribute;
'''import''' smile.data.parser.DelimitedTextParser;
'''import''' smile.regression.RidgeRegression;
 
'''var''' parser = new DelimitedTextParser();
parser.setDelimiter(", ");
parser.setResponseIndex(new NominalAttribute("class"), 0);
'''var''' dataset = parser.parse("dataset.csv");
'''var''' lambda = 0.0057d;
'''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);
ridgeClf.predict(testX);
==Лассо-регрессия==
===Описание===
[[Файл: Ridge_and_Lasso_Regression.png|400px|thumb|Рис.1. Сравнение Лассо- и Ридж- регрессии, пример для двумерного пространства независимых переменных.<br/>Бирюзовые области изображают ограничения на коэффициенты <tex>\beta</tex>, эллипсы {{---}} некоторые значения функции наименьшей квадратичной ошибки.]]
Функционал <tex>Q</tex> принимает следующий вид:
<center>:<tex>Q_{\lambda}(\beta) = ||F \beta - y||^2 + \lambda ||\beta||</tex>,</center>
Основное различие лассо- и ридж-регрессии заключается в том, что первая может приводить к обращению некоторых независимых переменных в ноль, тогда как вторая уменьшает их до значений, близких к нулю. Рассмотрим для простоты двумерное пространство независимых переменных. В случае риджлассо-регрессии органичение на коэффициенты представляют представляет собой круг ромб (<tex>|\beta_1^2 | + |\beta_2^2 | \leq t^2</tex>), в случае лассоридж-регрессии {{---}} ромб круг (<tex>|\beta_1| ^2 + |\beta_2| ^2 \leq t^2</tex>). Необходимо минимизировать функцию ошибки, но при этом соблюсти ограничения на коэффициенты. С геометрической точки зрения задача состоит в том, чтобы найти точку касания линии, отражающей функцию ошибки с фигурой, отражающей ограничения на <tex>\beta</tex>. Из рисунка 1 интуитивно понятно, что в случае лассо-регрессии эта точка с большой вероятностью будет находиться на углах ромба, то есть лежать на оси, тогда как в случае ридж-регрессии такое происходит очень редко. Если точка пересечения лежит на оси, один из коэффициентов будет равен нулю, а значит, значение соответствующей независимой переменной не будет учитываться.
===Примеры кода=======Пример кода для Scikit-learn====
<font color = green># импорт библиотек</font>
'''from''' sklearn.datasets '''import''' make_regression
Точность предсказания для данного датасета и параметров:
<font color = green>>>></font> 0.8173906804156383
 
====Пример на языке Java====
 
Пример Лассо-регрессии с применением <code>smile.regression.LASSO</code><ref>[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]</ref>
 
<code>Maven</code> зависимость:
<dependency>
<groupId>com.github.haifengl</groupId>
<artifactId>smile-core</artifactId>
<version>1.5.2</version>
</dependency>
 
'''import''' smile.data.NominalAttribute;
'''import''' smile.data.parser.DelimitedTextParser;
'''import''' smile.regression.LASSO;
 
'''var''' parser = new DelimitedTextParser();
parser.setDelimiter(", ");
parser.setResponseIndex(new NominalAttribute("class"), 0);
'''var''' dataset = parser.parse("dataset.csv");
'''var''' lasso = new LASSO(dataset.x(), dataset.y(), 10);
lasso.predict(testX);
==Байесовская регрессия==
Решением этой задачи мы и будем заниматься в этом разделе.
 
[[Файл: Bayessian_regression_noise.jpg|250px|thumb|Рис.2. Регрессия и шум в данных.<br/>Синяя точка {{---}} значение из датасета, красная {{---}} значение, полученное в результате работы алгоритма регрессии. Также на рисунке зеленой линией изображена предсказанная функция, а черной {{---}} гауссово распределение шума.]]
'''Байесовская линейная регрессия''' (англ. ''Bayesian linear regression'') {{---}} подход в линейной регрессии, в котором предполагается что шум распределен нормально.
[[Файл: Bayessian_regression_noise.jpg|250px|thumb|Рис.2. Регрессия и шум в данных.<br/>Синяя точка {{---}} значение из датасета, красная {{---}} значение, полученное в результате работы алгоритма регрессии. Также на рисунке зеленой линией изображена функция, предсказанная алгоритмом регрессиии, а черной {{---}} гауссово распределение шума.]] На рисунке 2 синяя точка показывает значения из датасета, красная {{---}} значение, предсказанное регрессией. Центр Поскольку центр гауссианы находится в красной точке. Маленькие , маленькие отклонения синей точки от красной более вероятны, они лежат недалеко от центра гауссианы, а большие {{---}} менее вероятны. Понятно, что если мы разместим красную точку далеко, отклонение для синей точки станет большим и следовательно, маловероятным.
Для решения поставленной задачи регрессии воспользуемся методом максимального правдоподобия.
Запишем правдоподобие:
:<tex>p(y|x, \beta, \sigma^2) = N(x \beta, \sigma^2)</tex>,где <tex>p(y|x, \beta x, \sigma^2)</tex>{{---}} плотность распределения значения <tex>y</tex> из датасета, которая, как мы ранее предположили, соответствует нормальному распределению с центром в точке <tex>x \beta</tex> (значение для <tex>y</tex>, предсказанное алгоритмом).
Будем также предполагать, что данные независимы::<tex>p(y|x, \beta, \sigma^2) = \prod\limits_{i=1}^n N(y_i|x_i \beta x_i, \sigma^2)</tex> Поскольку нас интересует только максимум, положим <tex>\sigma = 1</tex>::<tex>\arg\max p(y|x, \beta) = \arg\max \prod\limits_{i=1}^n N(x_i \beta, 1)</tex>
Прологарифмируем это выражение:
:<tex>\arg\max \ln p(y|x, \beta, \sigma^2) = \arg\ = max \ln \prod\limits_{i=1}^n N(y_i|x_i \beta x_i, \sigma^21) \\ = \arg\max \ln {\left( \frac{1}{(\sigma \sqrt{2 \pi})^n} \exp{\left(-\frac{1}{2 \sigma^2} \sum\limits_{i-1}^n (y_i - x_i \beta x_i)^2\right)}\right )} \\ = \arg\max -\fracsum\limits_{i=1}^n}{2} (y_i - x_i \ln{beta)^2 \pi \sigma^2} - = \frac{1}{2arg\sigma^2} min \sum\limits_{i=1}^n (y_i - x_i \beta x_i)^2</tex>
Из оценки Таким образом, оказывается, что метод максимального правдоподобия мы получили оценку с учетом шума в данных сводится к оценке по методу наименьших квадратов, которую мы уже видели в обычной линейной регрессии.
===Пример кода для Scikit-learn===
==Логическая регрессия==
'''Логическая регрессия''' (англ. ''logic regression'') {{---}} обобщенный метод регрессии, применяемый в основном в случае, когда независимые переменные имеют двоичную природу (при этом зависимая переменная не обязательно двоичная). Задачей логической регрессии является определение независимых переменных, которые могут быть выражены как результат вычисления [[Определение булевой функции |булевой функции]] от других независимых переменных. Обычно в методах регрессии не учитывается связь между переменными. Предполагается, что влияние каждой переменной на результат не зависит от значений других переменных. Однако это предположение зачастую неверно.
Пусть <tex>x_1, x_2, \dots, x_k</tex> {{---}} двоичные независимые переменные, и пусть <tex>y</tex> {{---}} зависимая переменная. Будем пытаться натренировать модели регрессии вида <tex>g(E(y)) = b_0 + b_1 L_1 + \dots + b_n L_n</tex>, где <tex>L_j</tex> {{---}} булева функция от переменных <tex>x_i</tex> (например <tex>L_j = (x_2 \lor \overline{x_4}) \land x_7</tex>).
Для каждого типа модели необходимо определить функцию, которая отражает качество рассматриваемой модели. Например, для линейной регрессии такой функцией может быть остаточная сумма квадратов. Целью метода логической регрессии является минимизация выбранной функции качества посредством настройки параметров <tex>b_j</tex> одновременно с булевыми выражениями <tex>L_j</tex>.
 
[[Файл: Logic_tree_moves.jpg|400px|thumb|Рис.3. Допустимые действия в процессе роста дерева.<br/>Элементы, появившиеся в результате применения операции, выделены черным фоном.]]
Для каждого типа модели необходимо определить функциюМожет показаться не совсем понятным, которая отражает качество рассматриваемой моделикак же применить регрессию к булевым выражениям. Рассмотрим в общих чертах алгоритм логической регрессии. НапримерЛогическая регрессия, для линейной как и другие методы регрессии такой функцией может быть остаточная сумма квадратов, перебирает различные выражения в попытках минимизировать функцию потерь. Целью метода логической регрессии является минимизация выбранной функции качества посредством настройки параметров Для <tex>b_jk</tex> одновременно с булевыми выражениями переменных можно составить <tex>L_j2^{2^k}</tex>различных выражений. Нужно найти более эффективный метод для поиска наилучшего выражения, чем простой перебор всех вариантов.  Любое логическое выражение можно представить в виде дерева, где в узлах расположены операции, а листья представляют собой переменные. Будем называть такие деревья '''логическими деревьями''' (англ. ''logic trees''). Будем называть '''соседями''' (англ. ''neighbours'') логического дерева такие деревья, которые могут быть получены из него за один шаг. Допустимые шаги проиллюстрированы на рисунке 3. Рассмотрим самый простой алгоритм поиска наилучшего дерева {{---}} '''жадный поиск''' (англ. ''greedy search'').# В качестве стартового дерева выберем одну переменную, которая дает минимальное значение функции потерь среди всех остальных переменных. # Перебираем соседей текущего дерева и выбираем такое, что оно уменьшает значение функции потерь по сравнению с текущим, а также дает наименьший результат среди остальных соседей.# Если такого дерева не существует, алгоритм завершается. Если оно все же есть, выбираем его в качестве текущего и повторяем второй шаг. Этот алгоритм склонен к переобучению, а также в некоторых ситуациях может остановиться преждевременно, так и не дойдя до наилучшего дерева. Существует также алгоритм под названием '''имитация отжига''' (англ. ''simulated annealing'') который показывает лучшие результаты, чем описанный жадный поиск.
==См. также==
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%29 machinelearning.ru {{---}} Линейная регрессия (пример)]
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%A0%D0%B8%D0%B4%D0%B6-%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Ридж-регрессия]
* [https://ru.wikipedia.org/wiki/%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BA%D0%BE%D0%BB%D0%BB%D0%B8%D0%BD%D0%B5%D0%B0%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C Wikipedia {{---}} Мультиколлинеарность]
* [http://www.ccas.ru/voron/download/Regression.pdf Лекции по алгоритмам восстановления регрессии К. В. Воронцов]
* [https://towardsdatascience.com/ridge-and-lasso-regression-a-complete-guide-with-python-scikit-learn-e20e34bcbf0b Ridge and Lasso Regression: A Complete Guide with Python Scikit-Learn]
76
правок

Навигация