Узнайте все о логистической регрессии.
Содержание:
∘ Введение:
∘ Линейная регрессия
∘ Логистическая регрессия
∘ Функция затрат:
∘ Алгоритм градиентного спуска:
∘ Реализация:
∘ Резюме:
Введение:
- Логистическая регрессия - это алгоритм обучения с учителем, используемый для двоичной классификации.
- например (Верно или неверно, да или нет, 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 и меньше 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()
Алгоритм градиентного спуска:
- Алгоритм градиентного спуска такой же, как мы видели в статье о линейной регрессии.
- Единственное отличие здесь - это функция гипотезы, показанная на рисунке 2.3.
- Щелкните здесь, чтобы узнать о градиентном спуске.
Пришло время реализовать линейную регрессию.
Выполнение:
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 по логистической регрессии.
Резюме:
- мы обсуждаем логистическую регрессию, функцию стоимости и алгоритм градиентного спуска.
- мы поняли интуицию, лежащую в основе логистической регрессии.