Двумерный пример

Логистическая регрессия - это модель, используемая для прогнозирования «или-или» целевой переменной. Пример, над которым мы будем работать:

  • Целевая переменная: учащийся сдаст или не сдаст экзамен.
  • Независимая переменная: количество часов, потраченных на обучение в неделю.

Логистические модели - это, по сути, линейные модели с дополнительным шагом. В логистических моделях линейная регрессия проходит через «сигмовидную функцию», которая сжимает свои выходные данные в дихотомические единицы и нули.

Если бы мы хотели предсказать фактические результаты тестов, мы бы использовали линейную модель. Если бы мы хотели предсказать «пройден» / «не пройден», мы бы использовали модель логистической регрессии.

Линейный (прогноз числового результата теста):

y = b0 + b1x

Логистика (прогноз «пройден / не пройден»):

p = 1 / 1 + e ^-(b0 + b1x)

Визуализация:

На изображении ниже прямая линия является линейной, а линия в форме буквы «S» - логистической. Логистические регрессии имеют более высокую точность при использовании для моделей «или-или» из-за их формы.

Понимание данных:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_excel(r”C:\Users\x\x\Log_test.xlsx”)
x = df[‘W_hours’]
y = df[‘Y’]
plt.scatter(x,y)
plt.show()

df.info()
x.plot.hist()
y.plot.hist()

В наборе данных 23 строки. Ниже представлено распределение изученных часов:

Ниже представлено распределение пройденных (1) / неудачных (0):

Подготовка данных / моделирование

Затем мы будем использовать библиотеку sklearn для импорта LogisticRegression. Подробности о параметрах можно найти здесь.

Мы конвертируем нашу двумерную модель в двухмерную с помощью функции .reshape (). Мы определяем 1 столбец, но оставляем количество строк равным размеру набора данных. Итак, мы получаем новую форму для x как (23, 1), вертикальный массив. Это необходимо для правильной работы функции sklearn.

Используйте «logreg.fit (x, y)» для соответствия регрессии.

from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression(C=1.0, solver=’lbfgs’, multi_class=’ovr’)
#Convert a 1D array to a 2D array in numpy
x = x.reshape(-1,1)
#Run Logistic Regression
logreg.fit(x, y)

Использование и визуализация модели

Давайте напишем программу, в которой мы сможем получить прогнозируемую вероятность сдачи и невыполнения по часам изучения. Мы вводим время обучения в код ниже: Примеры изучаемых 12, 16 и 20 часов.

print(logreg.predict_proba([[12]]))
print(logreg.predict_proba([[16]]))
print(logreg.predict_proba([[20]]))

Выход слева - это вероятность отказа, выход справа - проходной.

Чтобы визуализировать модель, давайте сделаем цикл, в котором каждые полчаса учебного времени мы вводим регрессию от 0 до 33.

hours = np.arange(0, 33, 0.5)
probabilities= []
for i in hours:
    p_fail, p_pass = logreg.predict_proba([[i]])[0]
    probabilities.append(p_pass)
plt.scatter(hours,probabilities)
plt.title("Logistic Regression Model")
plt.xlabel('Hours')
plt.ylabel('Status (1:Pass, 0:Fail)')
plt.show()

В этом вымышленном наборе данных учащийся гарантированно сдает экзамен, если он / она учится более 20 часов, и гарантированно не сдаст экзамен, если менее 10 часов. 17 часов - это отметка 50/50.

Спасибо за прочтение,