我正在尝试使用scikit-learn的LogisticRegression模型来解决Coursera上的Andrew Ng的机器学习课程中的练习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)
链接
答案 0 :(得分:3)
要获得相同的结果,您需要创建相同的测试条件。
一个明显的区别是迭代次数。 Sklearn LogisticRegression
分类器的默认迭代计数为100,而Andrew NG的示例代码可运行400次迭代。当然,那将给您与Nguyen的课程不同的结果。
我现在不确定Nguyen在练习中使用的是哪个成本函数,但是我很确定它是交叉熵,而不是LogisticRecression
分类器中scikit learn
分类器的默认函数L2。
最后一点,在实现更高级别的解决方案(scikitlearn / tensorflow / keras)之前,您应该首先尝试以纯python实现它们,以了解它们的工作原理。尝试并制作更高级的软件包为您工作将更加容易(并且更加有趣)。