【问题标题】:plotting decision boundary of logistic regression绘制逻辑回归的决策边界
【发布时间】:2015-03-31 02:51:44
【问题描述】:

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

我的问题是:

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

我如何绘制这个?我看到this post,但我不太明白答案。我需要等高线图吗?

【问题讨论】:

    标签: matplotlib scikit-learn logistic-regression


    【解决方案1】:

    逻辑回归分类器的一个优点是,一旦拟合它,您就可以获得任何样本向量的概率。这可能更有趣。这是一个使用 scikit-learn 的示例:

    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$")
    

    【讨论】:

    • 您是否已导入 seaborn 但实际上并没有在您的答案中使用它?我对那个库不熟悉,只是检查是否需要答案。
    • @Zhubarb:Seaborn 会在您导入 matplotlib 后立即覆盖许多默认配置。因此,如果您不需要 seaborn 直接提供的任何功能,而只是希望 matplotlib 看起来比默认情况下更好,那么您所要做的就是导入 seaborn 并使用 matplotlib 开展业务
    • @Gus 我在probs = clf.predict_probs(grid)[:, 1].reshape(xx.shape) 收到一个错误,说AttributeError: 'LogisticRegression' object has no attribute 'predict_probs' 我错过了什么吗?
    • 如果这对任何人都有帮助,请在此处查看 sklearn 示例:scikit-learn.org/stable/auto_examples/neighbors/…
    【解决方案2】:

    已接受的答案对此很好,但它也很有用,尤其是在尝试理解权重的含义、将权重转换为斜率/截距形式并仅绘制决策边界时。

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

    w[1] * y = w[0] * x + b 
    # to solve for y
    y = (w[0] * x)/w[1] + b / w[1]
    

    绘制x_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")
    

    【讨论】:

    • 你从哪里得到y_vals = -(x_vals * w_guess[0] + b_guess[0])/w_guess[1]?我没有看到它是如何从原始方程来求解 y
    • 是的..你从哪里得到的?
    • @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% 的机会在课堂 01
    【解决方案3】:
    w[1] * y = w[0] * x + b  
    

    应该是:

    w[1] * y = **-**(w[0] * x + b)  
    

    正如你在代码中所做的那样:

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

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 2020-08-31
      • 2017-07-30
      • 2020-03-28
      • 2017-04-24
      • 2020-05-05
      • 2023-01-04
      • 2020-10-27
      相关资源
      最近更新 更多