Logistic Regression(逻辑斯谛回归)

Logistic 回归

有的翻译叫做逻辑回归,但我看很多人说这个名字不好,其实它和逻辑这个专有名词并没有必然的联系,所以这里采用李航博士《统计学习方法》中的翻译:逻辑斯谛回归。

对于二元分类问题来讲,给定一个输入特征向量 ܺX它可能对应一张图片,你想识别这 张图片识别看它是否是一只猫或者不是一只猫的图片,你想要一个算法能够输出预测,称之为y^,也就是你对实际值 y 的估计。更正式地来说,你想让 y^表示 y 等于 1 的一 种可能性或者是机会,条件是给定了输入特征 X。换句话来说,你想让 y^来告诉你这是一只猫的图片的机率有多大。

假设函数(Hypothesis Function)

我们用 w来表示逻辑回归的参数,这也是一个݊nx维向量(因为w实际上是特征权重,维度与特征向量相同),参数里面还有b,这是一个实数(表示偏差)。所以给出输入x以及参数w和 b之后,我们怎样产生输出预测值y,一件你可以尝试的事是让y=wTx+b。
在这里插入图片描述
这时候我们得到的是一个关于输入x的线性函数,实际上这是在做线性回归时所用到的,但是这对于二元分类问题来讲不是一个非常好的算法,因为你想让y^表示实际值y等于 1 的机率的话,y^应该在 0 到 1 之间。这是一个需要解决的问题,因为wTx+b可能比1要大得多,或者甚至为一个负值。对于你想要的在0和1之间的概率来说它是没有意义的,因此在logistic回归中,我们的输出应该是y^等于由上面得到的线性函数式子作为自变量的 sigmoid 函数中,公式如上图最下面所示,将线性函数转换为非线性函数。在这里插入图片描述
关于z的 sigmoid 函数将会近似等于 1 除以 1 加上某个非常接近于 0 的项,因为e的指数如果是个绝对值很大的负数的话,这项将会接近于 0,所以如果z很大的话那么关于z的 sigmoid 函数会非常接近 1。相反地,如果z非常小或者说是一个绝对值很大的负数,你可以认为这是 1 除以 1 加上一个非常非常大的数,所以这个就接近于 0。因此当你实现logistic回归时,你的工作就是去让机器学习参数w以及 b, 这样才使得y^成为对 y=1这一情况的概率一个很好的估计。
在这里插入图片描述

代价函数(损失函数)

为了训练逻辑回归模型的参数w和参数b,我们需要一个代价函数,通过训练代价函数来得到参数w和参数b。先看一下逻辑斯谛回归的输出函数:
在这里插入图片描述
为了让模型通过学习调整参数,你需要给一个m样本的训练集,这会让你在训练集上找到参数w和参数b,来得到你的输出。
对训练集的预测值,我们将它写成y^,我们更希望它会接近于训练集中的y值,为了对 上面的公式更详细的介绍,我们需要说明上面的定义是对一个训练样本来说的,这种形式也使用于每个训练样本,我们使用这些带有圆括号的上标来区分索引和样本,训练样本i所对应的预测值是y(i),是用训练样本wTx(i)+b的,然后通过 sigmoid 函数来得到,也可以把z定义为z(i)=wTx(i)+b,我们将使用符号(i)注解,上标(i)来指明数据表示x或者y或者z 或者其他数据的第i个训练样本。

损失函数:

损失函数又叫做误差函数,用来衡量算法的运行情况,Loss function:L(y^,y)
我们通过这个L称为的损失函数,来衡量预测输出值和实际值有多接近。一般我们用预 测值和实际值的平方差或者它们平方差的一半,但是通常在逻辑回归中我们不这么做,因为当我们在学习逻辑斯谛回归参数的时候,会发现我们的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数,但是我们在逻辑斯谛回归模型中会定义另外一个损失函数:
在这里插入图片描述
当我们使用平方误差作为损失函数的时候,你会想要让这个误差尽可能地小对于这个逻辑斯谛回归损失函数,我们也想让它尽可能地小。

当y = 1时损失函数y = -log(y),如果想要损失函数L尽可能得小,那么y就要尽可能大,因为 sigmoid函数取值[0,1],所以y^会无限接近于 1。
当y = 0时损失函数y = -log(1 - y),如果想要损失函数L尽可能得小,那么y就要尽可能小,因为sigmoid函数取值[0,1],所以y^会无限接近于0。

