Логистическая регрессия для алгоритмов машинного обучения

машинное обучение алгоритм
Логистическая регрессия для алгоритмов машинного обучения

Хотя в названии алгоритма логистической регрессии есть слово «регрессия», на самом деле алгоритм логистической регрессии используется для решения задач классификации. Проще говоря, логистическая регрессия — это метод машинного обучения для решения задач бинарной классификации (0 или 1) для оценки вероятности чего-либо. Например, возможность того, что пользователь купит определенный продукт, возможность пациента, страдающего определенным заболеванием, и возможность того, что пользователь нажмет на рекламу. Обратите внимание, что здесь используется слово «вероятность», а не математическая «вероятность». , Это предположение не так просто выполнить в реальных случаях, поэтому во многих случаях получаемое нами выходное значение логистической регрессии нельзя использовать в качестве реальной вероятности, а можно использовать только в качестве уровня достоверности). Этот результат часто используется для взвешенного суммирования с другими собственными значениями, а не для непосредственного умножения.

Логистическая регрессия иЛинейная регрессияОбе являются обобщенными линейными моделями. Логистическая регрессия предполагает, что зависимая переменная y следует распределению Бернулли, а линейная регрессия предполагает, что зависимая переменная y следует распределению Гаусса. Следовательно, есть много общего с линейной регрессией.Если сигмовидная функция отображения удалена, алгоритм логистической регрессии представляет собой линейную регрессию. Можно сказать, что логистическая регрессия теоретически поддерживается линейной регрессией, но логистическая регрессия вводит нелинейные факторы через сигмовидную функцию, поэтому она может легко справляться с проблемами классификации 0/1.

Плюсы и минусы логистической регрессии

преимущество:

  • Быстрый, подходит для задач бинарной классификации
  • Просто и легко понять, напрямую увидеть вес каждой особенности
  • Модели могут быть легко обновлены для поглощения новых данных

недостаток:

  • Способность адаптироваться к данным и сценариям ограничена, не так адаптируема, как алгоритм дерева решений.

Принцип алгоритма логистической регрессии

Функция гипотезы

Сначала мы должны ввести сигмовидную функцию, также известную как логистическая функция:

\[g(z)=\frac{1}{1+e^{-z}}\]

Его функциональная кривая выглядит следующим образом:

Как видно из вышеуказанной фигуры, функция Sigmoid представляет собой S-образную кривую, и его значение составляет между [0, 1], а значение функции будет быстро подходить 0 или 1, когда он далеко от 0. Эта особенностью очень важна для решения проблем двоичных классификаций.

Гипотетическая функция для логистической регрессии имеет вид:

\[h_\theta (x) = g(\theta ^Tx),g(z)=\frac{1}{1+e^{-z}}\]

так:

\[h_\theta (x) =\frac{1}{1+e^{-\theta ^Tx}}\]

где x - наш ввод,\thetaПараметры просим взять. Модель машинного обучения фактически ограничивает функцию принятия решений определенным набором условий, и этот набор условий определяет пространство гипотез модели. Конечно, мы также хотим, чтобы этот набор квалификаций был простым и разумным. Предположения, сделанные моделью логистической регрессии, следующие:

\[P(y=1|x;\theta )=g(\theta ^Tx)=\frac{1}{1+e^{-\theta ^Tx}}\]

Эта функция означает, что при данных x и\thetaВероятность y=1 при условии . Здесь g(h) — упомянутая выше сигмовидная функция, а соответствующая решающая функция:

\[y^* = 1, if P(y=1|x)>0.5\]

Выберите 0,5 Поскольку порог является общим подходом, можно выбрать конкретный случай, когда фактическое приложение может выбрать разные пороги.Если точность точности нормали высока, можно выбрать порог, а отзыв положительного результата высок, то порог можно выбрать.маленький.

Граница принятия решения

Граница решения, также известная как поверхность решения, представляет собой плоскость или поверхность, используемую для разделения выборок разных классов в N-мерном пространстве. Примечание. Граница решения — это свойство гипотетической функции, определяемое параметрами, а не характеристиками набора данных. Здесь мы приводим две диаграммы из курса Эндрю Нг, объясняющие проблему:

