原理
- 根据现有数据对分类边界线建立回归公式,以此进行分类
- 为了实现Logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把 所有的结果值相加,将这个总和代入Sigmoid函数中,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分入1类,小于0.5即被归入0类。所以,Logistic回归也可以被看成是一种概率估计
损失函数
$$Cost(h_𝜃(x),y) = \begin{cases} -log(h_𝜃(x)), & \text{if $y$ = 1} \ -log(1-h_𝜃(x)), & \text{if $y$ = 0} \end{cases}$$
海维赛德阶跃函数 单位阶跃函数
$$h_𝜃(x)=\frac{1}{1+e^{-𝜃^{T}x}}$$
- Sigmoid (0,1)
随机梯度上升算法伪代码:
- 所有回归系数初始化为1
- 对数据集中每个样本
- 计算该样本的梯度
- 使用alpha × gradient更新回归系数值
- 返回回归系数值
优点:
- 一是逻辑回归的算法已经比较成熟,预测较为准确;
- 二是模型求出的系数易于理解,便于解释,不属于黑盒模型,尤其在银行业,80%的预测是使用逻辑回归;
- 三是结果是概率值,可以做ranking model;
- 四是训练快。
缺点:
- 分类较多的y都不是很适用;
- 对于自变量的多重共线性比较敏感,所以需要利用因子分析或聚类分析来选择代表性的自变量;
- 另外预测结果呈现S型,两端概率变化小,中间概率变化大比较敏感,导致很多区间的变量的变化对目标概率的影响没有区分度,无法确定阈值。
sklearn代码示例
from numpy import *
x = array([
[1.0,1,2],
[1.0,2,4.1],
[1.0,7,11],
[1.0,5,15],
[1.0,12,12],
],dtype='float32')
y = array([0,0,1,1,1])
def sigmoid(X):
return 1.0 / (1 + exp(-X))
def SGradAscent(X,Y):
m,n = shape(X)
alpha = 0.001
wei = ones(n)
for i in range(m*2):
h = sigmoid(sum(X[i//m] * wei))
err = Y[i//m] - h
wei = wei + alpha * err * X[i//m]
print(err,wei,h)
return wei
def stocGradAscent(X,y,num=150):
m,n = shape(X)
wei = ones(n)
for j in range(num):
indice = [k for k in range(m)]
for i in range(m):
alpha = 4/(1.0 + j + i) + 0.01
randIndex = int(random.uniform(0,len(indice)))
h = sigmoid(sum(X[randIndex] * wei))
err = y[randIndex] - h
wei += X[randIndex] * alpha * err
print('err:{} wei:{}'.format(err,wei))
del indice[randIndex]
return wei
def LR1(x,y):
wei = stocGradAscent(x,y,1000)
print(wei)
import matplotlib.pyplot as plt
# wei = wei.getA()
n = shape(x)[0]
xcord1 = []
xcord2 = []
ycord1 = []
ycord2 = []
for i in range(n):
if int(y[i]) == 1:
xcord1.append(x[i,1])
ycord1.append(x[i,2])
else:
xcord2.append(x[i,1])
ycord2.append(x[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1,ycord1,s=30,c='red',marker='s')
ax.scatter(xcord2,ycord2,s=30,c='green')
k = arange(-30.0,30.0,0.1)
v = (-wei[0] - wei[1] * k)/wei[2]
ax.plot(k,v)
plt.show()
# LR1(x,y)
def ori_lr(x,y):
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
clf = lr.fit(x,y)
x1 = array([[7,8],[1,2.1]])
y1 = array([1,0])
sor = clf.score(x1,y1)
pre = clf.predict(x1)
print(pre)
# ori_lr(x,y)