如果y等于 1,我们就尽可能让y^变大,如果y等于 0,我们就尽可能让y^变小。 损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,我们需要定义一个算法的代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m:
在这里插入图片描述
损失函数只适用于像这样的单个训练样本,而代价函数是参数的总代价,所以在训练逻 辑斯谛回归模型时候,我们需要找到合适的w和b,来让代价函数J的总代价降到最低。 根据我们对逻辑斯谛回归算法的推导及对单个样本的损失函数的推导和针对算法所选用参数的总代价函数的推导,结果表明逻辑斯谛回归可以看做是一个非常小的神经网络。

代码

# encoding=utf-8
# @Author: WenDesi
# @Date:   08-11-16
# @Email:  wendesi@foxmail.com
# @Last modified by:   WenDesi
# @Last modified time: 08-11-16

import time
import math
import random
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score


class LogisticRegression(object):

    def __init__(self):
        self.learning_step = 0.00001
        self.max_iteration = 5000

    def predict_(self,x):
        wx = sum([self.w[j] * x[j] for j in xrange(len(self.w))])
        exp_wx = math.exp(wx)

        predict1 = exp_wx / (1 + exp_wx)
        predict0 = 1 / (1 + exp_wx)

        if predict1 > predict0:
            return 1
        else:
            return 0


    def train(self,features, labels):
        self.w = [0.0] * (len(features[0]) + 1)

        correct_count = 0
        time = 0

        while time < self.max_iteration:
            index = random.randint(0, len(labels) - 1)
            x = list(features[index])
            x.append(1.0)
            y = labels[index]

            if y == self.predict_(x):
                correct_count += 1
                if correct_count > self.max_iteration:
                    break
                continue

            # print 'iterater times %d' % time
            time += 1
            correct_count = 0

            wx = sum([self.w[i] * x[i] for i in xrange(len(self.w))])
            exp_wx = math.exp(wx)

            for i in xrange(len(self.w)):
                self.w[i] -= self.learning_step * \
                    (-y * x[i] + float(x[i] * exp_wx) / float(1 + exp_wx))


    def predict(self,features):
        labels = []

        for feature in features:
            x = list(feature)
            x.append(1)
            labels.append(self.predict_(x))

        return labels

if __name__ == "__main__":
    print 'Start read data'

    time_1 = time.time()

    raw_data = pd.read_csv('../data/train_binary.csv',header=0)
    data = raw_data.values

    imgs = data[0::,1::]
    labels = data[::,0]


    # 选取数据的2/3作为训练集, 1/3 作为测试集
    train_features, test_features, train_labels, test_labels = train_test_split(imgs, labels, test_size=0.33, random_state=23323)

    time_2 = time.time()
    print 'read data cost ',time_2 - time_1,' second','\n'

    print 'Start training'
    lr = LogisticRegression()
    lr.train(train_features, train_labels)

    time_3 = time.time()
    print 'training cost ',time_3 - time_2,' second','\n'

    print 'Start predicting'
    test_predict = lr.predict(test_features)
    time_4 = time.time()
    print 'predicting cost ',time_4 - time_3,' second','\n'

    score = accuracy_score(test_labels,test_predict)
    print "The accruacy socre is ", score

参考

本文为吴恩达深度学习笔记,网易云课堂有他的正版免费课程。
[1]: https://mooc.study.163.com/smartSpec/detail/1001319001.htm
[2]: https://mooc.study.163.com/learn/2001281002?tid=2403023003&trace_c_p_k2=a648feca4e7447bea1f676540f337e6c#/learn/content?type=detail&id=2403362487
[3]: https://github.com/WenDesi/lihang_book_algorithm

