python - sklearn LogisticRegression - 绘图显示系数太小

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

我正在尝试将逻辑回归模型拟合到 sklearn 的 iris 数据集。我得到的概率曲线看起来太平坦,也就是系数太小。我预计萼片长度 > 7 的概率超过 90%:

enter image description here

这条概率曲线真的是错误的吗?如果是这样,什么可能会导致我的代码出现这种情况?

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 的不同值,从 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 值拟合的模型预测的概率

enter image description here

关于python - sklearn LogisticRegression - 绘图显示系数太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677382/

相关文章:

python - 输入数据不能是列表 XGBoost

Python Quantlib 将 Quantlib 日期转换为日期时间

python - 如何在 SQL 数据库中存储 python float

image-processing - 核心外重采样

python - Pandas 散点图组颜色错误

python - 将椭圆拟合到python中的一组数据点

python - 使用 write 函数编写格式良好的列表

python - 将特定模式的字符串拆分为三部分

python-3.x - 绘制均匀连续分布的 CDF

scala - Spark ML : Data de-normalization