我正在尝试使用sklearn的鸢尾花数据集来拟合一个逻辑回归模型。我得到的概率曲线看起来过于平坦,也就是说系数太小。我期望在萼片长度大于7时,概率超过百分之九十:
这个概率曲线确实是错误的吗?如果是的话,我的代码中可能是什么原因导致的?
from sklearn import datasetsimport matplotlib.pyplot as pltimport numpy as npimport mathfrom sklearn.linear_model import LogisticRegressiondata = datasets.load_iris()#get relevent datalengths = data.data[:100, :1]is_setosa = data.target[:100] #fit modellgs = LogisticRegression()lgs.fit(lengths, is_setosa)m = lgs.coef_[0,0]b = lgs.intercept_[0]#generate values for curve overlaylgs_curve = lambda x: 1/(1 + math.e**(-(m*x+b))) x_values = np.linspace(2, 10, 100)y_values = lgs_curve(x_values)#plot itplt.plot(x_values, y_values)plt.scatter(lengths, is_setosa, c='r', s=2)plt.xlabel("Sepal Length")plt.ylabel("Probability is Setosa")
回答:
如果你参考http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression,你会发现有一个正则化参数C
,可以在训练逻辑回归模型时作为参数传递。
C : float, default: 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()