逻辑回归
logistic 回归即对数几率回归,名字虽然叫“回归”,却是一种用于二分类的分类算法,通过训练样本学到一条线,去把不同类别的样本区别开,而不是通过拟合数据点,用sigmoid函数估计样本属于正样本的概率。
逻辑回归因其易于实现,强解释性,以及容易扩展,被广泛用于点击率预估(CTR),计算广告(CA)以及推进系统(RS)等任务中。
学习输入到输出的映射:
f
:
X
→
Y
f: X \rightarrow Y
f:X→Y
X
X
X:输入,
Y
Y
Y:输出;
定义条件概率
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X),需要满足两个条件:
1.
0
<
=
P
(
Y
∣
X
)
<
=
1
0<=P(Y|X)<=1
0<=P(Y∣X)<=1
2.
∑
Y
P
Y
∣
X
=
1
\sum_{Y} P{Y|X}=1
∑YPY∣X=1
思考:可不可以用线性回归方程 ω T x + b \omega^Tx+b ωTx+b来表示概率
不能,因为不满足条件概率第一条,通过引入sigmoid函数来改造线性映射模型:
把
ω
T
x
+
b
\omega^Tx+b
ωTx+b放到
S
(
x
)
S(x)
S(x)函数里面,定义域仍为
x
∈
(
−
∞
,
+
∞
)
x\in(-\infty,+\infty)
x∈(−∞,+∞),值域为
(
0
,
1
)
(0,1)
(0,1),对于而二分类问题,可以写成如下形式:
·
P
(
Y
=
1
∣
X
)
=
1
1
+
exp
(
−
ω
T
+
b
)
P(Y=1|X)=\frac{1}{1+\exp(-\omega^T+b)}
P(Y=1∣X)=1+exp(−ωT+b)1
·
P
(
Y
=
1
∣
X
)
=
exp
(
−
ω
T
+
b
)
1
+
exp
(
−
ω
T
+
b
)
P(Y=1|X)=\frac{\exp(-\omega^T+b)}{1+\exp(-\omega^T+b)}
P(Y=1∣X)=1+exp(−ωT+b)exp(−ωT+b)
两个式子可以合并为:
决策边界
如何判断?判断标准如何?
决策边界上的点被判给各类的概率相等,由此可得出:
w
T
+
b
=
0
w^T+b=0
wT+b=0的线性分类面,从而可以确定逻辑回归属于线性分类模型。
如何求解模型参数 ω \omega ω和 b b b
模型的实例化=定义明确的目标函数,定义优化器。
已经定义了目标函数:
如何寻找目标函数最优解:
1.判断是否为凸函数
求解最优解时,当找到一个解时,要通过凸函数还是非凸函数来判断它是否是全局最优解,如果是凸函数则是唯一的全局最优解,如果是非凸函数,还要考察其是否为局部最优解,通过调整步长来得到多个局部最优解,最后判断全局最优解。
2.选择最优化算法
GD,SGD,Adamgrad
通过代码实现逻辑回归:
1.首先定义出sigmoid函数
def sigmoid(x):
reutrn 1. / (1+np.exp(-x))
2.在sigmoid函数的基础上定义出概率函数 h θ ( x ) h_{\theta}(x) hθ(x), X X X为特征矩阵
def model(X,theta):
reutrn sigmoid(np.dot(X,theta.T))
3.定义目标函数,其中 X X X为特征矩阵, y y y为标签
def cost(X,y,theta):
left = np.multiply(y,np.log(model(X,theta))
right = np.multiply(1-y,np.log(1-model(X,theta))
return np.sum(-left-right) / X.shape[0]
4.定义目标函数的梯度值
def gradient(X,y,theta):
grad = np.zeros((theta.shape))
error = (model(X,theta)-y).ravel()
for j in range(theta.shape[1]):
temp = np.multiply(error,X[:,j])
grad[0,j] = np.sum(term) / (2*X.shape[0])
return grad
5.迭代求解的终止条件
STOP_ITER = 0
STOP_COST = 1
STOP_GRAD = 2
#三种停止策略
def stopCriterion(stopType, value, threshold):
if stopType == STOP_ITER: return value > threshold
elif stopType == STOP_COST: return abs(value[-1]-value[-2]) < threshold
elif stopType == STOP_GRAD: return np.linalg.norm(value) < threshold
6.打乱样本,原始数据是有规律集中采样,打乱样本更适合训练数据
from numpy import random
def shuffleData(data):
random.shuffle(data)
cols = data.shape[1]
X = data[:,0:cols-1]
y = data[:,0:cols-1]
return X,y
7. 训练函数
import time
def descent(data,theta,batchSize,stoptype,threshold,alpha):
init_time = time.time()
i = 0 #迭代次数计数器
k = 0 #mini-batch,训练所需样本数
X,y = shuffleData(data)
grad = np.zeros((theta.shape)) #梯度,初始化为0
costs = [cost(X,y,theta)] #损失函数值
while True:
grad = gradient(X[k:k+batchSize],y[k:k+bactchSize],theta)
k += batchSize
if(k>X.shape[0]):
k = 0
X,y = shuffleData(data)
theta = theta - alpha*grad #参数更新
costs.append(cost(X,y,theta))
i += 1
if stopType == STOP_ITER: value = i
elif stopType == STOP_COST: value = costs
elif stopType == STOP_GRAD: value = grad
if stopCriterion(stopType, value, threshold): break
return theta, i, costs, grad, time.time() - init_time