Введение
Логистическая регрессия - это алгоритм классификации, который можно использовать для задач бинарной и многоклассовой классификации. В этом практическом занятии мы будем использовать библиотеку scikit-learn для построения поверхности решения двух моделей логистической регрессии, а именно многономиальной логистической регрессии и логистической регрессии "один против остальных". Мы будем использовать датасет с тремя классами и построить границу решения двух моделей для сравнения их производительности.
Советы по использованию ВМ
После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импорт библиотек
Начнем с импорта необходимых библиотек для этого практического занятия. Мы будем использовать библиотеку scikit-learn для генерации датасета и обучения моделей логистической регрессии, а библиотеку matplotlib для построения границы решения.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
from sklearn.inspection import DecisionBoundaryDisplay
Генерация датасета
Мы будем генерировать датасет с тремя классами с использованием функции make_blobs из scikit-learn. Будем использовать 1000 образцов и установить центры кластеров в точках [-5, 0], [0, 1.5], [5, -1]. Затем мы трансформируем датасет с использованием матрицы преобразования, чтобы сделать датасет более сложным для классификации.
centers = [[-5, 0], [0, 1.5], [5, -1]]
X, y = make_blobs(n_samples=1000, centers=centers, random_state=40)
transformation = [[0.4, 0.2], [-0.4, 1.2]]
X = np.dot(X, transformation)
Обучение модели многонаправленной логистической регрессии
Теперь мы обучим модель многонаправленной логистической регрессии с использованием функции LogisticRegression из scikit-learn. Мы установим решатель в "sag", максимальное количество итераций в 100, случайное состояние в 42 и параметр многоклассовой классификации в "multinomial". Затем мы выведем оценку обучения модели.
clf = LogisticRegression(
solver="sag", max_iter=100, random_state=42, multi_class="multinomial"
).fit(X, y)
print("training score : %.3f (%s)" % (clf.score(X, y), "multinomial"))
Построение границы решения модели многонаправленной логистической регрессии
Теперь мы построим поверхность решения модели многонаправленной логистической регрессии с использованием функции DecisionBoundaryDisplay из scikit-learn. Мы установим метод ответа в "predict", палитру цветов в "plt.cm.Paired" и также построим точки обучения.
_, ax = plt.subplots()
DecisionBoundaryDisplay.from_estimator(
clf, X, response_method="predict", cmap=plt.cm.Paired, ax=ax
)
plt.title("Decision surface of LogisticRegression (multinomial)")
plt.axis("tight")
colors = "bry"
for i, color in zip(clf.classes_, colors):
idx = np.where(y == i)
plt.scatter(
X[idx, 0], X[idx, 1], c=color, cmap=plt.cm.Paired, edgecolor="black", s=20
)
Обучение модели логистической регрессии "один против всех"
Теперь мы обучим модель логистической регрессии "один против всех" с теми же параметрами, что и в шаге 3, но с параметром многоклассовой классификации, установленным в "ovr". Затем мы выведем оценку обучения модели.
clf = LogisticRegression(
solver="sag", max_iter=100, random_state=42, multi_class="ovr"
).fit(X, y)
print("training score : %.3f (%s)" % (clf.score(X, y), "ovr"))
Построение границы решения модели логистической регрессии "один против всех"
Теперь мы построим поверхность решения модели логистической регрессии "один против всех" с теми же параметрами, что и в шаге 4, но построим гиперплоскости, соответствующие трем классификаторам "один против всех", в виде пунктирных линий.
_, ax = plt.subplots()
DecisionBoundaryDisplay.from_estimator(
clf, X, response_method="predict", cmap=plt.cm.Paired, ax=ax
)
plt.title("Decision surface of LogisticRegression (ovr)")
plt.axis("tight")
colors = "bry"
for i, color in zip(clf.classes_, colors):
idx = np.where(y == i)
plt.scatter(
X[idx, 0], X[idx, 1], c=color, cmap=plt.cm.Paired, edgecolor="black", s=20
)
xmin, xmax = plt.xlim()
ymin, ymax = plt.ylim()
coef = clf.coef_
intercept = clf.intercept_
def plot_hyperplane(c, color):
def line(x0):
return (-(x0 * coef[c, 0]) - intercept[c]) / coef[c, 1]
plt.plot([xmin, xmax], [line(xmin), line(xmax)], ls="--", color=color)
for i, color in zip(clf.classes_, colors):
plot_hyperplane(i, color)
Визуализация графиков
Теперь мы визуализируем оба графика рядом, чтобы сравнить границы решения двух моделей.
plt.subplot(1,2,1)
_, ax = plt.subplots()
DecisionBoundaryDisplay.from_estimator(
clf, X, response_method="predict", cmap=plt.cm.Paired, ax=ax
)
plt.title("Multinomial Logistic Regression")
plt.axis("tight")
colors = "bry"
for i, color in zip(clf.classes_, colors):
idx = np.where(y == i)
plt.scatter(
X[idx, 0], X[idx, 1], c=color, cmap=plt.cm.Paired, edgecolor="black", s=20
)
plt.subplot(1,2,2)
_, ax = plt.subplots()
DecisionBoundaryDisplay.from_estimator(
clf, X, response_method="predict", cmap=plt.cm.Paired, ax=ax
)
plt.title("One-vs-Rest Logistic Regression")
plt.axis("tight")
colors = "bry"
for i, color in zip(clf.classes_, colors):
idx = np.where(y == i)
plt.scatter(
X[idx, 0], X[idx, 1], c=color, cmap=plt.cm.Paired, edgecolor="black", s=20
)
xmin, xmax = plt.xlim()
ymin, ymax = plt.ylim()
coef = clf.coef_
intercept = clf.intercept_
def plot_hyperplane(c, color):
def line(x0):
return (-(x0 * coef[c, 0]) - intercept[c]) / coef[c, 1]
plt.plot([xmin, xmax], [line(xmin), line(xmax)], ls="--", color=color)
for i, color in zip(clf.classes_, colors):
plot_hyperplane(i, color)
plt.subplots_adjust(wspace=0.5)
plt.show()
Резюме
В этом практическом занятии мы узнали, как построить поверхность решения двух моделей логистической регрессии, а именно многонаправленной логистической регрессии и логистической регрессии "один против всех". Мы использовали датасет с тремя классами и сравнили производительность двух моделей, построив их границы решения. Мы заметили, что модель многонаправленной логистической регрессии имеет более гладкую границу решения, в то время как модель логистической регрессии "один против всех" имеет три отдельные границы решения для каждого класса.