Python 逻辑回归产生错误的系数

Posted

技术标签:

【中文标题】Python 逻辑回归产生错误的系数【英文标题】:Python Logistic Regression Produces Wrong Coefficients 【发布时间】:2019-02-22 01:19:39 【问题描述】:

我正在尝试使用 scikit-learn 的 LogisticRegression 模型来解决 Andrew Ng 在 Coursera 上的机器学习课程中的练习 2。但是我得到的结果是错误的:

1) 结果系数与答案不匹配:

我从模型中得到什么

根据答案我应该得到什么

[-25.16, 0.21, 0.20]

您可以在图上看到(错误的图表),直觉上决策边界似乎比决策边界略低。

2) 图表结果似乎错误

如您所见,决策边界在下方

逻辑回归

回答

我的密码:

% matplotlib notebook



# IMPORT DATA

ex2_folder = 'machine-learning-ex2/ex2'
input_1 = pd.read_csv(folder + ex2_folder +'/ex2data1.txt', header = None)
X = input_1[[0,1]]
y = input_1[2]


# IMPORT AND FIT MODEL

from sklearn.linear_model  import LogisticRegression
model = LogisticRegression(fit_intercept = True)
model.fit(X,y)
print('Intercept (Theta 0: ). Coefficients: '.format(model.intercept_, model.coef_))



# CALCULATE GRID
n = 5

xx1, xx2 = np.mgrid[25:101:n, 25:101:n]
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_proba(grid)[:, 1]
probs = probs.reshape(xx1.shape)


# PLOTTING

f = plt.figure()
ax = plt.gca()


for outcome in [0,1]:
    xo = 'yo' if  outcome == 0 else 'k+'
    selection = y == outcome
    plt.plot(X.loc[selection, 0],X.loc[selection,1],xo, mec = 'k')
plt.xlim([25,100])
plt.ylim([25,100])

plt.xlabel('Exam 1 Score')
plt.ylabel('Exam 2 Score')
plt.title('Exam 1 & 2 and admission outcome')

contour = ax.contourf(xx1,xx2, probs, 100, 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])

plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='b', alpha = 0.3);

plt.plot(xx1[probs > 0.5], xx2[probs > 0.5],'.b', alpha = 0.3)

链接

DataFile in txt

PDF Tasks and Solutions in Octave

【问题讨论】:

C 参数添加一个非常高的值将使您更接近:model = LogisticRegression(C=1e10) 【参考方案1】:

要获得相同的结果,您需要创建相同的测试条件。

一目了然的一个明显区别是迭代次数。 Sklearn LogisticRegression 分类器默认迭代次数为 100,而 Andrew NG 的示例代码运行 400 次迭代。这肯定会给你与 Nguyen 课程不同的结果。

我不确定 Nguyen 使用哪个成本函数进行练习,但我很确定它是交叉熵,而不是 scikit learnLogisticRecression 分类器的默认函数 L2。

最后一点,在实现更高级别的解决方案(scikitlearn/tensorflow/keras)之前,您应该首先尝试在纯 python 中实现它们以了解它们是如何工作的。尝试制作更高级别的包来为您工作会更容易(也更有趣)。

【讨论】:

感谢您的回复。但是,即使 LogisticRegression 模型与 Andrew 模型不同,结果也应该是正确的吧?但正如我们在图表上看到的 - 无论如何它都在下面。换句话说,如果我们把这条线移到上面 0.5 厘米,它将覆盖更多的点,并且根本不会覆盖任何十字架。因此,对于该结果,任何成本函数都会更小 回归逐步接近真实值。输出值取决于计算size of the step to move towards the true value(成本)的成本函数、步数(迭代)等。因此,使用不同的数字,您可以得出不同的值(过拟合/欠拟合),或者陷入不正确的true value(本地最小值)。因此回答:这取决于数据和参数。 您也可以尝试从另一边解决问题。尝试在 octave 代码上实现 L2 正则化(平方和)而不是交叉熵并观察结果。

以上是关于Python 逻辑回归产生错误的系数的主要内容,如果未能解决你的问题,请参考以下文章

在python中查找逻辑回归的系数

从逻辑回归系数在python中编写函数

使用插入符号的岭逻辑回归系数的标准误差

python:如何在sklearn中使用逻辑回归系数构建决策边界

sklearn Python 和逻辑回归

机器学习系列7 基于Python的Scikit-learn库构建逻辑回归模型