我正在尝试将逻辑回归模型拟合到 sklearn 的 iris 数据集。我得到的概率曲线看起来太平坦,也就是系数太小。我预计萼片长度 > 7 的概率超过 90%:
这条概率曲线真的是错误的吗?如果是这样,什么可能会导致我的代码出现这种情况?
from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np
import math
from sklearn.linear_model import LogisticRegression
data = datasets.load_iris()
#get relevent data
lengths = data.data[:100, :1]
is_setosa = data.target[:100]
#fit model
lgs = LogisticRegression()
lgs.fit(lengths, is_setosa)
m = lgs.coef_[0,0]
b = lgs.intercept_[0]
#generate values for curve overlay
lgs_curve = lambda x: 1/(1 + math.e**(-(m*x+b)))
x_values = np.linspace(2, 10, 100)
y_values = lgs_curve(x_values)
#plot it
plt.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 Inverse of regularization strength; must be a positive float. Like in support vector machines, smaller values specify stronger regularization.
现在,如果您尝试此正则化参数的不同值,您会发现 C
的值较大。导致拟合曲线从输出(响应)二元变量的 0 值到 1 值有更急剧的过渡,并且更大的值适合具有高方差的模型(尝试更紧密地模拟训练数据过渡,我认为这就是您所期望的,那么您可以尝试将 C
值设置为高达 10
并绘制),但同时可能存在过度拟合的风险,而默认值C=1
小于该值的值会导致高偏差,并且可能欠拟合,这就是著名的偏差与方差权衡机器学习。
您始终可以使用交叉验证等技术来选择 C
适合您的值(value)。下面的代码/图显示了不同复杂度模型(即正则化参数 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
值拟合的模型预测的概率
关于python - sklearn LogisticRegression - 绘图显示系数太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677382/