Логистическая регрессия — различия между версиями
(→Описание) |
(→Пример на языке Java) |
||
(не показано 29 промежуточных версий 7 участников) | |||
Строка 1: | Строка 1: | ||
− | '''Логистическая регрессия''' (англ. ''logistic regression'') — метод построения | + | '''Логистическая регрессия''' (англ. ''logistic regression'') — метод построения линейного классификатора, позволяющий оценивать апостериорные вероятности принадлежности объектов классам. |
== Описание == | == Описание == | ||
Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество [[Независимые случайные величины|независимых]] переменных <tex>x_1, ... x_n</tex> на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной. | Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество [[Независимые случайные величины|независимых]] переменных <tex>x_1, ... x_n</tex> на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной. | ||
− | Итак, пусть объекты задаются $n$ | + | Итак, пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ {{---}} конечное множество меток классов и задана обучающая выборка пар «объект-ответ» <tex>X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.</tex> |
+ | |||
+ | Рассмотрим случай двух классов: $Y = \{-1, +1\}$. В логистической регрессии строится линейный алгоритм классификации $a: X \to Y$ вида | ||
+ | <center><tex>a(x, w) = \mathrm{sign}\left(\sum\limits_{j=1}^n w_j f_j(x) - w_0 \right)=\mathrm{sign}\left<x, w\right></tex>,</center> | ||
+ | где $w_j$ $-$ вес $j$-го признака, $w_0$ $-$ порог принятия решения, $w=\left(w_0, ..., w_n\right)$ $-$ вектор весов, $\left<x, w\right>$ $-$ скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён нулевой признак: $f_{0}(x)=-1$. | ||
+ | |||
+ | Задача обучения линейного классификатора заключается в том, чтобы по выборке $X^m$ настроить вектор весов $w$. В логистической регрессии для этого решается задача минимизации эмпирического риска с функцией потерь специального вида: <center><tex>Q(w) = \sum\limits_{i=1}^m \ln\left( 1 + \exp( -y_i \langle x_i,w \rangle ) \right) \to \min_{w}</tex>,</center> | ||
+ | |||
+ | После того, как решение $w$ найдено, становится возможным не только вычислять классификацию $a(x) = \mathrm{sign}\langle x,w \rangle$ для произвольного объекта $x$, но и оценивать апостериорные вероятности его принадлежности классам: | ||
+ | <center><tex>\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y</tex>,</center> | ||
+ | где $\sigma(z) = \frac1{1+e^{-z}}$ {{---}} сигмоидная функция. | ||
+ | |||
+ | == Обоснование == | ||
+ | '''С точки зрения [[Байесовский классификатор|байесовского классификатора]]<sup>[на 28.01.19 не создан]</sup>''' | ||
+ | |||
+ | Наиболее строгое обоснование логистической регрессии опирается на следующую теорему | ||
+ | {{Теорема | ||
+ | |statement=Пусть | ||
+ | *выборка прецедентов $\mathrm{X}^l=\{\left(x_1, y_1\right), ... ,\left(x_l, y_l\right)\}$ получена согласно вероятностному распределению с плотностью | ||
+ | <tex>p\left(x, y\right)=\mathrm{P}_yp_y\left(x\right)=\mathrm{P}\left(y|x\right)p\left(x\right)</tex> | ||
+ | где $\mathrm{P}_y$ {{---}} ''априорные вероятности'', | ||
+ | $p_y(x)$ $-$ ''функции правдоподобия'', принадлежащие экспонентному семейству плотностей (т.е. $p_y(x) = \exp \left( \langle\theta,x\rangle \cdot a(\delta) + b(\delta,\theta) + d(x,\delta) \right)$, где $a, b, d$ $-$ произвольные функции); | ||
+ | *функции правдоподобия имеют равные знаения параметра разброса $\delta$ и отличаются только значениями параметра сдвига $\theta_y$; | ||
+ | *среди признаков есть константа, скажем, $f_0(x) = -1$; | ||
+ | Тогда | ||
+ | *линейный классификатор является оптимальным байесовским классификатором; | ||
+ | *апостериорные вероятности классов оценивается по формуле <tex>\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y</tex>. | ||
+ | |proof= | ||
+ | |||
+ | Напомним, что оптимальный байесовский классификатор для двух классов выглядит следущим образом: | ||
+ | <center><tex>a\left(x\right)= | ||
+ | \mathrm{sign}\left(\lambda_+\mathrm{P}\left(+1|x\right)-\lambda_-\mathrm{P}\left(-1|x\right)\right)= | ||
+ | \mathrm{sign}\left(\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)}-\frac{\lambda_-}{\lambda_+}\right)</tex>,</center> | ||
+ | |||
+ | Рассмотрим отношение апостериорных вероятностей классов | ||
+ | <center><tex>\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)}</tex>,</center> | ||
+ | и распишем функции правдоподобия, используя экспонентную формулу с параметрами $\theta_y$ и $\delta$: | ||
+ | <center><tex>\frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)} = \exp\left(\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle+b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-}\right)</tex>,</center> | ||
+ | |||
+ | Рассмотрим получившуюся под экспонентой сумму: | ||
+ | *$\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle = \langle w, x\rangle$. Вектор $w$ не зависит от $x$ и является вектором свободных коэффициентов(весов) при константных признаках; | ||
+ | *$b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-} = \mathrm{const}\left(x\right)$. Можно считать данные слагаемые аддитивной добавкой к коэффициенту при признаке. Но так как свободные коэффициенты настраиваются по обучающей выборке, вычислять эту добавку не имеет смысла и ее можно включить в $\langle w, x\rangle$. | ||
+ | |||
+ | Таким образом, | ||
+ | <center><tex>\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \mathrm{e}^{\langle w, x\rangle}</tex>,</center> | ||
+ | |||
+ | Разделяющая поверхность в байесовском решающем правиле определяется уравнением | ||
+ | <center><tex>\lambda_- \mathrm{P}\left(-1|x\right) = \lambda_+ \mathrm{P}\left(+1|x\right)</tex>,</center> | ||
+ | которое равносильно | ||
+ | <center><tex>\langle w, x\rangle - \ln\frac{\lambda_-}{\lambda_+} = 0</tex>,</center> | ||
+ | |||
+ | Следовательно, разделяющая поверхность линейна и первый пункт теоремы доказан. | ||
+ | |||
+ | Используя [[Формула полной вероятности|формулу полной вероятности]] получаем следующее равенство | ||
+ | <center><tex>\mathrm{P}\left(+1|x\right) + \mathrm{P}\left(-1|x\right) = \sigma\left(+\langle w ,x\rangle\right) + \sigma\left(-\langle w ,x\rangle\right) = 1</tex>,</center> | ||
+ | |||
+ | Откуда следует: | ||
+ | <center><tex>\mathrm{P}\left(y|x\right)=\sigma\left(\langle w, x\rangle y\right), y = \{-1, +1\}</tex>,</center> | ||
+ | Таким образом, второй пункт теоремы доказан. | ||
+ | }} | ||
+ | |||
+ | == Примеры кода == | ||
+ | === scikit-learn === | ||
+ | Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.'''LogisticRegression'''] имеет несколько параметров, например: | ||
+ | * '''solver''' $-$ алгоритм, использующийся для оптимизации; | ||
+ | * '''multi_class''' $-$ классификация на 2 или много классов. | ||
+ | |||
+ | |||
+ | * Импортируем нужные библиотеки: | ||
+ | '''from''' sklearn.linear_model '''import''' LogisticRegression | ||
+ | '''from''' sklearn '''import''' datasets | ||
+ | '''from''' sklearn.model_selection '''import''' train_test_split | ||
+ | |||
+ | * Выберем тренировочное и тестовое множества: | ||
+ | iris = datasets.'''load_iris()''' | ||
+ | |||
+ | X = iris.data | ||
+ | y = iris.target | ||
+ | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''') | ||
+ | |||
+ | * Обучение: | ||
+ | clf = LogisticRegression(random_state='''0''', solver='lbfgs', multi_class='multinomial') | ||
+ | model = clf.'''fit'''(X_train, y_train) | ||
+ | |||
+ | * Предсказание: | ||
+ | y_pred = model.'''predict'''(X_test) | ||
+ | model.'''score'''(X_test, y_test) | ||
+ | |||
+ | === [[Примеры кода на Scala#Логистическая регрессия|Пример кода на Scala]] === | ||
+ | ===Пример на языке Java=== | ||
+ | Пример логистической регрессии с применением <code>smile.classification.LogisticRegression</code><ref>[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]</ref> | ||
+ | |||
+ | <code>Maven</code> зависимость: | ||
+ | <dependency> | ||
+ | <groupId>com.github.haifengl</groupId> | ||
+ | <artifactId>smile-core</artifactId> | ||
+ | <version>1.5.2</version> | ||
+ | </dependency> | ||
+ | |||
+ | '''import''' smile.data.AttributeDataset; | ||
+ | '''import''' smile.data.NominalAttribute; | ||
+ | '''import''' smile.classification.LogisticRegression; | ||
+ | '''import''' smile.data.parser.ArffParser; | ||
+ | |||
+ | '''var''' arffParser = new ArffParser(); | ||
+ | arffParser.setResponseIndex(4); | ||
+ | '''var''' iris = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile("weka/iris.arff")); | ||
+ | '''var''' logClf = new LogisticRegression(iris.x(), iris.labels()); | ||
+ | logClf.predict(testX); | ||
+ | |||
+ | == См. также == | ||
+ | * [[Байесовская классификация]]<sup>[на 28.01.19 не создан]</sup> | ||
+ | * [[Линейная регрессия]]<sup>[на 28.01.19 не создан]</sup> | ||
+ | * [[Вариации регрессии]] | ||
+ | * [[Обзор библиотек для машинного обучения на Python]] | ||
+ | * [[Общие понятия]] | ||
+ | * [[Уменьшение размерности]] | ||
+ | |||
+ | == Источники информации == | ||
+ | * [http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Логистическая регрессия] | ||
+ | * [https://en.wikipedia.org/wiki/Logistic_regression Wikipedia {{---}} Logistic regression] | ||
+ | * [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html scikit-learn.org {{---}} документация по sklearn.linear_model.LogisticRegression] | ||
+ | |||
+ | [[Категория: Машинное обучение]] |
Версия 03:07, 9 апреля 2019
Логистическая регрессия (англ. logistic regression) — метод построения линейного классификатора, позволяющий оценивать апостериорные вероятности принадлежности объектов классам.
Содержание
Описание
Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество независимых переменных на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной.
Итак, пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ — конечное множество меток классов и задана обучающая выборка пар «объект-ответ»
Рассмотрим случай двух классов: $Y = \{-1, +1\}$. В логистической регрессии строится линейный алгоритм классификации $a: X \to Y$ вида
где $w_j$ $-$ вес $j$-го признака, $w_0$ $-$ порог принятия решения, $w=\left(w_0, ..., w_n\right)$ $-$ вектор весов, $\left<x, w\right>$ $-$ скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён нулевой признак: $f_{0}(x)=-1$.
Задача обучения линейного классификатора заключается в том, чтобы по выборке $X^m$ настроить вектор весов $w$. В логистической регрессии для этого решается задача минимизации эмпирического риска с функцией потерь специального вида:После того, как решение $w$ найдено, становится возможным не только вычислять классификацию $a(x) = \mathrm{sign}\langle x,w \rangle$ для произвольного объекта $x$, но и оценивать апостериорные вероятности его принадлежности классам:
где $\sigma(z) = \frac1{1+e^{-z}}$ — сигмоидная функция.
Обоснование
С точки зрения байесовского классификатора[на 28.01.19 не создан]
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему
Теорема: |
Пусть
где $\mathrm{P}_y$ — априорные вероятности, $p_y(x)$ $-$ функции правдоподобия, принадлежащие экспонентному семейству плотностей (т.е. $p_y(x) = \exp \left( \langle\theta,x\rangle \cdot a(\delta) + b(\delta,\theta) + d(x,\delta) \right)$, где $a, b, d$ $-$ произвольные функции);
Тогда
|
Доказательство: |
Напомним, что оптимальный байесовский классификатор для двух классов выглядит следущим образом: Рассмотрим отношение апостериорных вероятностей классов и распишем функции правдоподобия, используя экспонентную формулу с параметрами $\theta_y$ и $\delta$: Рассмотрим получившуюся под экспонентой сумму:
Таким образом, Разделяющая поверхность в байесовском решающем правиле определяется уравнением которое равносильно Следовательно, разделяющая поверхность линейна и первый пункт теоремы доказан. Используя формулу полной вероятности получаем следующее равенство Откуда следует: |
Примеры кода
scikit-learn
Классификатор sklearn.linear_model.LogisticRegression имеет несколько параметров, например:
- solver $-$ алгоритм, использующийся для оптимизации;
- multi_class $-$ классификация на 2 или много классов.
- Импортируем нужные библиотеки:
from sklearn.linear_model import LogisticRegression from sklearn import datasets from sklearn.model_selection import train_test_split
- Выберем тренировочное и тестовое множества:
iris = datasets.load_iris() X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
- Обучение:
clf = LogisticRegression(random_state=0, solver='lbfgs', multi_class='multinomial') model = clf.fit(X_train, y_train)
- Предсказание:
y_pred = model.predict(X_test) model.score(X_test, y_test)
Пример кода на Scala
Пример на языке Java
Пример логистической регрессии с применением smile.classification.LogisticRegression
[1]
Maven
зависимость:
<dependency> <groupId>com.github.haifengl</groupId> <artifactId>smile-core</artifactId> <version>1.5.2</version> </dependency>
import smile.data.AttributeDataset; import smile.data.NominalAttribute; import smile.classification.LogisticRegression; import smile.data.parser.ArffParser;
var arffParser = new ArffParser(); arffParser.setResponseIndex(4); var iris = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile("weka/iris.arff")); var logClf = new LogisticRegression(iris.x(), iris.labels()); logClf.predict(testX);
См. также
- Байесовская классификация[на 28.01.19 не создан]
- Линейная регрессия[на 28.01.19 не создан]
- Вариации регрессии
- Обзор библиотек для машинного обучения на Python
- Общие понятия
- Уменьшение размерности