В предыдущей статье я говорил о линейной регрессии. В этой статье я собираюсь исключительно поговорить о логистической регрессии на практике с использованием python. Я собираюсь показать вам, как реализовать логистическую регрессию в python с помощью библиотеки sklearn, и в последнюю очередь я буду использовать библиотеку statsmodels.api.

Прежде всего, если вы никогда не используете машинное обучение или ничего не знаете о sklearn, я бы хотел, чтобы вы не пропускали ни одного шага в этом чтении, потому что вы найдете полезную логику в этом методе.

Еще одна вещь, которую я хотел бы добавить, прежде чем вы начнете, я мог бы вам лучше создать блокнот, чтобы вы могли практиковать это самостоятельно. Эта техника помогает мне привыкнуть к тому, что я изучаю, и сделать это второй натурой во время практики. Пожалуйста, сделайте то же самое. Хорошо, давайте перейдем к методу ML.

1. Согласно машинному обучению

Логистическая регрессия с точки зрения машинного обучения — это метод решения задач бинарной классификации. Он основан на идее моделирования вероятности результата как функции линейной комбинации входных признаков.

Во-первых, нам нужно импортировать необходимые модули и загрузить данные. Мы будем использовать набор данных Iris, который содержит 150 образцов трех разных видов цветков ириса, а также четыре характеристики: длину чашелистика, ширину чашелистика, длину лепестка и ширину лепестка. Не беспокойтесь о том, откуда взять этот набор данных. Этот набор данных находится в библиотеке sklearn. Как только вы запустите приведенный ниже код, он будет загружен автоматически. Мы будем использовать только два признака (длина лепестка и ширина лепестка) и два класса (сетоза и лишай) для простоты.

# Import modules
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
print("Done!")
# Load data
iris = load_iris()
X = iris.data[:, 2:4] # Petal length and width
y = iris.target
# Keep only two classes
X = X[y < 2]
y = y[y < 2]

Далее нам нужно подогнать к данным модель логистической регрессии. Мы можем использовать класс LogisticRegression из scikit-learn, который предоставляет различные параметры для регуляризации, решателя и настроек нескольких классов. Мы будем использовать параметры по умолчанию для этого примера.

# Fit logistic regression model
model = LogisticRegression()
model.fit(X, y)

Наконец, мы можем оценить производительность модели и визуализировать границу решения. Мы можем использовать метод оценки для вычисления точности модели на обучающих данных. Мы также можем использовать метод predict_proba для получения предсказанных вероятностей для каждого класса. Чтобы построить границу решения, мы можем создать сетку точек и использовать модель для прогнозирования их меток классов.

# Evaluate model performance
accuracy = model.score(X, y)
print(f"Accuracy: {accuracy:.2f}")
# Result = Accuracy: 1.00
# Predict probabilities
probs = model.predict_proba(X)
print(f"Probabilities:\n{probs[:5]}")

#result = 
# Probabilities: 
#[[0.98163579 0.01836421]
# [0.98163579 0.01836421]
# [0.98575606 0.01424394]
# [0.97635225 0.02364775]
# [0.98163579 0.01836421]]

Граница решения участка

# Create a mesh grid of points
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
np.linspace(y_min, y_max, 100))

# Predict class labels for each point
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the mesh grid with different colors for each class
plt.contourf(xx, yy, Z, alpha=0.3);

# Plot the original data points with their labels
plt.scatter(X[:, 0], X[:, 1], c=y);
plt.xlabel("Petal length")
plt.ylabel("Petal width")
plt.title("Logistic regression on Iris dataset");

Мы видим, что модель логистической регрессии достигает точности 1,00 на обучающих данных, что означает, что она идеально разделяет два класса. Граница решения — это прямая линия, проходящая через середину точек данных. Прогнозируемые вероятности показывают, насколько модель уверена в каждой метке класса.

Логистическая регрессия — это простой, но мощный метод машинного обучения, который можно легко реализовать на Python с помощью scikit-learn. Он может обрабатывать бинарные и мультиклассовые задачи с различными вариантами регуляризации и оптимизации. Он также интерпретируем и предоставляет вероятностные результаты, которые могут быть полезны для принятия решений.

2. По данным statsmodels.api

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

Первым шагом является импорт библиотеки и загрузка данных. Мы будем использовать образец набора данных из Kaggle. Вы также можете пойти и скачать это здесь, если хотите продолжить практиковать это. Пожалуйста, загрузите только набор данных с именем файла bank.csv. Вам нужно будет иметь учетную запись на kaggle и принять правила UCI, чтобы иметь право загружать эти данные.

import statsmodels.api as sm
import pandas as pd
data = pd.read_csv("bank.csv", sep=";")
data.head()

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

data = pd.get_dummies(data, columns=["job", "marital", "education", "default", "housing", "loan", "contact", "month", "poutcome"])
data["intercept"] = 1

Третий шаг — подобрать модель логистической регрессии с помощью логит-метода из statsmodels.api. Этот метод принимает два аргумента: целевую переменную и независимые переменные. Он возвращает объект, содержащий различную информацию о модели, такую ​​как коэффициенты, p-значения и меры согласия.

model = sm.Logit("y ~ age + balance + day + duration + campaign + pdays + previous + job_admin. + job_blue-collar + job_entrepreneur + job_housemaid + job_management + job_retired + job_self-employed + job_services + job_student + job_technician + job_unemployed + job_unknown + marital_divorced + marital_married + marital_single + education_primary + education_secondary + education_tertiary + education_unknown + default_no + default_yes + housing_no + housing_yes + loan_no + loan_yes + contact_cellular + contact_telephone + contact_unknown + month_apr + month_aug + month_dec + month_feb + month_jan + month_jul + month_jun + month_mar + month_may + month_nov + month_oct + month_sep + poutcome_failure + poutcome_other + poutcome_success + poutcome_unknown + intercept", data=data)
result = model.fit()
# Output the results
print(resutl.summary)

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

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

Еще раз спасибо, что дошли до конца этой статьи. Если вам понравилось, пожалуйста, хлопните меня в ладоши или прокомментируйте ниже, чтобы я продолжал поднимать новые темы о науке о данных. И если у вас есть какие-либо личные вопросы, вы можете написать мне в директ на LinkedIn или Twitter. Я с большим удовольствием поделюсь с вами своими мыслями. Спасибо и до встречи в следующих статьях.