Линейная граница решения

Здесь граница решения:-3+x_1+x_2=0

нелинейная граница решения

Здесь граница решения:-1+x_1^2+x_2^2 = 0

Приведенные выше два рисунка ясно объясняют, что такое граница решения Граница решения на самом деле представляет собой уравнение В логистической регрессии граница решения состоит из\theta^Tx=0определение:

\[P(y=1|x;\theta )=g(\theta ^Tx)=\frac{1}{1+e^{-\theta ^Tx}}\]

Здесь мы должны обратить внимание, чтобы понять разницу и связь между функцией гипотезы и граничной функцией решения. Граница решения — это свойство функции гипотезы, определяемое параметрами функции гипотезы (\theta)Принять решение.

В логистической регрессии предполагается, что функцияh=g(z)Используется для расчета вероятности того, что образец принадлежит классу; решающая функцияy^* = 1, if P(y=1|x)>0.5Класс, используемый для вычисления (данных) выборок; граница решения\theta^Tx=0Уравнение для определения классификационной функции (модели) границ классификации.

Функция стоимости

Предположения логистической регрессии:h_\theta(x) = 1 / (1 + e^{- \theta^T x}), наша задача найти "подходящее"\thetaмаксимально приблизить эту гипотезу к нашей проблеме. Например, в задачах классификации мы хотим, чтобы граница решения максимально разделяла данные. Так как же выразить эту потребность математически? В линейной регрессии среднеквадратическая ошибка обычно используется для оценки\thetaхорошо или плохо:

\[J(\theta) = \frac{1}{m}\sum_{i=1}^{m}{\frac{1}{2} (h_\theta(x^{(i)} ) - y^{(i)} )^2}\]

которыйJ(\theta)меньший, думаю\thetaлучшее. Тогда почему бы просто не поставить логистическую регрессиюh_\theta(x)Как насчет подстановки среднеквадратичной ошибки? Причина в этомJ(\theta)является невыпуклой функцией. Возьмем пример:

samples = [(-5, 1), (-20, 0), (-2, 1)]
 
def sigmoid(theta, x):
    return 1/(1 + math.e**(- theta*x))
 
def cost(theta):
    diffs = [(sigmoid(theta, x) - y) for x,y in samples]
    return sum(diff * diff for diff in diffs)/len(samples)/2
 
X = np.arange(-1, 1, 0.01)
Y = np.array([cost(theta) for theta in X])
plt.plot(X, Y)
plt.show()

Видно, что эта функция потерь невыпуклая, а локальный минимум не равен глобальному минимуму, поэтому решить ее методом градиентного спуска затруднительно. Таким образом, модель логистической регрессии использует следующую функцию потерь:

\[J(\theta) = \frac{1}{m}\sum_{i=1}^{m}{ Cost( h_\theta (x^{(i)}) , y)}\]

\[Cost( h_\theta (x) , y) = \begin{cases}-\log(h_\theta(x)), & \text{if}\ y = 1 \\-\log(1 - h_\theta(x)), & \text{if}\ y = 0 \end{cases}\]

Написано в унифицированной форме:

\[J(\theta) = - \frac{1}{m}\Big[\sum_{i=1}^{m}{ y^{(i)} \log h_{\theta} ( x^{(i)} ) + (1-y^{(i)} ) \log (1-h_\theta(x^{(i)} ) )}\Big]\]

Так как же функция потерь влияет на решение? Во-первых, функция потерь — это штраф за неверные выводы относительно hθ(x). Следовательно, чем меньше потери, тем более правильным обычно считается вывод hθ(x). Приведенная выше формула означает, что чем меньше потери, тем «ближе» результирующая поверхность hθ(x) будет к точке данных, другими словами, «круче»:

В этой картине,J(\theta_{blue}) < J(\theta_{green}), то есть соответствующую синюю поверхность\thetaПотеря меньше, чем соответствующая зеленая поверхность\thetaценность. Как видите, синяя поверхность с небольшими потерями более крутая.

Как функция потерь влияет на границу решения? мы принимаемh_\theta(x) = 0.5Граница решения , вы можете видеть, что граница решения также немного отличается:

