我试图将逻辑回归模型拟合到sklearn的虹膜数据集。我得到一个看起来太平坦的概率曲线,也就是系数太小。我预计通过萼片长度概率超过百分之九十> 7:
这种概率曲线确实是错误的吗?如果是这样,我的代码中可能会导致什么?
$('#tab5').bind('click', function() {
$('#container_div svg').width('100%');
});
答案 0 :(得分:1)
如果你引用http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression,你会发现一个正则化参数C
,它可以在训练逻辑回归模型时作为参数传递。
C:float,默认值:1.0正则化强度的反转;必须是一个 积极浮动。就像支持向量机一样,值越小 指定更强的正则化。
现在,如果您尝试使用此 正则化 参数的不同值,您会发现较大的C
值导致拟合曲线具有更清晰的过渡输出(响应)二进制变量的0到1值,更大的值适合具有高方差的模型(尝试更紧密地模拟训练数据转换,我认为这是你期望的,那么你可以尝试设置C
值高达10
并绘制)但同时可能存在 过度匹配 的风险,而默认值价值C=1
和小于此值的价值会导致高偏差并可能 不适合 而且这里出现着名的 偏差 - 方差交易 - 在机器学习中关闭 。
您始终可以使用交叉验证等技术来选择适合您的C
值。下面的代码/图显示了拟合了不同复杂度模型的概率曲线(即,具有不同的正则化参数值C
,从1
到10
):
x_values = np.linspace(2, 10, 100)
x_test = np.reshape(x_values, (100,1))
C = list(range(1, 11))
labels = map(str, C)
for i in range(len(C)):
lgs = LogisticRegression(C = C[i]) # pass a value for the regularization parameter C
lgs.fit(lengths, is_setosa)
y_values = lgs.predict_proba(x_test)[:,1] # use this function to compute probability directly
plt.plot(x_values, y_values, label=labels[i])
plt.scatter(lengths, is_setosa, c='r', s=2)
plt.xlabel("Sepal Length")
plt.ylabel("Probability is Setosa")
plt.legend()
plt.show()
C
答案 1 :(得分:0)
虽然您没有描述想要绘制的内容,但我假设您要绘制分隔线。看来你对Logistic / sigmoid函数感到困惑。 Logistic回归的决策函数是一条线。
答案 2 :(得分:0)
你的概率图看起来很平坦,因为从某种意义上说,你已经“放大”了太多。
如果你看一个sigmoid函数的中间,它几乎是线性的,因为二阶导数得到几乎为0(参见例如wolfram alpha graph)
请注意,我们所讨论的价值是-(m*x+b)
当我们减少图表的限制时,请使用
x_values = np.linspace(4, 7, 100)
,我们得到一些看起来像一条线的东西:
但另一方面,如果我们对限制发疯,比如使用x_values = np.linspace(-10, 20, 100)
,我们会得到更清晰的sigmoid: