目录

机器学习 - 逻辑回归


在此页面上,W3schools.com 与纽约数据科学院,为我们的学生提供数字培训内容。


逻辑回归

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

在最简单的情况下,有两个结果,称为二项式,其中一个例子是预测肿瘤是恶性还是良性。其他情况有两个以上的结果需要分类,在这种情况下称为多项式。多项逻辑回归的一个常见示例是预测 3 个不同物种之间的鸢尾花的类别。

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


它是如何工作的?

在 Python 中,我们有可以为我们完成工作的模块。首先导入 NumPy 模块。

import numpy

将自变量存储在 X 中。

将因变量存储在 y 中。

下面是一个示例数据集:

#X represents the size of a tumor in centimeters.
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)

#Note: X has to be reshaped into a column from a row for the LogisticRegression() function to work.
#y represents whether or not the tumor is cancerous (0 for "No", 1 for "Yes").
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)

现在我们有了一个逻辑回归对象,可以根据肿瘤大小判断肿瘤是否癌变:

#predict if tumor is cancerous where the size is 3.46mm:
predicted = logr.predict(numpy.array([3.46]).reshape(-1,1))

示例

查看整个示例的实际效果:

import numpy
from sklearn import linear_model

#Reshaped for Logistic function.
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)

#predict if tumor is cancerous where the size is 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

#Reshaped for Logistic function.
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]
 
运行示例 »

这告诉我们,肿瘤大小每增加 1 毫米,癌性肿瘤的几率就会增加 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%。