【问题标题】:how scikit learn figure out logistic regression for classification or regressionscikit 如何学习逻辑回归以进行分类或回归
【发布时间】:2017-01-01 09:17:36
【问题描述】:

我认为逻辑回归可以用于回归(获取 0 和 1 之间的数字,例如使用逻辑回归来预测 0 和 1 之间的概率)和分类。问题是,似乎在我们提供了训练数据和目标之后,逻辑回归可以自动判断我们是在做回归还是在做分类?

例如,在下面的示例代码中,逻辑回归发现我们只需要输出为0, 1, 2 的三个类别之一,而不是02 之间的任何数字?只是好奇逻辑回归如何自动判断它是在做回归(输出是连续范围)还是分类(输出是离散)问题?

http://scikit-learn.org/stable/auto_examples/linear_model/plot_iris_logistic.html

print(__doc__)


# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
Y = iris.target

h = .02  # step size in the mesh

logreg = linear_model.LogisticRegression(C=1e5)

# we create an instance of Neighbours Classifier and fit the data.
logreg.fit(X, Y)

# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, m_max]x[y_min, y_max].
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4, 3))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())

plt.show()

【问题讨论】:

  • I think logistic regression could be used for both regression [...] and classification - 原则上是的,但是如果人们说逻辑回归,他们总是指分类算法(是的,这很奇怪)。回归案例是 generalized linear models 的一个特例,带有 logit 链接功能。
  • @cel,很好的赶上和投票。如果我希望逻辑回归输出值在 0 和 1 之间,我应该怎么做?假设 0 表示人们没有购买东西,1 表示人们购买了东西,我想使用逻辑回归预测购买的概率。在我的例子中,目标只有值 0 和 1,但我想预测一个介于 0 和 1 之间的浮点数的概率。
  • @LinMa 使用 logreg.predict_proba() scikit-learn.org/stable/modules/generated/…
  • 谢谢@joc,投票。我认为 sigmoid 函数输出 0 到 1 之间的连续值,但 scikit 中的逻辑回归默认输出 0 或 1 用于分类问题。只是好奇 scikit learn 如何自动计算并将输出归一化为 0 或 1,是否有阈值 scikit learn 逻辑回归利用底层?谢谢。

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


【解决方案1】:

逻辑回归通常使用交叉熵成本函数,该函数根据二元误差对损失进行建模。此外,逻辑回归的输出通常在决策边界处遵循 sigmoid,这意味着虽然决策边界可能是线性的,但输出(通常被视为代表边界任一侧两个类别之一的点的概率)转换以非线性方式。这将使您的回归模型从 0 到 1 成为一个非常特殊的非线性函数。在某些情况下这可能是可取的,但通常可能并不可取。

您可以将逻辑回归视为提供表示是否属于某个类别的概率的幅度。如果您考虑具有两个自变量的二元分类器,您可以描绘一个表面,其中决策边界是概率为 0.5 的拓扑线。在分类器确定类的情况下,表面要么在高原上(概率 = 1),要么在低洼区域(概率 = 0)。从低概率区域到高概率区域的转换通常遵循 sigmoid 函数。

您可以查看 Andrew Ng 的 Coursera 课程,该课程有一组关于逻辑回归的课程。 This 是类中的第一个。我有一个 github 存储库,它是该类输出的 R 版本,here,您可能会发现它有助于更​​好地理解逻辑回归。

【讨论】:

  • 您好约翰,感谢您的回复。我了解逻辑回归的工作原理。我的问题更多关于 scikit learn 部分,你可以参考我的帖子示例代码,我的问题是为什么预测结果是离散的 0、1 或 2,而不是连续的 sigmoid 函数输出?只是想知道 scikit learn 如何自动找出我需要一个分类输出(离散)而不是连续输出。
  • 顺便说一句,约翰,为您的耐心回答投票。对于您的回复,有一点我不太清楚。我总是使用 EM(最大似然)来估计参数w,它与这里的交叉熵有什么关系?
  • 当你说参数w时,你的意思是class_weight吗?我在 scikit-learn 文档中没有看到 w 参数。很抱歉造成混乱。
  • 啊,是的。通常,您使用阈值将逻辑回归的输出(通常被视为 0 到 1 之间的概率)转换为预测(0 或 1)。所以,这绝对是正在发生的事情。我不确定 Scikit learn 是否允许您设置阈值。关于交叉熵和寻找最优系数集,损失函数是凸的,scikit learn 提供了几种不同的凸优化方法来解决优化问题。
  • 在多类情况下,逻辑回归类使用一对多方案。查看 scikit learn 代码,这将阈值设置为 0.5,并根据该阈值对概率预测进行加权以提供预测。
猜你喜欢
  • 2015-08-05
  • 2018-08-17
  • 2019-02-07
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2021-01-27
相关资源
最近更新 更多