### 回答1: 逻辑斯谛回归logistic regression)是一种用于分类问题的统计学习方法,属于监督学习中的一种。它的基本思想是通过建立模型去学习不同特征之间的关系,然后使用这个模型去对未知数据进行分类。逻辑斯谛回归是一种线性模型,可用于进行二分类或多分类问题。在统计学习方面,逻辑斯谛回归是一种经典的机器学习方法。 ### 回答2: 逻辑斯谛回归是一种用于二分类问题的机器学习算法。其基本思想是将输入变量与一个sigmoid函数相乘,从而得到该分类的概率值。这个sigmoid函数将实数映射到[0,1]区间内,当概率趋近于0时,函数取到0,概率趋近于1时,函数取到1,当输入为0时,函数取到0.5。这个函数的形式为: $$\sigma(z)=\frac{1}{1+e^{-z}}=\frac{e^z}{1+e^z}$$ 其中z为线性回归模型的输出。逻辑斯谛回归通过最大似然估计来确定模型参数,目标是最大化似然函数。似然函数的形式为: $$L(w)=\prod_{i=1}^N[y_iP(y_i=1|x_i,w)+(1-y_i)P(y_i=0|x_i,w)]$$ 其中N为样本数,$y_i\in\{0,1\}$为样本i的类别,$y_i=1$表示正例,$y_i=0$表示反例。$P(y_i=1|x_i,w)$和$P(y_i=0|x_i,w)$分别表示当输入变量为$x_i$时,样本i的正例概率和反例概率。使用log函数对似然函数取负对数,然后对参数w求偏导,得到的结果为: $$\nabla L(w)=\sum_{i=1}^N[y_i-\sigma(w^Tx_i)]x_i$$ 使用梯度下降法来更新参数,得到迭代更新公式为: $$w^{(t+1)}=w^{(t)}+\eta\nabla L(w^{(t)})$$ 其中$\eta$为学习率,$w^{(t)}$表示t时刻的参数值。 逻辑斯谛回归可以扩展到多分类问题,称为softmax回归,也可以应用于不同的领域,例如医学诊断、金融风险评估等。 ### 回答3: 逻辑斯谛回归Logistic Regression)是一种用于处理二分类问题的统计机器学习算法,其思想来源于逻辑学。在《统计学习方法》一书中,逻辑斯谛回归是目标函数为对数似然函数,利用梯度下降法或牛顿法估计参数的一类判别模型。 逻辑斯谛回归的模型可以表示为$$h_{\boldsymbol{w}}(\boldsymbol{x})=\sigma(\boldsymbol{w}^{\rm T} \boldsymbol{x})$$其中,$h_{\boldsymbol{w}}(\boldsymbol{x})\in [0,1]$ 表示 $\boldsymbol{x}$ 属于正类的概率,$\sigma(z)=\dfrac{1}{1+\mathrm{e}^{-z}}$ 是 sigmoid 函数。逻辑斯谛回归的目标函数是对数似然函数$$L(\boldsymbol{w})=\sum_{i=1}^{N}[y_i \log h_{\boldsymbol{w}}(\boldsymbol{x_i})+(1-y_i)\log(1-h_{\boldsymbol{w}}(\boldsymbol{x_i}))]$$其中,$N$ 是样本数量,$y_i\in\{0,1\}$ 是样本 $\boldsymbol{x_i}$ 的真实标记。对数似然函数一般通过梯度下降法或牛顿法来求得最优参数 $\boldsymbol{w}$。梯度下降法的更新公式是$$\boldsymbol{w} \leftarrow \boldsymbol{w}+\alpha \sum_{i=1}^{N}(y_i-h_{\boldsymbol{w}}(\boldsymbol{x_i}))\boldsymbol{x_i}$$其中,$\alpha$ 是学习率,$\boldsymbol{w}$ 初始化为 0 或其它随机值,重复进行上述更新直到收敛。牛顿法是一种二阶优化方法,其参数更新公式是$$\boldsymbol{w} \leftarrow \boldsymbol{w}-\boldsymbol{H}^{-1}\nabla_{\boldsymbol{w}}L(\boldsymbol{w})$$其中,$\boldsymbol{H}$ 是 Hessian 矩阵。牛顿法比梯度下降法收敛速度更快,但计算量更大。 逻辑斯谛回归的优点是模型参数较少,计算速度较快,且可以得到样本属于正类的概率。缺点是对异常值比较敏感,对特征之间的相关性比较敏感,容易出现过拟合。在实际应用中,可以通过添加正则化项或使用 L1、L2 正则化等方式来避免过拟合。 总之,逻辑斯谛回归是一种用于处理二分类问题的有效算法,可以应用于回归和分类问题。它的思想简单,实现容易,是初学者入门的理想算法之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值