Узнайте все о логистической регрессии.

Содержание:

Введение:
Линейная регрессия
Логистическая регрессия
Функция затрат:
Алгоритм градиентного спуска:
Реализация:
Резюме:

Введение:

  • Логистическая регрессия - это алгоритм обучения с учителем, используемый для двоичной классификации.
  • например (Верно или неверно, да или нет, 1 или 0).
  • Его также можно использовать для мультиклассовой классификации.
  • но для многоклассовой классификации мы должны сделать что-то еще, есть концепции, называемые один против остальных, один против всех. мы увидим это в следующих статьях.

Давайте разберемся с логистической регрессией на примере…

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

# creating random data points 
x =  np.linspace(-10, 10, 10)
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
plt.figure(figsize=(7, 4), dpi=100)
plt.title('X vs class(1 or 0)')
plt.xlabel('X values')
plt.ylabel('class (0 or 1)')
plt.scatter(x, y)
plt.savefig('logistic_regression.jpg')
plt.show()
output:

  • Мы видим, что если значение X больше 0, класс равен 1, а если значение X меньше 0, класс равен 0.
  • Первый вопрос, который приходит в голову, - можем ли мы решить эту проблему с помощью линейной регрессии, и ответ - да, мы можем решить эту проблему с помощью линейной регрессии .

Нажмите здесь, чтобы просмотреть мою статью о линейной регрессии.

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

Давайте начнем…

"Линейная регрессия"

Давайте разберемся с этой проблемой с помощью линейной регрессии.

Код ниже используется для прогнозирования значений с помощью линейной регрессии и построения графика.

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x.reshape(-1,1), y)
pred = lr.predict(x.reshape(-1,1))
print(y, pred, sep='\n')
plt.figure(figsize=(7, 4), dpi=100)
plt.title('X vs class(1 or 0)')
plt.xlabel('X values')
plt.ylabel('class (0 or 1)')
plt.scatter(x, y, label="Actual")
plt.plot(x, pred, label="Predicted")
plt.legend(loc='upper left')
plt.savefig('logistic_regression_1.jpg')
plt.show()

Теперь, если прогнозируемое значение больше 0,5, мы считаем, что класс равен 1, а если меньше 0,5, то класс равен 0.

Недостатки линейной регрессии перед проблемой логистической регрессии или классификации:

  1. Частота ошибок очень высока.
  2. очень чувствителен к выбросам.
  3. в большинстве случаев мы получаем прогнозируемые значения больше 1 и меньше 0.

На приведенном ниже графике показано, как выбросы влияют на наиболее подходящую линию…

Пришло время разобраться в логистической регрессии.

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

  • Логистическая регрессия использует сигмовидную функцию, и эта функция создает наиболее подходящую линию, например S-образную форму.

  • Теперь возникает вопрос, откуда взялась эта функция. Итак, давайте разберемся, что сначала…
    мы знаем функцию линейной регрессии y = mx + c. мы просто преобразуем эту функцию в форму гипотезы.

  • но, как мы видели, когда мы используем линейную регрессию для решения проблемы двоичной классификации, некоторые предсказанные значения больше 1 и меньше 0. Но нам нужны выходные значения в диапазоне от 0 до 1 . как мы это делаем ??
  • нам нужно изменить приведенное выше уравнение, как показано ниже ...

  • Вышеупомянутая функция - наша последняя функция Sigmod.

Давайте посмотрим, как мы можем предсказать значения, используя эту сигмовидную функцию…

Мы будем прогнозировать значения X, используя нашу сигмовидную функцию, когда θ = 1.

def sigmoid(x, theta=1):
    # Activation function used to map any real value between 0 and 1
    return 1 / (1 + np.exp(-np.dot(x, theta)))
y_pred = sigmoid(x, 1)
y_pred
output:
array([4.53978687e-05, 4.18766684e-04, 3.85103236e-03, 3.44451957e-02,2.47663801e-01, 7.52336199e-01, 9.65554804e-01, 9.96148968e-01,9.99581233e-01, 9.99954602e-01])

Теперь мы сравним фактические значения с прогнозируемыми, построив простой график.

plt.figure(figsize=(7, 4), dpi=100)
plt.ylabel('class (0 or 1)')
plt.scatter(x, y, label="Actual")
plt.scatter(x, y_pred, label="Predicted")
plt.plot(x, y_pred, linestyle='-.')
plt.legend()
plt.savefig('logistic_regression_12.jpg')
plt.show()

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

  • Функция стоимости используется для проверки ошибки между фактическими и прогнозируемыми значениями.
  • но мы не используем функцию MSE в логистической регрессии.
  • В логистической регрессии y является нелинейной функцией, если мы поместим эту функцию стоимости в уравнение MSE, она даст не- выпуклая кривая, как показано ниже на рисунке 2.5.
  • и когда мы пытаемся оптимизировать значения с помощью градиентного спуска, это создаст сложности при поиске глобальных минимумов.
  • В логистической регрессии функция Log Loss используется как функция стоимости.

Давайте разберемся с функцией затрат

Ниже представлена ​​функция стоимости для логистической регрессии.

Функция упрощенной стоимости…

если y = 1, то:

это то же самое, что мы имеем на рисунке 2.6, когда y = 1

и если y = 0, то:

это то же самое, что и на рисунке 2.6, когда y = 0

В конце концов, у нас есть последняя функция затрат

ниже приведен код на Python для функции стоимости:

def cost_function(x, y, t): # t= theta value
    m = len(x)
    total_cost = -(1 / m) * np.sum(
        y * np.log(sigmoid(x, t)) + 
        (1 - y) * np.log(1 - sigmoid(x, t)))
    return total_cost
cost_function(x, y, 1)
output:
0.06478942360607087

Теперь построим график для разных значений тета.

# ploting graph for diffrent values of m vs cost function
plt.figure(figsize=(10,5))
T = np.linspace(-1, 1,10)
error = []
i= 0
for t in T:
    
    error.append(cost_function(x,y, t)) 
    print(f'for t = {t} error is {error[i]}')
    i+=1
plt.plot(T, error)plt.scatter(T, error)
plt.ylabel("cost function")
plt.xlabel("t")
plt.title("Error vs t")
plt.savefig('costfunc.jpg')
plt.show()

Алгоритм градиентного спуска:

Пришло время реализовать линейную регрессию.

Выполнение:

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(x.reshape(-1,1), y)
pred = lr.predict(x.reshape(-1,1))
prob = lr.predict_proba(x.reshape(-1,1))
print(y, np.round(np.array(pred), 2), sep='\n')
output:
[0 0 0 0 0 1 1 1 1 1]
[0 0 0 0 0 1 1 1 1 1]
  • значение theta:
lr.coef_
output:
array([[0.93587902]])
  • значение перехвата:
lr.intercept_
output:
array([-6.3343145e-17])
  • окончательный результат:
lr.score(x.reshape(-1, 1), y)
output:
1.0
  • построение графика фактического и прогнозируемого
plt.figure(figsize=(7, 4), dpi=100)
plt.title('X vs class(1 or 0)')
plt.xlabel('X values')
plt.ylabel('class (0 or 1)')
plt.scatter(x, y, label="actual")
plt.plot(x, pred, label="predicted", color='red')
plt.legend(loc='upper left')
plt.savefig('logistic_regression.jpg')
plt.show()

Щелкните здесь, чтобы просмотреть мою полную записную книжку Jupyter по логистической регрессии.

Резюме:

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