机器学习 - 逻辑回归

逻辑回归

逻辑回归旨在解决分类问题。它通过预测分类结果来实现这一点,这与预测连续结果的线性回归不同。

在最简单的情况下,有两种结果,这被称为二项式,其中一个例子是预测肿瘤是恶性还是良性。在其他情况下,有超过两种结果进行分类,在这种情况下它被称为多项式。多项式逻辑回归的一个常见例子是预测鸢尾花属于3个不同物种中的哪一个。

在这里,我们将使用基本的逻辑回归来预测一个二项式变量。这意味着它只有两个可能的结果。

它是如何工作的?

在 Python 中,我们有模块会为我们完成这项工作。首先导入 NumPy 模块。

import numpy

将自变量存储在 X 中。

将因变量存储在 y 中。

下面是一个样本数据集:

# X 代表肿瘤的厘米大小。
X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)

# 注意:为了使 LogisticRegression() 函数工作,X 需要从行重塑为列。
# y 代表肿瘤是否为癌性(0 表示“否”,1 表示“是”)。
y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

我们将使用 sklearn 模块中的一个方法,因此还需要导入该模块:

from sklearn import linear_model

从 sklearn 模块中,我们将使用 LogisticRegression() 方法来创建一个逻辑回归对象。

这个对象有一个名为 fit() 的方法,该方法将自变量和因变量作为参数,并用描述关系的数据填充回归对象:

logr = linear_model.LogisticRegression()
logr.fit(X,y)

现在我们有一个逻辑回归对象,它可以根据肿瘤大小来预测肿瘤是否为癌性:

# 预测大小为 3.46mm 的肿瘤是否为癌性:
predicted = logr.predict(numpy.array([3.46]).reshape(-1,1))

实例

查看整个实例的运行情况:

import numpy
from sklearn import linear_model

# 为逻辑函数重塑。
X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)
y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

logr = linear_model.LogisticRegression()
logr.fit(X,y)

# 预测大小为3.46mm的肿瘤是否为癌性:
predicted = logr.predict(numpy.array([3.46]).reshape(-1,1))
print(predicted)

亲自试一试

结果:

[0]

我们已经预测出大小为 3.46mm 的肿瘤不是癌性的。

系数

在逻辑回归中,系数是X每单位变化时结果的对数几率的预期变化。

这并不具有最直观的理解,因此让我们用它来创建更有意义的东西,即几率。

实例

查看整个实例的运行情况:

import numpy
from sklearn import linear_model

# 为逻辑函数重塑。
X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)
y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

logr = linear_model.LogisticRegression()
logr.fit(X,y)

log_odds = logr.coef_
odds = numpy.exp(log_odds)

print(odds)

亲自试一试

结果:

[4.03541657]

这告诉我们,当肿瘤大小增加 1mm 时,它是癌性肿瘤的几率增加了 4 倍。

概率

可以使用系数和截距值来找出每个肿瘤为癌性的概率。

创建一个函数,该函数使用模型的系数和截距值返回一个新值。这个新值表示给定观测值是肿瘤的概率:

def logit2prob(logr,x):
  log_odds = logr.coef_ * x + logr.intercept_
  odds = numpy.exp(log_odds)
  probability = odds / (1 + odds)
  return(probability)

函数解释

要找到每个观测值的对数几率,我们必须首先创建一个类似于线性回归中的公式,提取系数和截距。

log_odds = logr.coef_ * x + logr.intercept_

然后,为了将对数几率转换为几率,我们必须对对数几率进行指数化。

odds = numpy.exp(log_odds)

现在我们有了几率,我们可以通过将其除以1加几率来将其转换为概率。

probability = odds / (1 + odds)

现在让我们使用所学到的函数来找出每个肿瘤为癌性的概率。

实例

查看整个实例的运行情况:

import numpy
from sklearn import linear_model

X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)
y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

logr = linear_model.LogisticRegression()
logr.fit(X,y)

def logit2prob(logr, X):
  log_odds = logr.coef_ * X + logr.intercept_
  odds = numpy.exp(log_odds)
  probability = odds / (1 + odds)
  return(probability)

print(logit2prob(logr, X))

亲自试一试

结果:

  [[0.60749955]
   [0.19268876]
   [0.12775886]
   [0.00955221]
   [0.08038616]
   [0.07345637]
   [0.88362743]
   [0.77901378]
   [0.88924409]
   [0.81293497]
   [0.57719129]
   [0.96664243]]

结果解释

3.78 0.61 大小为 3.78cm 的肿瘤为癌性的概率为 61%。

2.44 0.19 大小为 2.44cm 的肿瘤为癌性的概率为 19%。

2.09 0.13 大小为 2.09cm 的肿瘤为癌性的概率为 13%。