Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn LogisticRetression-绘图显示的系数太小_Python_Matplotlib_Machine Learning_Scikit Learn_Logistic Regression - Fatal编程技术网

Python sklearn LogisticRetression-绘图显示的系数太小

Python sklearn LogisticRetression-绘图显示的系数太小,python,matplotlib,machine-learning,scikit-learn,logistic-regression,Python,Matplotlib,Machine Learning,Scikit Learn,Logistic Regression,我正在尝试将逻辑回归模型拟合到sklearn的iris数据集。我得到的概率曲线看起来太平了,也就是系数太小了。如果萼片长度>7,我预计概率超过90%: 这个概率曲线真的错了吗?如果是这样,我的代码中会有什么原因 from sklearn import datasets import matplotlib.pyplot as plt import numpy as np import math from sklearn.linear_model import LogisticRegressio

我正在尝试将逻辑回归模型拟合到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")

虽然您没有描述要绘制的内容,但我假设您要绘制分隔线。您似乎对逻辑/乙状结肠功能感到困惑。Logistic回归的决策函数是一条直线

你的概率图看起来平坦,因为在某种意义上,你“放大”太多了

如果你看一个sigmoid函数的中间,它几乎是线性的,因为二阶导数几乎是0(参见示例a)

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

当我们减少图形的限制时,比如使用
x_values=np.linspace(4,7,100)
,我们得到的东西看起来像一行:

但另一方面,如果我们对极限疯狂,比如通过使用
x_值=np.linspace(-10,20,100)
,我们得到了更清晰的S形图:

如果您参考,您将找到一个正则化参数
C
,它可以在训练逻辑回归模型时作为参数传递

C:浮点,默认值:1.0正则化强度的倒数;一定是个 正浮动。与支持向量机一样,较小的值 指定更强的正则化

现在,如果您尝试此正则化参数的不同值,您会发现
C
的值越大,拟合曲线的输出(响应)二元变量的值从0到1的变化越快,而更大的值拟合方差高的模型(尝试更紧密地模拟训练数据转换,我认为这是您所期望的,然后您可以尝试将
C
值设置为高达
10
并绘制)但是,同时也可能存在过度拟合的风险,而默认值
C=1
和小于该值的值会导致高偏差,并且可能欠拟合,这就是机器学习中著名的偏差-方差权衡

您始终可以使用交叉验证等技术来选择适合您的
C
值。以下代码/图显示了使用不同复杂度模型拟合的概率曲线(即,正则化参数
C
的不同值,从
1
10
):

使用不同
C

这条曲线怎么了?我觉得很好。请坚持并具体说明你得到了什么,以及它在多大程度上不符合你的期望。谢谢提醒。我刚刚编辑了它,试图让它更清楚。我正在根据萼片长度绘制虹膜为Setosa型的概率。这种概率来自于将模型拟合到数据点(红色)。概率函数是一个S形函数。我明白你关于调整x轴限制的说法。但是,在萼片长度>7时,我的概率仍然低于80%,这似乎不对吗?这让我很困惑。这很有帮助,谢谢!如果我不想正则化,我可以将C设置为什么?(我意识到这将增加降低的测试精度,但这对我来说更像是一个理论练习)对于一个高值,可能是你可以尝试10、100、1000等(理想情况下是无穷大),但像100或1000这样的值应该可以达到我认为的目的。
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()