Но поскольку эти два\thetaОба набора данных можно различить, поэтому они особо не отличаются. Предположительно, при обучении логистической регрессии первые несколько итераций должны быть в состоянии быстро сформулировать границу решения, а роль следующих итераций должна заключаться в том, чтобы позволитьh_\theta(x)Помогает ли граница принятия решения «более крутая», слепая погоня за меньшими потерями?

Подводя итог, как определить функцию потерь модели? Во-первых, функция потерь должна правильно оценивать параметры, чтобы параметры с меньшими потерями были более полезными для решения задачи; с другой стороны, в рамках метода оптимизации требуется решить функцию потерь. Конечно, некоторые часто используемые функции потерь модели также определяются приблизительно.

Градиентный спуск

иЛинейная регрессияТочно так же мы используемАлгоритм градиентного спускадля решения параметров модели логистической регрессии. Для получения дополнительной информации о градиентном спуске см.Линейная регрессиясоответствующий контент в статье.

Регуляризация

Когда модель имеет слишком много параметров, легко столкнуться с проблемой переобучения. В настоящее время необходим метод управления сложностью модели.Типичный подход заключается в добавлении регулярного члена к цели оптимизации, чтобы предотвратить переоснащение путем штрафования слишком больших параметров.

\[J(\theta) = -\frac{1}{N}\sum {y\log{g(\theta^T x)} + (1-y)\log{(1-g(\theta^T x))}} + \lambda \Vert w \Vert_p\]

В общем, возьмите p = 1 или p = 2, которые соответствуют регуляризации L1 и L2 соответственно.Разницу между ними можно увидеть на следующем рисунке.Регуляризация L1 (левое изображение) стремится сделать параметр равным 0, поэтому он может be дает разреженное решение.

Для получения дополнительной информации о регуляризации см.Регрессия хребта, регрессия ЛассоПодробности в статье.

Логистическая регрессия с помощью Scikit-Learn

В scikit-learn модели логистической регрессии состоят из классовsklearn.linear_model.LogisticRegressionвыполнить.

Обычный вес товара

Обычный вес товара\lambda, в LogisticRegression есть параметр C, который соответствует этому, но обратно пропорционален. То есть, чем больше значение C, тем меньше вес регулярного члена и модель склонна к переобучению, чем меньше значение C, тем больше вес регулярного члена и модель склонна к недообучению.

L1/L2 норма

При создании модели логистической регрессии существует штраф за параметр, и его значение равно «l1» или «l2», что на самом деле является формой указания обычного термина, который мы ввели ранее.

Самый простой способ использования:

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
 
nb_samples = 500
X, Y = make_classification(n_samples=nb_samples, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25)
 
lr = LogisticRegression()
lr.fit(X_train,Y_train)
 
train_score = lr.score(X_train, Y_train)  # 模型对训练样本得准确性
test_score = lr.score(X_test, Y_test)  # 模型对测试集的准确性
print(train_score)
print(test_score)

Для оптимизации параметров вы можете выбрать LogisticRegressionCV или GridSearchCV.

GridSearchCV:

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
import numpy as np
 
iris = load_iris()
 
param_grid = {
    'penalty': ["l1", "l2"],
    'C': np.power(10.0, np.arange(-10, 10))
}
 
gs = GridSearchCV(estimator=LogisticRegression(), param_grid=param_grid, scoring='accuracy', cv=10)
 
gs.fit(iris.data, iris.target)
print(gs.best_estimator_)

Логистическая регрессияCV:

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegressionCV
from sklearn.model_selection import KFold
import numpy as np
 
iris = load_iris()
fold = KFold(n_splits=5, shuffle=True, random_state=777)
 
searchCV = LogisticRegressionCV(
    Cs=list(np.power(10.0, np.arange(-10, 10)))
    , penalty='l2'
    , scoring='roc_auc'
    , cv=fold
    , random_state=777
    , max_iter=10000
    , fit_intercept=True
    , solver='newton-cg'
    , tol=10
)
 
searchCV.fit(iris.data, iris.target)
print('Max auc_roc:', searchCV.scores_[1].mean(axis=0).max())

Ссылка на ссылку:

Наградить автора