Логистическая регрессия — различия между версиями
(→Обоснование) |
м (rollbackEdits.php mass rollback) |
||
(не показано 28 промежуточных версий 10 участников) | |||
Строка 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$ вида | Рассмотрим случай двух классов: $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> | + | <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$. | где $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> | + | Задача обучения линейного классификатора заключается в том, чтобы по выборке $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$, но и оценивать апостериорные вероятности его принадлежности классам: | После того, как решение $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> | + | <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}}$ | + | где $\sigma(z) = \frac1{1+e^{-z}}$ {{---}} сигмоидная функция. |
− | |||
== Обоснование == | == Обоснование == | ||
− | '''С точки зрения [[ | + | '''С точки зрения [[Байесовская классификация|байесовского классификатора]]''' |
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему | Наиболее строгое обоснование логистической регрессии опирается на следующую теорему | ||
{{Теорема | {{Теорема | ||
|statement=Пусть | |statement=Пусть | ||
− | * | + | *выборка прецедентов $\mathrm{X}^l=\{\left(x_1, y_1\right), ... ,\left(x_l, y_l\right)\}$ получена согласно вероятностному распределению с плотностью |
− | *функции правдоподобия имеют равные знаения параметра разброса $\delta$ и отличаются только значениями параметра сдвига $\theta_y$ | + | <tex>p\left(x, y\right)=\mathrm{P}_yp_y\left(x\right)=\mathrm{P}\left(y|x\right)p\left(x\right)</tex> |
− | *среди признаков есть константа, скажем, $f_0(x) = -1$ | + | где $\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> | + | *апостериорные вероятности классов оценивается по формуле <tex>\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y</tex>. |
|proof= | |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)} = \exp\left(\langle | + | <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>\mathrm{P}\left( | + | <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>\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>\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); | ||
+ | |||
+ | === Пример на языке R === | ||
+ | {{Main|Примеры кода на R}} | ||
+ | |||
+ | <font color="gray"># reading data</font> | ||
+ | rdata <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep</font> = <font color="green">','</font>, <font color="#660099">header</font> = FALSE) | ||
+ | |||
+ | <font color="gray"># evaluating model</font> | ||
+ | model = glm(<font color="#660099">formula</font> = target ~ x + y + z, <font color="#660099">data</font> = rdata, <font color="#660099">family</font> = binomial) | ||
+ | |||
+ | <font color="gray"># printing summary</font> | ||
+ | print(summary(model)) | ||
+ | |||
+ | == См. также == | ||
+ | * [[Байесовская классификация]]<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] | ||
+ | |||
+ | [[Категория: Машинное обучение]] |
Текущая версия на 19:32, 4 сентября 2022
Логистическая регрессия (англ. 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}}$ — сигмоидная функция.
Обоснование
С точки зрения байесовского классификатора
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему
Теорема: |
Пусть
где $\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);
Пример на языке R
# reading data rdata <- read.csv("input.csv", sep = ',', header = FALSE) # evaluating model model = glm(formula = target ~ x + y + z, data = rdata, family = binomial) # printing summary print(summary(model))
См. также
- Байесовская классификация[на 28.01.19 не создан]
- Линейная регрессия[на 28.01.19 не создан]
- Вариации регрессии
- Обзор библиотек для машинного обучения на Python
- Общие понятия
- Уменьшение размерности