В этой заметке мы узнаем о широко используемом алгоритме классификации, логистической регрессии.
Что такое логистическая регрессия
В первую очередь у всех должен возникнуть вопрос, почему она называется логистической регрессией, но решает проблему классификации. Поскольку логистическая регрессия связывает характеристики выборки с вероятностью появления выборки, при подгонке вероятности появления выборочных данных она фактически решает проблему регрессии.После расчета вероятности она классифицируется в соответствии с вероятностью . Следовательно, когда логистическая регрессия решает проблему классификации, она фактически имеет дело с проблемой регрессии в середине, но логистическая регрессия может решить только проблему двух классов, что следует отметить.
Когда логистическая регрессия решает регрессионную проблему вероятности, существует разница между линейной регрессией и полиномиальной регрессией, то есть модель, обученная последней, может предсказать целевое значение других выборочных данных, Теоретический диапазон значений от отрицательной бесконечности до положительной бесконечность. , другими словами, нет предела диапазону значений. Для чисел, представляющих вероятность, общий диапазон значений составляет от 0 до 1. В реальном мире вероятность не всегда выражается от 0% до 100%. Таким образом, это приводит к сходствам и различиям между логистической регрессией и линейной регрессией, которые затем отражаются в модели формулы. В четвертом примечании мы знаем, что модель формулы для множественной линейной регрессии:
y
^
=
θ
T
X
b
" role="presentation">^y=θTXb
y
^
=
θ
T
X
b
так как
у
^
"роль="презентация">Диапазон значений
(
−
∞
,
+
∞
)" роль="презентация">
, поэтому, если вы хотите использовать ее в модели формулы решения вероятности в логическом обзоре, вам нужна еще одна функция, чтобы ограничить ее диапазон значений до
(
0
,
1
)" роль="презентация">
, мы называем эту функциюSigmoidфункция:
п ^ знак равно о ( θ Т Икс б )" роль="презентация">^p=σ(θTXb) п ^ знак равно о ( θ Т Икс б )
о ( т ) знак равно 1 1 + е − т « роль = «презентация»> σ (t) = 11 + e-t о ( т ) знак равно 1 1 + е − т
Окончательная модель логистической регрессии для решения вероятности:
п ^ знак равно 1 1 + е − θ Т Икс б " роль="презентация">^p=11+e-θTXb п ^ знак равно 1 1 + е − θ Т Икс б
Сигмовидная функция
Давайте сначала посмотрим, почему эта сигмовидная функция ограничивает диапазон значений до
(
0
,
1
)" роль="презентация">, постройте эту функцию, чтобы увидеть:
import numpy as np
import matplotlib.pyplot as plt
# 定义Sigmoid函数
def sigmoid(t):
return 1 / (1 + np.exp(-t))
# 构建向量x,随机生成500个数,范围从-10到10
x = np.linspace(-10, 10, 500)
# y值通过Sigmoid计算出
y = sigmoid(x)
plt.plot(x, y)
plt.show()
Как видно из графика,
у" роль="презентация">Минимальное значение не будет меньше 0, а максимальное не будет больше 1, что указывает на то, что его диапазон значений
(
0
,
1
)" роль="презентация">
, я перепишу функцию Sigmoid, чтобы посмотреть:
о ( т ) знак равно 1 1 + е − т « роль = «презентация»> σ (t) = 11 + e-t о ( т ) знак равно 1 1 + е − т
когда
т" роль="презентация">на бесконечности,
е
−
т
"роль="презентация">
Бесконечно малый, то при делении 1 на бесконечно малый его значение бесконечно близко к 1. потом, когда
т" роль="презентация">
бесконечные часы,
е
−
т
"роль="презентация">
бесконечность, то при делении 1 на бесконечность его значение бесконечно близко к 0.
Я наношу оси на сигмовидный график, и вы можете видеть, что когда
т
>
0" роль="презентация">, чем он ближе к 0, тем вероятность
р" роль="презентация">
Чем он ближе к 0,5, тем
т" роль="презентация">
Чем дальше от 0, тем вероятность
р" роль="презентация">
больше 0,5, а когда
т" роль="презентация">
В определенной степени вероятность
р" роль="презентация">
В основном стабильно около 1. когда
т
, чем он ближе к 0, тем вероятность
р" роль="презентация">
Чем ближе к 0,5.
т" роль="презентация">
Чем дальше от 0, тем вероятность
р" роль="презентация">
меньше 0,5, а когда
т" роль="презентация">
В определенной степени вероятность
р" роль="презентация">
В основном стабильно около 0. В этом заключается математический смысл сигмовидной функции в логистической регрессии.
Функция потерь для логистической регрессии
Запишем формулу расчета вероятности в логистической регрессии:
п ^ знак равно 1 1 + е − θ Т Икс б " роль="презентация">^p=11+e-θTXb п ^ знак равно 1 1 + е − θ Т Икс б
Теперь вопрос в том, как мы находим вышеуказанное
θ" роль="презентация">значение, то есть как определяется функция потерь в задаче логистической регрессии.
Как упоминалось ранее, логистическая регрессия может решить только проблему двух классов, то есть когда оценки вероятности
п
^
"роль="презентация">Когда больше или равно 0,5, мы записываем
у
^
"роль="презентация">
равно 1, когда
п
^
"роль="презентация">
Если меньше или равно 0,5, записывают
у
^
"роль="презентация">
равен 0, то есть:
у ^ знак равно { 1 , п ^ ≥ 0,5 0 , п ^ ≤ 0,5 " role="презентация">^y={1, ^p≥0,50, ^p≤0,5 у ^ знак равно { 1 , п ^ ≥ 0,5 0 , п ^ ≤ 0,5
Затем мы сначала разделим функцию потерь на два случая:
с о с т знак равно { как фрукты у знак равно 1 , п Пересекать маленький , с о с т Пересекать Большой ( повреждать терять Пересекать Большой ) как фрукты у знак равно 0 , п Пересекать Большой , с о с т Пересекать Большой ( повреждать терять Пересекать Большой ) " role="presentation">cost={Если y=1, чем меньше p, тем больше стоимость (тем больше убыток), если y=0, чем больше p, тем больше стоимость (тем больше убыток) с о с т знак равно { как фрукты у знак равно 1 , п Пересекать маленький , с о с т Пересекать Большой ( повреждать терять Пересекать Большой ) как фрукты у знак равно 0 , п Пересекать Большой , с о с т Пересекать Большой ( повреждать терять Пересекать Большой )
То есть в случае, когда реальная классификация равна 1, чем меньше вероятность, тем больше потери, потому что чем меньше вероятность, тем классификация должна стремиться к 0. В случае, когда реальная классификация равна 0, если вероятность больше, это также означает, что потери больше, потому что чем больше вероятность, тем больше классификация должна стремиться к 1.
Выше мы только что определили тенденцию потерь и языковую интерпретацию функции потерь логистической регрессии в соответствии с методом классификации логистической регрессии, Затем нам нужно найти математические инструменты или функции, которые соответствуют этой тенденции в океане математики. Прежде чем мы повторим это снова, давайте повторим математику, которую мы изучали в старшей школе.логарифм.
логарифм
В математике, если
Икс
знак равно
альфа
у
"роль="презентация">,
у" роль="презентация">
да
α" роль="презентация">
показатель, то можно сказать, что
α" роль="презентация">
база
х" роль="презентация">
Логарифм
у" роль="презентация">
, обозначаемый как:
y = l o g α x" role="presentation">y=logαx y = l o g α x
Есть несколько удобных способов записи логарифмов:
- Если основание равно 2, основание можно опустить и записать как
л
о
г
х" роль="презентация">
- Если основание равно 10, основание можно опустить и записать как
л
г
х" роль="презентация">
- Если база
е" роль="презентация">
, основание можно опустить и записать как л н х" роль="презентация">
Основная роль логарифмов заключается в решении таких степеней, как:
-
l
o
g
θ
x
y
=
l
o
g
θ
x
+
l
o
g
θ
y" role="presentation">
- л
о
г
θ
Икс
у
знак равно
л
о
г
θ
Икс
−
л
о
г
θ
у" роль="презентация">
-
l
o
g
θ
x
y
=
y
l
o
g
θ
x" role="presentation">
-
l
o
g
θ
x
y
=
l
o
g
θ
x
y
" role="presentation">
Существование логарифмов делает эту сложную задачу возведения в степень более быстрой и удобной.
Давайте посмотрим на логарифмическую кривую в геометрическом смысле:логарифмическая кривая
Легко подсчитать, что логарифмическая кривая всегда заканчивается
(
1
,
0
)" роль="презентация">точка.
Определите функцию потерь
После рассмотрения логарифма, давайте посмотрим на функцию потерь логистической регрессии, Да, мы собираемся использовать логарифмическую функцию для представления:
с о с т знак равно { как фрукты у знак равно 1 , Тот Какие повреждать терять письмо номер за : − л о г ( п ^ ) как фрукты у знак равно 0 , Тот Какие повреждать терять письмо номер за : − л о г ( 1 − п ^ ) " role="presentation">cost={Если y=1, то функция потерь: −log(^p) Если y=0, то функция потерь: −log(1−^p) с о с т знак равно { как фрукты у знак равно 1 , Тот Какие повреждать терять письмо номер за : − л о г ( п ^ ) как фрукты у знак равно 0 , Тот Какие повреждать терять письмо номер за : − л о г ( 1 − п ^ )
Давайте посмотрим, почему эти две функции соответствуют описанию функции потерь, которую мы определили ранее. во-первых
−
л
о
г
х" роль="презентация">Кривая:
Как я уже говорил, диапазон вероятности находится в
(
0
,
1
)" роль="презентация">между ними, поэтому кривая ниже оси абсцисс приведенной выше кривой не имеет смысла, поэтому для
−
л
о
г
(
п
^
)" роль="презентация">
, его кривая:
Из приведенного выше графика легко понять, что при
п
^
"роль="презентация">При приближении к 0,
−
л
о
г
(
п
^
)" роль="презентация">
приближаясь к положительной бесконечности, эта положительная бесконечность на самом деле является большим штрафом за потери, потому что, когда
п
^
"роль="презентация">
приближается к 0,
у" роль="презентация">
Он также должен быть близок к 0, но здесь
у" роль="презентация">
определяется как 1. когда
п
^
"роль="презентация">
В процессе непрерывного приближения к 1,
−
л
о
г
(
п
^
)" роль="презентация">
Значение , постепенно уменьшается, т. е. потери постепенно уменьшаются, когда
п
^
"роль="презентация">
приближается к 1,
у" роль="презентация">
Он также должен быть близок к 0, что согласуется с приведенным здесь определением, поэтому
−
л
о
г
(
п
^
)" роль="презентация">
Значение равно 0, что указывает на отсутствие потерь.
Посмотрим еще раз
−
л
о
г
(
1
−
Икс
)" роль="презентация">Кривая:
Точно так же, поскольку диапазон вероятности находится в
(
0
,
1
)" роль="презентация">между, так
−
л
о
г
(
1
−
п
^
)" роль="презентация">
Кривая:
Эта кривая также может объяснить тенденцию потерь, которую мы определили ранее.
На данный момент найденная нами функция потерь по-прежнему делится на две по разным классификациям, на самом деле объединить их в одну очень просто:
с о с т знак равно − у л о г ( п ^ ) − ( 1 − у ) л о г ( 1 − п ^ )" role="презентация">cost=-ylog(^p)-(1-y)log(1-^p) с о с т знак равно − у л о г ( п ^ ) − ( 1 − у ) л о г ( 1 − п ^ )
Таким образом, когда
у
знак равно
0" роль="презентация">При функция потерь
−
л
о
г
(
1
−
п
^
)" роль="презентация">
,когда
у
знак равно
1" роль="презентация">
При функция потерь
−
л
о
г
(
п
^
)" роль="презентация">
.
Приведенная выше формула предназначена для данных одной выборки, поэтому, если есть несколько данных выборки, она фактически суммирует значения потерь этих данных выборки, а затем вычисляет среднее значение:
п ^ знак равно 1 1 + е − θ Т Икс б " роль="презентация">^p=11+e-θTXb п ^ знак равно 1 1 + е − θ Т Икс б
л ( θ ) знак равно − 1 м ∑ я знак равно 1 м у ( я ) л о г ( п ^ ( я ) ) + ( 1 − у ( я ) ) л о г ( 1 − п ^ ( я ) )" role="презентация">L(θ)=-1мм∑i=1y(i)log(^p(i))+(1-y(i))log(1-^p(i)) л ( θ ) знак равно − 1 м ∑ я знак равно 1 м у ( я ) л о г ( п ^ ( я ) ) + ( 1 − у ( я ) ) л о г ( 1 − п ^ ( я ) )
Все, что нам нужно сделать, это найти множество
θ" роль="презентация">значение такое, что указанное выше
л
(
θ
)" роль="презентация">
достичь минимального значения.
Градиент функции потерь
Приведенная выше формула не может решить нормальное уравнение, такое как линейная регрессия, поэтому нам нужно использовать метод градиентного спуска, чтобы найти
л
(
θ
)" роль="презентация">самая маленькая группа
θ" роль="презентация">
. Сначала перечислим формулы:
- Формула множественной линейной регрессии:
у
^
знак равно
Икс
б
θ" роль="презентация">
, обратите внимание на здесь Икс б "роль="презентация">
Это матрица со столбцом со всеми добавленными значениями 1, и для удобства вывода здесь θ" роль="презентация">
представляет собой вектор-столбец, не записанный как θ Т "роль="презентация">
.
- Сигмовидная функция:
о
(
т
)
знак равно
1
1
+
е
−
т
"роль="презентация">
.
- Формула вероятности логистической регрессии:
п
^
знак равно
о
(
Икс
б
θ
)
знак равно
1
1
+
е
−
Икс
б
θ
"роль="презентация">
- Функция потерь логистической регрессии:
л
(
θ
)
знак равно
−
1
м
∑
я
знак равно
1
м
(
у
(
я
)
л
о
г
(
о
(
Икс
б
(
я
)
θ
)
)
+
(
1
−
у
(
я
)
)
л
о
г
(
1
−
о
(
Икс
б
(
я
)
θ
)
)
)" роль="презентация">
В пятом примечании мы знаем, что нахождение градиента функции потерь верно
θ" роль="презентация">Этот вектор-столбец получен поэлементно:
∇ л ( θ ) знак равно [ ∂ л ( θ ) ∂ θ 0 ∂ л ( θ ) ∂ θ 1 ∂ л ( θ ) ∂ θ 2 … ∂ л ( θ ) ∂ θ н ] " role="презентация">∇L(θ)=⎡⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢⎣∂L(θ)∂θ0∂L(θ)∂θ1∂L(θ)∂θ2…∂L (θ)∂θn⎤⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥⎦ ∇ л ( θ ) знак равно [ ∂ л ( θ ) ∂ θ 0 ∂ л ( θ ) ∂ θ 1 ∂ л ( θ ) ∂ θ 2 … ∂ л ( θ ) ∂ θ н ]
Давайте посмотрим на это изнутри и начнем с функции Sigmoid, чтобы найти руку импорта.
Вывод сигмовидной функции
Сначала преобразуйте сигмовидную функцию:
о ( т ) знак равно 1 1 + е − т знак равно ( 1 + е − т ) − 1 " роль = "презентация"> σ (t) = 11 + e-t = (1 + e-t) - 1 о ( т ) знак равно 1 1 + е − т знак равно ( 1 + е − т ) − 1
Затем выводится сигмовидная функция, которая следует цепному правилу вывода и основному правилу вывода:
- Составная функция
(
ф
∘
г
)
(
Икс
)" роль="презентация">
производная от ( ф ∘ г ) ' ( Икс )" роль="презентация">
за: ( ф ∘ г ) ' ( Икс ) знак равно ф ' ( г ( Икс ) ) г ' ( Икс )" роль="презентация">
- Алгебраические производные функции:
г
Икс
н
г
Икс
знак равно
н
Икс
н
−
1
(
Икс
≠
0
)" роль="презентация">
- Экспоненциальный вывод математической константы сам по себе:
г
е
Икс
г
Икс
знак равно
е
Икс
"роль="презентация">
Таким образом, производная сигмовидной функции может быть получена как:
о
(
т
)
‘
знак равно
(
−
1
)
(
1
+
е
−
т
)
−
2
⋅
е
−
т
⋅
(
−
1
)
знак равно
(
1
+
е
−
т
)
−
2
⋅
е
−
т
" роль = "представление"> σ (t) '= (-1) (1 + e-t) - 2 ⋅ e - t ⋅ (- 1) = (1 + e - t) - 2 ⋅ e - t
о
(
т
)
‘
знак равно
(
−
1
)
(
1
+
е
−
т
)
−
2
⋅
е
−
т
⋅
(
−
1
)
знак равно
(
1
+
е
−
т
)
−
2
⋅
е
−
т
Логарифмический вывод сигмовидной функции
Давайте расширим дальше, давайте посмотрим
л
о
г
(
о
(
т
)
)" роль="презентация">производная от . Производное правило, которому следует здесь:
- Возьмем производную логарифма по основанию 2:
г
л
о
г
Икс
г
Икс
знак равно
1
Икс
"роль="презентация">
- Составная функция
(
ф
∘
г
)
(
Икс
)" роль="презентация">
производная от ( ф ∘ г ) ' ( Икс )" роль="презентация">
за: ( ф ∘ г ) ' ( Икс ) знак равно ф ' ( г ( Икс ) ) г ' ( Икс )" роль="презентация">
так
л
о
г
(
о
(
т
)
)" роль="презентация">Производная от:
л
о
г
(
о
(
т
)
)
‘
знак равно
1
о
(
т
)
⋅
о
(
т
)
‘
знак равно
1
(
1
+
е
т
)
−
1
⋅
(
1
+
е
−
т
)
−
2
⋅
е
−
т
знак равно
(
1
+
е
−
т
)
−
1
⋅
е
−
т
знак равно
е
−
т
1
+
е
−
т
знак равно
1
+
е
−
т
−
1
1
+
е
−
т
знак равно
1
−
1
1
+
е
−
т
знак равно
1
−
о
(
т
)" role="презентация">log(σ(t))'=1σ(t)⋅σ(t)'=1(1+et)−1⋅(1+e−t)−2⋅e−t =(1+e−t)−1⋅e−t=e−t1+e−t=1+e−t−11+e−t=1−11+e−t=1−σ(t)
л
о
г
(
о
(
т
)
)
‘
знак равно
1
о
(
т
)
⋅
о
(
т
)
‘
знак равно
1
(
1
+
е
т
)
−
1
⋅
(
1
+
е
−
т
)
−
2
⋅
е
−
т
знак равно
(
1
+
е
−
т
)
−
1
⋅
е
−
т
знак равно
е
−
т
1
+
е
−
т
знак равно
1
+
е
−
т
−
1
1
+
е
−
т
знак равно
1
−
1
1
+
е
−
т
знак равно
1
−
о
(
т
)
л
о
г
(
1
−
о
(
т
)
)" роль="презентация">Производная от:
л о г ( 1 − о ( т ) ) ‘ знак равно 1 1 − о ( т ) ⋅ ( − о ( т ) ) ‘ знак равно 1 1 − 1 1 + е − т ⋅ ( 1 + е − т ) − 2 ⋅ е − т ⋅ − 1 знак равно ( 1 + е − т ) − 1 е − т ⋅ е − т ⋅ − 1 знак равно − ( 1 + е − т ) − 1 знак равно − о ( т )" role="презентация">log(1−σ(t))'=11−σ(t)⋅(-σ(t))'=11−11+e−t⋅(1+e−t) −2⋅e−t⋅−1=(1+e−t)−1e−t⋅e−t⋅−1=−(1+e−t)−1=−σ(t) л о г ( 1 − о ( т ) ) ‘ знак равно 1 1 − о ( т ) ⋅ ( − о ( т ) ) ‘ знак равно 1 1 − 1 1 + е − т ⋅ ( 1 + е − т ) − 2 ⋅ е − т ⋅ − 1 знак равно ( 1 + е − т ) − 1 е − т ⋅ е − т ⋅ − 1 знак равно − ( 1 + е − т ) − 1 знак равно − о ( т )
Вывод функции потерь логистической регрессии
Когда мы знаем результаты вывода сигмовидной функции и логарифм сигмовидной функции, нам легко вывести функцию потерь логистической регрессии (здесь для первого
j" роль="презентация">Кусок
θ" роль="презентация">
Ищите вывод), сначала посмотрите на первую половину:
г
(
у
(
я
)
л
о
г
(
о
(
Икс
б
(
я
)
θ
)
)
)
г
θ
Дж
знак равно
у
(
я
)
⋅
(
1
−
о
(
Икс
б
(
я
)
θ
)
)
⋅
Икс
Дж
(
я
)
" роль = "представление"> d (y (i) log (σ (X (i) bθ))) dθj = y (i) ⋅ (1 − σ (X (i) b θ)) ⋅ X (i) j
г
(
у
(
я
)
л
о
г
(
о
(
Икс
б
(
я
)
θ
)
)
)
г
θ
Дж
знак равно
у
(
я
)
⋅
(
1
−
о
(
Икс
б
(
я
)
θ
)
)
⋅
Икс
Дж
(
я
)
последний
Икс
Дж
(
я
)
"роль="презентация">первый
j" роль="презентация">
Кусок
θ" роль="презентация">
Предыдущие коэффициенты, а затем посмотрите на вторую половину:
г
(
(
1
−
у
я
)
л
о
г
(
1
−
о
(
Икс
б
(
я
)
θ
)
)
)
г
θ
Дж
знак равно
(
1
−
у
(
я
)
)
⋅
(
−
о
(
Икс
б
(
я
)
θ
)
)
⋅
Икс
Дж
(
я
)
" роль = "представление"> d ((1-yi) log (1-σ (X (i) bθ))) dθj = (1-y (i)) ⋅ (- σ (X (i) bθ)) ⋅Х(я)j
г
(
(
1
−
у
я
)
л
о
г
(
1
−
о
(
Икс
б
(
я
)
θ
)
)
)
г
θ
Дж
знак равно
(
1
−
у
(
я
)
)
⋅
(
−
о
(
Икс
б
(
я
)
θ
)
)
⋅
Икс
Дж
(
я
)
На этом этапе вывод всей функции потерь представляет собой сложение двух вышеуказанных частей:
Таким образом, градиент функции потерь логистической регрессии:
∇
л
(
θ
)
знак равно
1
м
[
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
Икс
1
(
я
)
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
Икс
2
(
я
)
…
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
Икс
н
(
я
)
]
" role="презентация">∇L(θ)=1m⎡⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢⎣∑mi=1(σ(X(i)bθ)−y(i))∑mi=1(σ (X(i)bθ)−y(i))X(i)1∑mi=1(σ(X(i)bθ)−y(i))X(i)2…∑mi=1(σ( X(i)bθ)−y(i))X(i)n⎤⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥⎦
∇
л
(
θ
)
знак равно
1
м
[
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
Икс
1
(
я
)
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
Икс
2
(
я
)
…
∑
я
знак равно
1
м
(
о
(
Икс
б
(
я
)
θ
)
−
у
(
я
)
)
Икс
н
(
я
)
]
Давайте рассмотрим градиент линейной регрессии в пятой ноте:
∇
л
(
θ
)
знак равно
2
м
[
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
Икс
1
(
я
)
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
Икс
2
(
я
)
…
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
Икс
н
(
я
)
]
" role="презентация">∇L(θ)=2m⎡⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢⎣∑mi=1(X(i)bθ−y(i))∑mi=1(X(i) bθ−y(i))X(i)1∑mi=1(X(i)bθ−y(i))X(i)2…∑mi=1(X(i)bθ−y(i)) X(i)n⎤⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥⎦
∇
л
(
θ
)
знак равно
2
м
[
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
Икс
1
(
я
)
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
Икс
2
(
я
)
…
∑
я
знак равно
1
м
(
Икс
б
(
я
)
θ
−
у
(
я
)
)
Икс
н
(
я
)
]
Можно обнаружить, что два градиента очень похожи по форме, поскольку градиент линейной регрессии можно оптимизировать с помощью векторизации следующим образом:
∇
л
(
θ
)
знак равно
2
м
Икс
б
⊤
(
Икс
б
θ
−
у
)" роль="презентация">∇L(θ)=2mX⊤b(Xbθ−y)
∇
л
(
θ
)
знак равно
2
м
Икс
б
⊤
(
Икс
б
θ
−
у
)
Таким образом, градиент логистической регрессии, наконец, может быть записан как:
∇
л
(
θ
)
знак равно
1
м
Икс
б
⊤
(
о
(
Икс
б
θ
)
−
у
)" роль="презентация">∇L(θ)=1mX⊤b(σ(Xbθ)−y)
∇
л
(
θ
)
знак равно
1
м
Икс
б
⊤
(
о
(
Икс
б
θ
)
−
у
)
Реализация алгоритма логистической регрессии
Поскольку функция потерь при подгонке логистической регрессии использует метод градиентного спуска, когда мы инкапсулируем алгоритм логистической регрессии, можно применить большинство методов градиентного спуска линейной регрессии, которые мы инкапсулировали ранее, и только некоторые коды в функции потерь, прогнозировании и подсчете должны быть модифицировать. .
import numpy as np
from .metrics import accuracy_score
class LogisticRegression:
def __init__(self):
# 截距theta0
self.intercept_ = None
# 系数,theta1 ... thetaN
self.coef_ = None
# theta列向量
self._theta = None
# 定义Sigmoid私有函数
def _sigmoid(self, t):
return 1. / (1. + np.exp(-t))
# 使用批量梯度下降法,根据训练数据集X_train,y_train训练LogisticRegression模型
def fit(self, X_train, y_train, is_debug=False, eta=0.01, n_iters=1e4):
assert X_train.shape[0] == y_train.shape[0], \
"特征数据矩阵的行数要等于样本结果数据的行数"
# 定义逻辑回归损失函数
def L(theta, X_b, y):
# 定义逻辑回归概率公式
y_hat = self._sigmoid(X_train.dot(theta))
try:
return -np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat)) / len(X_b)
except:
return float('inf')
# 定义逻辑回归梯度
def dL(theta, X_b, y):
return X_b.T.dot(self._sigmoid(X_b.dot(theta)) - y) / len(X_b)
def dL_debug(theta, X_b, y, epsilon=0.01):
# 开辟大小与theta向量一致的向量空间
result = np.empty(len(theta))
# 便利theta向量中的每一个theta
for i in range(len(theta)):
# 复制一份theta向量
theta_1 = theta.copy()
# 将第i个theta加上一个距离,既求该theta正方向的theta
theta_1[i] += epsilon
# 在复制一份theta向量
theta_2 = theta.copy()
# 将第i个theta减去同样的距离,既求该theta负方向的theta
theta_2[i] -= epsilon
# 求出这两个点连线的斜率,既模拟该theta的导数
result[i] = (L(theta_1, X_b, y) - L(theta_2, X_b, y)) / (2 * epsilon)
return result
# 实现批量梯度下降法
def gradient_descent(X_b, y, initial_theta, eta, difference=1e-8):
theta = initial_theta
i_iter = 0
while i_iter < n_iters:
# 当is_debug为True时走debug的求梯度的方法,反之走梯度公式的方法
if is_debug:
gradient = dL_debug(theta, X_b, y)
else:
gradient = dL(theta, X_b, y)
last_theta = theta
theta = theta - eta * gradient
if (abs(L(theta, X_b, y) - L(last_theta, X_b, y)) < difference):
break
i_iter += 1
return theta
# 构建X_b
X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
# 初始化theta向量为元素全为0的向量
initial_theta = np.zeros(X_b.shape[1])
self._theta = gradient_descent(X_b, y_train, initial_theta, eta)
self.intercept_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
# 计算概率,给定待预测数据集X_predict,返回表示X_predict的结果概率向量
def predict_probability(self, X_predict):
assert self.intercept_ is not None and self.coef_ is not None, \
"截距和系数都不为空,表示已经经过了fit方法"
assert X_predict.shape[1] == len(self.coef_), \
"要预测的特征数据集列数要与theta的系数数量相等"
X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
# 返回0,1之间的浮点数
return self._sigmoid(X_b.dot(self._theta))
# 给定待预测数据集X_predict,返回表示X_predict的结果向量
def predict(self, X_predict):
assert self.intercept_ is not None and self.coef_ is not None, \
"截距和系数都不为空,表示已经经过了fit方法"
assert X_predict.shape[1] == len(self.coef_), \
"要预测的特征数据集列数要与theta的系数数量相等"
probability = self.predict_probability(X_predict)
# 将概率转换为0和1的向量,True对应1,False对应0
return np.array(probability >= 0.5, dtype='int')
# 根据测试数据集X_test和y_test确定当前模型的准确度
def score(self, X_test, y_test):
y_predict = self.predict(X_test)
return accuracy_score(y_test, y_predict)
def __repr__(self):
return "LinearRegression()"
Ниже мы используем данные радужной оболочки, предоставленные Scikit Learn в Jupyter Notebook, чтобы проверить наш инкапсулированный метод логистической регрессии:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
Поскольку в данных радужной оболочки есть три типа радужной оболочки, а логистическая регрессия — это алгоритм решения проблемы двух классов в начале, поэтому мы берем только первые два типа данных радужной оболочки для проверки и используем только данные радужной оболочки каждого типа радужной оболочки Первые два признака удобны для рисования:
# 只取前两类的鸢尾花数据
X = X[y<2, :2]
y = y[y<2]
plt.scatter(X[y==0, 0], X[y==0, 1], color='red')
plt.scatter(X[y==1, 0], X[y==1, 1], color='blue')
plt.show()
from myML.LogisticRegression import LogisticRegression
from myML.modelSelection import train_test_split
X_train, y_train, X_test, y_test = train_test_split(X, y, seed=666)
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
log_reg.score(X_test, y_test)
# 结果
1.0
log_reg.predict_probability(X_test)
# 概率结果
array([ 0.92972035, 0.98664939, 0.14852024, 0.17601199, 0.0369836 ,
0.0186637 , 0.04936918, 0.99669244, 0.97993941, 0.74524655,
0.04473194, 0.00339285, 0.26131273, 0.0369836 , 0.84192923,
0.79892262, 0.82890209, 0.32358166, 0.06535323, 0.20735334])
log_reg.predict(X_test)
# 分类结果
array([1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0])
y_test
# 测试数据结果
array([1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0])
Можно видеть, что наш инкапсулированный алгоритм логистической регрессии на 100% точен для классификации ирисов, конечно, потому что текущие данные относительно просты.
Отказ от ответственности: эта статья является MOOC.comliuyuboboboучитель«Введение в классические алгоритмы машинного обучения Python3 и приложения»Учебные заметки курса не могут быть воспроизведены без разрешения.