机器学习 - 逻辑回归
逻辑回归
逻辑回归旨在解决分类问题。它通过预测分类结果来实现这一点,这与预测连续结果的线性回归不同。
在最简单的情况下,有两种结果,这被称为二项式,其中一个例子是预测肿瘤是恶性还是良性。在其他情况下,有超过两种结果进行分类,在这种情况下它被称为多项式。多项式逻辑回归的一个常见例子是预测鸢尾花属于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%。