逻辑回归

逻辑回归笔记

Posted by jiang on November 8, 2018

原理

  • 根据现有数据对分类边界线建立回归公式,以此进行分类
  • 为了实现Logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把 所有的结果值相加,将这个总和代入Sigmoid函数中,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分入1类,小于0.5即被归入0类。所以,Logistic回归也可以被看成是一种概率估计

损失函数

海维赛德阶跃函数 单位阶跃函数

  • Sigmoid (0,1)

随机梯度上升算法伪代码:

  • 所有回归系数初始化为1
  • 对数据集中每个样本
  • 计算该样本的梯度
  • 使用alpha × gradient更新回归系数值
  • 返回回归系数值

优点:

  • 一是逻辑回归的算法已经比较成熟,预测较为准确;
  • 二是模型求出的系数易于理解,便于解释,不属于黑盒模型,尤其在银行业,80%的预测是使用逻辑回归;
  • 三是结果是概率值,可以做ranking model;
  • 四是训练快。

缺点:

  • 分类较多的y都不是很适用;
  • 对于自变量的多重共线性比较敏感,所以需要利用因子分析或聚类分析来选择代表性的自变量;
  • 另外预测结果呈现S型,两端概率变化小,中间概率变化大比较敏感,导致很多区间的变量的变化对目标概率的影响没有区分度,无法确定阈值。

sklearn代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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)