4. 逻辑回归原理详解与python实现

1 前言

逻辑回归又叫做逻辑斯蒂回归,是机器学习中非常基础的分类方法,算法简单而高效,在实际场景中得到了广泛应用。

相比于前面章节学习的线性回归,逻辑回归是一种分类方法、而不是预测方法。

2 线性可分与不可分

一般来说,如果我们可以用一条直线在数据集中将样本数据分开,那么就称其为线性可分,否则就是线性不可分。

一个简单的例子如下:

image.png

上图中,左边就可以用一条直线将样本点分为两类,但右边不行。

实际场景中的例子,比如成绩合格与不合格就是线性可分的:

import numpy as np
import matplotlib.pyplot as plt

scores = [79, 38, 91, 35, 70, 74, 67, 12, 61, 11]
passed = [1, 0, 1, 0, 1, 1, 1, 0, 1, 0]
plt.scatter(scores, passed)

# 用线性预测
model = LinearRegression()
model.fit(np.array(scores).reshape(len(scores), 1), passed)
plt.plot(scores, model.predict(np.array(scores).reshape(len(scores), 1)),color="r")


plt.xlabel("scores")
plt.ylabel("passed")
plt.show()

上面的代码中有十个成绩数据,如果大于60则认为通过,对应的值就是1,否则就是0未通过。

然后有了这个分数作为自变量、是否通过作为因变量,那么我们就可以根据这个变化来使用前面的线性回归拟合来尝试画出这条分类的线条:

image.png

按照我们的规则,如果x>60x>60,那么f(x)>0.5f(x)>0.5,四舍五入一下就能得到及格的1与不及格的0。

这么来看,上面这条线确实能完成基本的预测功能,只不过看起来不雅观,因为它并没有将两种类型直接划分到它的两边。

而实际上,用这种方式在某些情况下也并不能正常的进行分类划分、会出现错误的情况:

比如下面这段代码:

import numpy as np
import matplotlib.pyplot as plt

scores = [1, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10]
passed = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1]
plt.scatter(scores, passed)

# 用线性预测
model = LinearRegression()
model.fit(np.array(scores).reshape(len(scores), 1), passed)
plt.plot(scores, model.predict(np.array(scores).reshape(len(scores), 1)), color="r")


plt.xlabel("scores")
plt.ylabel("passed")
plt.show()

这里的对应关系并没有那么直接,并非只要数值大于某个数,就认为它是通过的,这可以反应为某些课程的通过标准并不一致,现在拿到了这个结果、需要对其进行分类,将合格与不合格的数据分割开来。

那么此时就会出现问题:

image.png

因为按照这条直线来说,x等于6、7时,y值是大于0.5的,那么就会将其归于通过,但实际上它并没有通过,这便是分类错误。

3 Sigmoid分布函数

可以看到,上面通过线性回归的方式对数据集进行分类,只适用于规则单一、呈线性变化的数据集中,否则很容易出现分类错误。

而且在上述这类010-1分类问题中,用线性回归还可能出现负数、大于1的数,这都不是我们想要的。

为了解决这类问题,我们就可以使用Sigmoid分布函数,它的定义如下:

f(x)=11+exf(x)=\frac{1}{1+e^{-x}}

它的图形长下面这样:

image.png

对应的代码实现如下:

import numpy as np
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux