机器学习之逻辑回归
一. 什么是逻辑回归
首先我们要明白什么是逻辑回归
逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏
Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),他的y尝尝是分类变量,就是0或1这种的
Logistic回归与多重线性回归实际上有很多相同之处,
最大的区别就在于它们的因变量不同,其他的基本都差不多。正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedlinear model)。
这一家族中的模型形式基本上都差不多,不同的就是因变量不同。这一家族中的模型形式基本上都差不多,不同的就是因变量不同。
如果是连续的,就是多重线性回归
如果是二项分布,就是Logistic回归
如果是Poisson分布,就是Poisson回归
如果是负二项分布,就是负二项回归
二、Sigmoid函数
首先第一步我们要构造预测函数,叫做sigmoid函数,也被成为预测函数.
解释:将任意的输入映射到[0,1]区间我们在线性回归中得到一个预测值,再将该值映射到sigmoid函数中就完成了一个值到概率的转化,也就是分类任务。
其中z=
实际上g(z)并不是预测结果,而是预测结果为正例的概率,一般来说阈值为0.5,也就是当g(z)>0.5,我们就说他是正例,g(z)<0.5就是负例,但在实际应用中也可能不同。比如我们预测一个人是否患有新型冠状病毒,我们这时如果只设置阈值为0.5,那么一个人患有新冠的概率为0.45,我们的模型也会认为他没有新冠,所以这时我们不妨把阈值设置的小一些如0.1,如果概率大于0.1你就要去做检查隔离,这样可以减少误差防止漏放病人。
上述可知:
P(y=0|w,x) = 1 – g(z) #预测为负例
P(y=1|w,x) = g(z) #预测为正例
所以单条预测正确的概率为
P(正确) =*
这里解释一下,yi为某一个样本的预测值,为0或者1
那么为什么P(正确)等于这个呢,你想想,假设我们预测他为1的概率是0.8,预测他为0的概率是0.2。那么这时候如果我们说他是1,那么我们正确的概率就是0.8,如果我们说他是0,那我们正确的概率就是0.2
三、极大似然估计
因此我们要去寻找一个w的值使得g(z)正确的概率最大,而我们在上面的推理过程中已经得到每个单条样本预测正确概率的公式
若想让预测出的结果全部正确的概率最大,根据最大似然估计,也就是所有样本预测正确的概率相乘得到的P(总体正确)最大,似然函数如下:
我们对其取对数可得:
得到的这个函数越大,证明我们得到的W就越好.此时为梯度上升求最大值,引入j(θ)=(-1/m)L(θ)转化为梯度下降任务,得到公式如下:
这就是其代价函数,也称交叉熵函数。
四、求解W
我们对代价函数求导可得:
然后采用梯度下降来更新w:
我们随便来举个例子来看看具体是怎么实现的
import numpy as np
from sklearn.linear_model import LogisticRegression
# data数据 4,3 x1, x2, y
data = np.array([
[1, 1, 0],
[1, 2, 0],
[0, 0, 1],
[-1, 0, 1]
])
#数据集切分, 前两列特征,最后一列作为标签
x = data[:, :-1]
y = data[:, -1:]
print(x)
print(y)
[[ 1 1]
[ 1 2]
[ 0 0]
[-1 0]]
[[0]
[0]
[1]
[1]]
# 调用模型LogisticRegression()训练预测
model = LogisticRegression()
model.fit(x, y.ravel()) #ravel 返回连续的展平数组
y_ = model.predict(x) #这一步的x你可以换成你想要的测试集
print(y_)
[0 0 1 1]
#打印输出的可能性, 第一列为0样本,第二列为1样本
print(model.predict_proba(x))
[[0.67147648 0.32852352]
[0.80685489 0.19314511]
[0.3285313 0.6714687 ]
[0.19314393 0.80685607]]
还可以查看w和b的值
w = model.coef_
b = model.intercept_
print(w)
print(b)