如何在 scikit learn 中绘制逻辑回归的决策边界

Posted

技术标签:

【中文标题】如何在 scikit learn 中绘制逻辑回归的决策边界【英文标题】:How to plot the decision boundary of logistic regression in scikit learn 【发布时间】:2017-04-24 08:53:48 【问题描述】:

我正在尝试在 scikit learn 中绘制逻辑回归的决策边界

features_train_df :  650 columns, 5250 rows
features_test_df : 650 columns, 1750 rows
class_train_df = 1 column (class to be predicted), 5250 rows
class_test_df = 1 column (class to be predicted), 1750 rows

分类代码;

tuned_logreg = LogisticRegression(penalty =  'l2', tol =  0.0001,C =  0.1,max_iter =  100,class_weight = "balanced")
tuned_logreg.fit(x_train[sorted_important_features_list[0:650]].values, y_train['loss'].values)
y_pred_3 = tuned_logreg.predict(x_test[sorted_important_features_list[0:650]].values)

我得到了分类器代码的正确输出。

在线获取此代码:

code:

X = features_train_df.values
# evenly sampled points
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 50),
                 np.linspace(y_min, y_max, 50))
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())

#plot background colors
ax = plt.gca()
Z = tuned_logreg.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
Z = Z.reshape(xx.shape)
cs = ax.contourf(xx, yy, Z, cmap='RdBu', alpha=.5)
cs2 = ax.contour(xx, yy, Z, cmap='RdBu', alpha=.5)
plt.clabel(cs2, fmt = '%2.1f', colors = 'k', fontsize=14)

# Plot the points
ax.plot(Xtrain[ytrain == 0, 0], Xtrain[ytrain == 0, 1], 'ro', label='Class 1')
ax.plot(Xtrain[ytrain == 1, 0], Xtrain[ytrain == 1, 1], 'bo', label='Class 2')

# make legend
plt.legend(loc='upper left', scatterpoints=1, numpoints=1)

错误:

 ValueError: X has 2 features per sample; expecting 650

请建议我哪里出错了

【问题讨论】:

您的逻辑回归分类器代码在哪里?我想问题出在分类器的预测方法上。 @WasiAhmad 我已经添加了分类器代码,但我没有收到任何错误。 你能解释一下你想用这个语句做什么 - ax.plot(Xtrain[ytrain == 0, 0], Xtrain[ytrain == 0, 1], 'ro', label='Class 1') @WasiAhmad 我不确定,从 scikit 获取代码 - 学习和 ***.com/questions/28256058/… 我理解你的代码错误,很抱歉。你能告诉我你在哪一行出错吗?或者你能提供你的完整代码以便我调试。 【参考方案1】:

另外,您可以使用学习模型的内部价值:

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt

X, y = make_classification(200, 2, 2, 0, weights=[.5, .5], random_state=15)
clf = LogisticRegression().fit(X, y)
points_x=[x/10. for x in range(-50,+50)]

line_bias = clf.intercept_
line_w = clf.coef_.T
points_y=[(line_w[0]*x+line_bias)/(-1*line_w[1]) for x in points_x]
plt.plot(points_x, points_y)

plt.scatter(X[:,0], X[:,1],c=y)

plt.show()

plot result

【讨论】:

【参考方案2】:

我在您的代码中遇到了问题。请仔细看下面的讨论。

xx, yy = np.meshgrid(np.linspace(x_min, x_max, 50), np.linspace(y_min, y_max, 50))
grid = np.c_[xx.ravel(), yy.ravel()]
Z = tuned_logreg.predict_proba(grid)[:, 1]

在这里考虑变量的形状:

np.linspace(x_min, x_max, 50) 返回一个包含 50 个值的列表。然后应用np.meshgrid 生成xxyy (50, 50) 的形状。最后应用np.c_[xx.ravel(), yy.ravel()] 形成可变网格 (2500, 2) 的形状。您将 2500 个具有 2 个特征值的实例提供给 predict_proba 函数。

这就是您收到错误消息的原因:ValueError: X has 2 features per sample; expecting 650您必须传递一个包含 650 个列(特征)值的结构。

predict 期间,您做对了。

y_pred_3 = tuned_logreg.predict(x_test[sorted_important_features_list[0:650]].values)

因此,请确保传递给fit()predict()predict_proba() 方法的实例中的特征数量相同。

您提供的SO post中的示例说明:

X, y = make_classification(200, 2, 2, 0, weights=[.5, .5], random_state=15)
clf = LogisticRegression().fit(X[:100], y[:100])

这里 X 的形状是(200, 2),但是在训练分类器时,他们使用的是X[:100],这意味着只有 100 个特征和 2 个类别。对于预测,他们使用:

xx, yy = np.mgrid[-5:5:.01, -5:5:.01]
grid = np.c_[xx.ravel(), yy.ravel()]

这里,xx 的形状是 (1000, 1000),网格是 (1000000, 2)。因此,用于训练和测试的特征数量为 2。

【讨论】:

以上是关于如何在 scikit learn 中绘制逻辑回归的决策边界的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scikit-learn 中实现多项式逻辑回归?

如何在 scikit-learn 中使用随机逻辑回归找到最低的正则化参数 (C)?

如何在 scikit learn 中为多元回归绘制最佳拟合平面?

python - 如何在python scikit-learn中找到逻辑回归中的正则化参数?

使用 matplotlib 绘制 scikit learn 线性回归结果

如何使用 scikit-learn 执行非正则化逻辑回归?