Matplotlib logistic回归决策边界的绘制

Matplotlib logistic回归决策边界的绘制,matplotlib,scikit-learn,logistic-regression,Matplotlib,Scikit Learn,Logistic Regression,我正在实施逻辑回归。我设法从中获得了概率,并且能够预测2类分类任务 我的问题是: 对于我的最终模型,我有权重和训练数据。有两个特征,所以我的权重是一个有两行的向量 我该怎么画呢?我明白了,但我不太明白答案。我需要等高线图吗 logistic回归分类器的一个优点是,一旦拟合,就可以得到任何样本向量的概率。这可能是更有趣的情节。下面是一个使用scikit学习的示例: import numpy as np from sklearn.linear_model import LogisticRegress

我正在实施逻辑回归。我设法从中获得了概率,并且能够预测2类分类任务

我的问题是:

对于我的最终模型,我有权重和训练数据。有两个特征,所以我的权重是一个有两行的向量


我该怎么画呢?我明白了,但我不太明白答案。我需要等高线图吗

logistic回归分类器的一个优点是,一旦拟合,就可以得到任何样本向量的概率。这可能是更有趣的情节。下面是一个使用scikit学习的示例:

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="white")
首先,生成数据并使分类器适合训练集:

X, y = make_classification(200, 2, 2, 0, weights=[.5, .5], random_state=15)
clf = LogisticRegression().fit(X[:100], y[:100])
接下来,制作一个连续的数值网格,并评估网格中每个(x,y)点的概率:

xx, yy = np.mgrid[-5:5:.01, -5:5:.01]
grid = np.c_[xx.ravel(), yy.ravel()]
probs = clf.predict_proba(grid)[:, 1].reshape(xx.shape)
现在,将概率网格绘制为等高线图,并在其顶部额外显示测试集样本:

f, ax = plt.subplots(figsize=(8, 6))
contour = ax.contourf(xx, yy, probs, 25, cmap="RdBu",
                      vmin=0, vmax=1)
ax_c = f.colorbar(contour)
ax_c.set_label("$P(y = 1)$")
ax_c.set_ticks([0, .25, .5, .75, 1])

ax.scatter(X[100:,0], X[100:, 1], c=y[100:], s=50,
           cmap="RdBu", vmin=-.2, vmax=1.2,
           edgecolor="white", linewidth=1)

ax.set(aspect="equal",
       xlim=(-5, 5), ylim=(-5, 5),
       xlabel="$X_1$", ylabel="$X_2$")

逻辑回归允许您根据您想要的任何阈值对新样本进行分类,因此它本身没有一个“决策边界”。但是,当然,常用的决策规则是p=.5。我们也可以使用上述代码绘制等高线标高:

f, ax = plt.subplots(figsize=(8, 6))
ax.contour(xx, yy, probs, levels=[.5], cmap="Greys", vmin=0, vmax=.6)

ax.scatter(X[100:,0], X[100:, 1], c=y[100:], s=50,
           cmap="RdBu", vmin=-.2, vmax=1.2,
           edgecolor="white", linewidth=1)

ax.set(aspect="equal",
       xlim=(-5, 5), ylim=(-5, 5),
       xlabel="$X_1$", ylabel="$X_2$")

接受的答案很好,但它也很有用,特别是在试图理解权重的含义时,将权重转换为斜率/截距形式,并仅绘制决策边界

logit的形式是
wx+b
,但在二进制分类的情况下
x
w
是二维的。其中一个
x
值实际上代表了绘图上的
y
。这意味着直线的方程式如下所示:

w[1] * y = w[0] * x + b 
# to solve for y
y = (w[0] * x)/w[1] + b / w[1]
绘制其中
x\u np
是您的数据,而
w
+
b
是您的学习参数的曲线图,简单如下:

plt.scatter(x_np[:,0], x_np[:,1], c=y_np.reshape(-1),cmap=mpl.colors.ListedColormap(colors))
ax = plt.gca()
ax.autoscale(False)
x_vals = np.array(ax.get_xlim())
y_vals = -(x_vals * w_guess[0] + b_guess[0])/w_guess[1]
plt.plot(x_vals, y_vals, '--', c="red")

应该是:

w[1] * y = **-**(w[0] * x + b)  
正如您在代码中所做的:

y_vals = -(x_vals * w_guess[0] + b_guess[0])/w_guess[1]

你导入了
seaborn
,但实际上没有在你的答案中使用它,这对吗?我不熟悉这个库,只是检查它是否有必要回答。@Zhubarb:Seaborn会在您导入matplotlib时立即覆盖它的许多默认配置。因此,如果您不需要seaborn直接提供的任何功能,而只是希望matplotlib看起来比默认情况下要好得多,那么您所要做的就是导入seaborn并使用它开展业务matplotlib@Gus我在
probs=clf.predict_probs(grid)[:,1]处得到一个错误。重塑(xx.shape)
AttributeError:'LogisticRegression'对象没有属性“predict\u probs”
我遗漏了什么吗?如果这对任何人都有帮助,请查看下面的sklearn示例:你从哪里得到
y\u vals=-(x\u vals*w\u guess[0]+b\u guess[0])/w\u guess[1]
?我不明白这是怎么从原始方程中得到的。。你从哪里得到的?@YuChen这就是你求解
y
时得到的结果,其中
h(x,y)=0.5
。这里,
h(x,y)
是逻辑回归的概率函数,这意味着
h(x,y)=1/(1+exp(-(w1*x+w2*y+b))
。因此,当这个决策函数等于
0.5
时,这本质上意味着这个实例,
(x,y)
,有50%的几率在类
0
1
中。
y_vals = -(x_vals * w_guess[0] + b_guess[0])/w_guess[1]