sklearn LogisticRegression - 图表显示的系数太小

时间:2017-03-08 17:00:16

标签: python matplotlib machine-learning scikit-learn logistic-regression

我试图将逻辑回归模型拟合到sklearn的虹膜数据集。我得到一个看起来太平坦的概率曲线,也就是系数太小。我预计通过萼片长度概率超过百分之九十> 7:

enter image description here

这种概率曲线确实是错误的吗?如果是这样,我的代码中可能会导致什么?

$('#tab5').bind('click', function() {
    $('#container_div svg').width('100%');
});

3 个答案:

答案 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,从110):

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

值的模型预测probs

enter image description here

答案 1 :(得分:0)

虽然您没有描述想要绘制的内容,但我假设您要绘制分隔线。看来你对Logistic / sigmoid函数感到困惑。 Logistic回归的决策函数是一条线。

答案 2 :(得分:0)

你的概率图看起来很平坦,因为从某种意义上说,你已经“放大”了太多。

如果你看一个sigmoid函数的中间,它几乎是线性的,因为二阶导数得到几乎为0(参见例如wolfram alpha graph

请注意,我们所讨论的价值是-(m*x+b)

的结果

当我们减少图表的限制时,请使用 x_values = np.linspace(4, 7, 100),我们得到一些看起来像一条线的东西: enter image description here

但另一方面,如果我们对限制发疯,比如使用x_values = np.linspace(-10, 20, 100),我们会得到更清晰的sigmoid: enter image description here