zoukankan      html  css  js  c++  java
  • 0212 Logistic(逻辑)回归


    更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

    逻辑回归

    虽然逻辑回归的名字里有“回归”两个字,但是它并不是一个回归算法,事实上它是一个分类算法。

    一、逻辑回归学习目标

    1. 二元逻辑回归的目标函数
    2. 最小化二元逻辑回归目标函数
    3. 二元逻辑回归的正则化
    4. 多元逻辑回归
    5. 逻辑回归的流程
    6. 逻辑回归的优缺点

    二、逻辑回归引入

    曾经在感知机引入时我们讲过,操场上男生和女生由于受传统思想的影响,男生和女生分开站着,并且因为男生和女生散乱在操场上呈线性可分的状态,因此我们总可以通过感知机算法找到一条直线把男生和女生分开,并且最终可以得到感知机模型为

    f(x)=sign((w)Tx)

    如果你细心点会发现,由于感知模型使用的是sign函数,如果当计算一个样本点wTx=0.001的时候,sign(wTx)=1,即该函数会把该样本归为1,但是为什么他不能是0类呢?并且由于sign函数在x=0处有一个阶跃,即函数不连续,该函数在数学上也是不方便处理的。

    由此逻辑函数使用sigmoid函数对wTx做处理,并且把sigmoid函数得到的值y^当成概率进行下一步处理,这也正是逻辑回归对感知机的改进。

    上述整个过程其实就是逻辑回归一步一步被假想出来的的一个过程,接下来将从理论层面抽象的讲解逻辑回归。

    # 感知机引入图例
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    

    %matplotlib inline
    font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

    np.random.seed(1)
    x1 = np.random.random(20)+1.5
    y1 = np.random.random(20)+0.5
    x2 = np.random.random(20)+3
    y2 = np.random.random(20)+0.5

    # 一行二列第一个
    plt.subplot(121)
    plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
    plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
    plt.vlines(2.8, 0, 2, colors="r", linestyles="-", label='\(wx+b=0\)')
    plt.title('线性可分', fontproperties=font, fontsize=20)
    plt.xlabel('x')
    plt.legend(prop=font)

    # 一行二列第二个
    plt.subplot(122)
    plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
    plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
    plt.scatter(3.5, 1, s=50, color='b')
    plt.title('线性不可分', fontproperties=font, fontsize=20)
    plt.xlabel('x')
    plt.legend(prop=font)
    plt.show()

    png

    三、逻辑回归详解

    3.1 线性回归与逻辑回归

    线性回归的假设函数为

    y^=ωTx

    此时的y^是连续值,所以它是一个回归模型,如果y^是离散值呢?

    可能你已经想到了,对假设函数得到的连续值再做一次转换,即g(y^),并且令g(y^)函数值在y^属于某个区间时为c1类;y^属于另一个区间时为c2类,这样就能得到一个二元分类模型。

    3.2 二元逻辑回归的假设函数

    上一节讲到对线性回归的结果通过函数g做一次转换即可得逻辑回归。在逻辑回归当中函数g通常使用Sigmoid函数替代,即函数g

    g(z)=11+ez

    3.2.1 让步比

    让步比可以理解成有利于某一特定事件的概率,可以定义为

    p1p

    在已知二分类问题的情况下每个分类的概率分别为yi^1yi^,可以定义logit函数,即让步比的对数形式(log-odds)为

    (1)logit(yi^)=logp(y=1|x,ω)p(y=0|x,ω)(2)=logyi^1yi^(3)=log11+eωTxωTx1+eωTx(4)=ωTx

    其中logit(p)函数等于事件发生的概率除以不发生的概率取对数,即表示特征值和对数概率之间的线性关系。

    然而特征值和对数概率之间的线性关系并不重要,重要的是预测值与它发生的概率的关系,即让步比的逆形式,也就是上述说到的Sigmoid函数。

    wTx=logp1pewTx=p1pp=11+ewTx

    3.2.2 Sigmoid函数图像

    # Sigmoid函数图像图例
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    def sigmoid(z):
    return 1 / (1 + np.exp(-z))

    ax = plt.subplot(111)

    # 描绘十字线
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))

    z = np.linspace(-10, 10, 256)
    hat_y = sigmoid(z)
    plt.plot(z, hat_y, c='r', label='Sigmoid')

    # 描绘y=0.5和y=1.0两条直线
    plt.yticks([0.0, 0.5, 1.0])
    ax = plt.gca()
    ax.yaxis.grid(True)

    plt.xlabel('z')
    plt.ylabel('\(\hat{y}\)')
    plt.legend()
    plt.show()

    png

    上图为Sigmoid函数图像,可以看出当z趋于正无穷时,g(z)趋于1;当z趋于负无穷时,g(z)趋于0,这个属性非常适合上述所说的分类模型。

    因此可以把线性函数的假设函数看成是Sigmoid函数的自变量,即逻辑回归的假设函数为

    y^=11+eωTx

    虽然改变了逻辑回归的假设函数,但是Sigmoid函数的输出值是(0,1)范围内的连续值,并不是二元分类模型想要的二元离散值,因此需要对逻辑回归的假设函数做进一步处理,即

    {y^>0.5ωTx>0,y=1y^<0.5ωTx<0,y=0

    如果y^=0.5ωTx=0,不在逻辑回归模型的讨论范围内,一般而言视具体情况而定。

    3.3 二元逻辑回归的目标函数

    得到了逻辑回归的假设函数,则需要通过最小化目标函数即最小化误差找到最合适的参数ω

    由于线性回归是预测连续值的模型,因此可以使用均方误差代价函数。但是逻辑回归是预测离散值的模型,因此可以使用极大似然估计推导出逻辑回归的目标函数。

    上一节假设逻辑回归的输出为类别0或类别1,用概率表达方式为

    (5)p(y=1|x,ω)=π(x)(6)p(y=0|x,ω)=1π(x)

    由于y只可能是01,则可以把上述两个公式联立可得y的概率分布函数表达式

    p(y|x,ω)=(π(x))y(1π(x))(1y)

    通过y的概率分布函数表达式即可得似然函数为

    L(ω)=i=1m[π(xi)]yi[(1πxi)](1yi)

    其中m为样本的个数。

    通过似然函数得到对数似然函数即目标函数(注:该目标函数与交叉熵损失函数的形式一致,二元逻辑回归可以理解为交叉熵损失函数两个类变量的特殊形式,交叉熵详见《熵和信息增益》)为

    (7)J(ω)=logL(ω)(8)=i=1m[yilogπ(xi)+(1yi)log(1π(xi))]

    J(ω)求极大值,即可得到ω的估计值。

    一般采用梯度上升法或拟牛顿法求解ω的估计值。

    3.3.1 不同样本分类的代价

    逻辑回归的目标函数为

    J(ω)=i=1m[yilogπ(xi)+(1yi)log(1π(xi))]

    对于二分类问题,可以求出y=1y=0的代价函数

    J(ω)={logπ(x)ify=1log(1π(x))ify=0

    # 不同样本实例分类的代价图例
    def cost_1(z):
        return -np.log(sigmoid(z))
    

    def cost_0(z):
    return -np.log(1-sigmoid(z))

    z = np.linspace(-10, 10, 256)
    pi_x = sigmoid(z)
    c1 = [cost_1(i) for i in z]
    c0 = [cost_0(i) for i in z]
    plt.plot(pi_x, c1, c='r', linestyle='--',
    label='\(J(\omega), \quad if \quad y=1\)')
    plt.plot(pi_x, c0, c='g', label='\(J(\omega), \quad if \quad y=0\)')
    plt.xlabel('\(\pi(x)\)')
    plt.ylabel('\(J(\omega)\)')
    plt.legend()
    plt.show()

    png

    上图可以看出如果正确地预测样本属于第1类,代价会接近0(虚线);如果正确的预测y=0(实线),代价也会接近0。如果预测错误,代价则会趋近于无穷大,即用越来越大的代价惩罚错误的预测。

    3.4 二元逻辑回归目标函数最大化

    3.4.1 梯度上升法

    二元逻辑回归的目标函数为

    J(ω)=i=1m[yilnπ(xi)+(1yi)ln(1π(xi))]

    得到二元逻辑回归的目标函数,我们需要最大化似然函数,即最大化二元逻辑回归的目标函数。

    目标函数对ω的偏导为

    (9)J(ω)ωj=i=1m(yiπ(xi)1yi1π(xi))π(xi)ωj(10)=i=1m(yig(ωTxi)1yi1g(ωTxi))g(ωTxi)ωj(11)=i=1m(yig(ωTxi)1yi1g(ωTxi))g(ωTxi)(1g(ωTxi))ωTxiωj(12)=i=1m(yi(1g(ωTxi))(1yi)g(ωTxi))xij(13)=i=1m(yig(ωTxi))xij

    其中i为第i个样本,j为第j个特征。

    逻辑回归参数的学习规则为

    ωj=ωj+αi=1m(yig(ωTxi))xi(j)

    3.4.2 线性回归和逻辑回归的参数更新

    线性回归的参数学习公式为

    ωj=ωjαi=1m(yih(ωTxi))xi(j)

    逻辑回归的参数学习公式为

    ωj=ωj+αi=1m(yig(ωTxi))xi(j)

    从上述两个参数学习公式可以看出线性回归和逻辑回归的参数更新方式有着相同的公式,但是由于线性回归是最小化目标函数,而逻辑回归是最大化似然函数即最大化目标函数,因此线性回归是梯度下降法、逻辑回归是梯度上升法,曾经也讲过其实梯度下降法和梯度上升法可以转换。

    3.4.3 拟牛顿法

    收敛速度更快,但是如果特征维度较大计算时间漫长。

    3.5 二元逻辑回归模型

    假设求得逻辑回归参数为为ωT,则二元逻辑回归模型为

    (14)p(y=1|x)=eωTx1+eωTx(15)p(y=0|x)=11+eωTx

    3.6 二元逻辑回归的正则化

    3.6.1 L1正则化

    二元逻辑回归的L1正则化与普通线性回归的L1正则化类似,增加了L1范数作为惩罚,即

    J(ω)=i=1m[yi(ωxiln(1+exp(ω(xi))]+λ||ω||1

    二元逻辑回归L1正则化目标函数常用的优化方法有坐标轴下降和最小角回归。

    3.6.2 L2正则化

    二元逻辑回归的L2正则化与普通线性回归的L2正则化类似,增加了L2范数作为惩罚,即

    J(ω)=i=1m[yi(ωxiln(1+exp(ω(xi))]+12λ||ω||2

    3.7 多元逻辑回归

    上面介绍的逻辑回归都是二元分类模型,用于二分类问题,可以使用以下三种方法将其推广为多元逻辑回归。OvR和MvM主要是对数据做处理,这里不介绍其具体过程。而Softmax回归则是优化模型,因此主要讲解Softmax回归。

    3.7.1 OvR

    假设一个数据集Dc1,c2,,ckk个类别,则可以把c1看成一个类别,把c2,c3,,ck看成另外一个类别,即把D分为两个子集,把多分类问题则变成了关于c1c2,c3,,ck的二分类问题,然后对含有多个类别的子集再次使用OvR方法,直至无法分类为止。通常这种方法称为OvR(One-vs-Rest)。

    3.7.2 MvM

    假设一个数据集Dc1,c2,,ckk个类别,则可以先把c1,c2,,ci,i<k看成一个类别,把ci,ci+1,,ck看成另外一个类别,即把D分为两个子集,多分类问题则变成了关于c1,c2,,cici,ci+1,,ck的二分类问题,然后对两个子集再次使用MvM方法,直至无法分类为止。通常这种方法称为MvM(Many-vs-Many)。

    如果每次只选择两个个类别进行分类的话,则该方法称为OvO(One-vs-One),一般情况下首先考虑使用OvO。

    3.7.3 Softmax回归

    详见《Softmax回归》

    四、逻辑回归流程

    4.1 输入

    m个实例n维特征的数据集

    T={(x1,y1),(x2,y2),,(xm,ym)}

    其中xi是实例的特征向量即(xi(1),xi(2),,xi(n))

    4.2 输出

    ω和二元逻辑回归模型。

    4.3 流程

    1. 选取初值ω=0
    2. 训练集中选取数据(xi,yi),对ω使用梯度上升更新

    ω=ω+α(yig(ωTxi))xi(j)

    1. 重复步骤2,直至ω收敛停止更新
    2. 得到最小化的目标函数J(ω),同时可以得到最优的ω,二元逻辑回归模型为

    (16)p(y=1|x)=eωTx1+eωTx(17)p(y=0|x)=11+eωTx

    五、逻辑回归优缺点

    5.1 优点

    1. 由于计算量只和特征的数目有关,训练速度相较其他的分类器例如支持向量机快
    2. 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大
    3. 可以手动调整阈值(并不一定要0.5),输出结果可以手动调节控制,灵活

    5.2 缺点

    1. 因为类似线性回归很容易欠拟合,分类精度不高
    2. 假设数据分类严重不平衡,例如1:10000,则分类时会有倾向问题
    3. 逻辑回归本身无法筛选特征,通常通过GBDT筛选特征后再使用逻辑回归

    六、小结

    逻辑回归引入时说到逻辑回归一定程度上也是基于感知机演化而来,在替换sigmoid函数的同时,将sigmoid函数得到的值转换为概率的形式,进而可以最大化似然函数得到最优w,这也是逻辑回归的巧妙之处,但是两者还是换汤不换药,都是基于特征的线性模型分类。

    由于感知机、线性回归和逻辑回归都和线性模型有一定的关系,因此放在一起讲,下面将会将一个单独的算法,它从理论上而言是最简单易懂的一个算法,即k近邻算法。

  • 相关阅读:
    Python进阶: Decorator 装饰器你太美
    计算机网络自顶向下方法第3章-传输层 (Transport Layer).2
    Python进阶:值传递,引用传递?不存在的,是赋值传递
    Python进阶:对象复制与比较,分深浅,见真假
    Python基础:模块化来搭项目
    这说明一个问题
    我稍微思考了一下
    由LruCache和DiskLruCache提供三级缓存支持的ImageLoader
    回忆一个加塞方法
    三年六班的李子明同学,你妈拿了两本计算机基础在二号树上等你
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11289780.html
Copyright © 2011-2022 走看看