在机器学习中,逻辑回归是一种广泛使用的二分类算法。然而,当面对多类分类问题时,需要对逻辑回归进行扩展。一对多(One-vs-Rest,OvR)是一种常见的策略,它将多类分类问题转化为多个二分类问题。每个分类器将一个类别与所有其他类别区分开来。本文将介绍如何使用Python中的逻辑回归模型实现一对多分类,并展示其分类效果。
首先,需要生成一个包含三个类别的数据集。这可以通过使用scikit-learn库中的make_blobs
函数来实现。然后,将使用逻辑回归模型对数据进行训练,并使用一对多分类器来处理多类分类问题。
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
import matplotlib.pyplot as plt
import numpy as np
# 生成数据集
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)
接下来,将使用逻辑回归模型对数据进行训练。对于一对多分类,将使用OneVsRestClassifier
包装器来包装逻辑回归模型。将分别展示使用多项式(multinomial)和一对多(ovr)两种策略的训练效果。
for multi_class in ("multinomial", "ovr"):
clf = LogisticRegression(solver="sag", max_iter=100, random_state=42)
if multi_class == "ovr":
clf = OneVsRestClassifier(clf)
clf.fit(X, y)
print("训练得分: %.3f (%s)" % (clf.score(X, y), multi_class))
通过上述代码,可以看到使用多项式策略和一对多策略的训练得分。接下来,将使用matplotlib库来可视化分类效果。将绘制决策边界,并展示训练数据点。
_, ax = plt.subplots()
DecisionBoundaryDisplay.from_estimator(clf, X, response_method="predict", cmap=plt.cm.Paired, ax=ax)
plt.title("逻辑回归决策边界 (%s)" % multi_class)
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, edgecolor="black", s=20)
# 绘制一对多分类器的决策边界
xmin, xmax = plt.xlim()
ymin, ymax = plt.ylim()
if multi_class == "ovr":
coef = np.concatenate([est.coef_ for est in clf.estimators_])
intercept = np.concatenate([est.intercept_ for est in clf.estimators_])
else:
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.show()
通过上述代码,可以清晰地看到逻辑回归模型在一对多分类任务中的决策边界。每个类别的决策边界由虚线表示,而训练数据点则用不同的颜色表示。这种可视化方式有助于直观地理解模型的分类效果。