机器学习 - 逻辑回归
在此页面上,W3schools.com 与 纽约数据科学学院 合作,为我们的学生提供数字培训内容。
逻辑回归
逻辑回归旨在解决分类问题。它通过预测分类结果来做到这一点,这与预测连续结果的线性回归不同。
在最简单的情况下,有两种结果,称为二项分类,例如预测肿瘤是恶性的还是良性的。其他情况有多种分类结果,这称为多项分类。多项逻辑回归的常见示例是预测鸢尾花在 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)
# 注意:X 必须从行重塑为列,LogisticRegression() 函数才能正常工作。
# 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]
这告诉我们,随着肿瘤大小每增加 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%。