逻辑回归(Logistic回归又名对数几率回归)原理及python代码实现

这篇具有很好参考价值的文章主要介绍了逻辑回归(Logistic回归又名对数几率回归)原理及python代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 公式推导

        为了实现Logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和代人Sigmoid函数中,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分人1类 ,小于0.5即被归人0类 ,所以Logistic回归也可以被看成是一种概率估计。逻辑回归的本质还是线性回归,母体函数是线性回归函数,只不过将结果值代入Sigmoid函数转换为0到1之间的数值用来完成分类。

线性回归方程如下所示:

                                                                        (1)

为了将预测结果值转换到0~1之间的值,将代入Sigmoid函数中:

python对数几率回归,机器学习,逻辑回归,回归,python                                                                        (2)

将式(1)代入到式(2)中,得到下式概率公式(3):

python对数几率回归,机器学习,逻辑回归,回归,python                                                                       (3)

        构造如下损失函数:

                                                (4)

        设  是当  时的概率,那么肯定希望概率越大越好,如果偏离的100%就给一定的惩罚,如果概率为0 ,则让其损失函数无限大。

        反之,当 时,让其 的概率最大化,如果偏离100%就给一定的惩罚,如果概率为1,则让其损失无限大。

        上式分段函数(4)可转换为下式(5):

                                (5)

        上式便是经典的交叉熵损失函数,又称对数损失函数,此函数可衡量两个分布之间的举例,一般用于分类模型的损失函数。

2. 决策边界

        当概率大于等于0.5时,我们认为,反之小于0.5时,认为,即如下式所示:

                                        (6)

即决策边界为:

                                                                        (7)

        在实际分类问题中,决策边界可能会是一个弯曲的曲线或平面,但以上表达式为线性回归方程,注定最后的决策边界将会是一条直线或一个平面,无法对非线性关系的样本做到精准的分类。

所以为了更好的解决这类非线性的分类问题,我们可以引入多项式回归方程,通过对特征向量增加阶数实现非线性关系的数据集分类,具体实现方法可参考笔者另一篇博文:

多项式回归(非线性回归)的python代码实现_南山十一少的博客-CSDN博客

3. 多分类问题

        逻辑回归本身只能处理二分类问题,但通过巧妙的多次运用逻辑回归,也能完成多分类任务。(sklearn封装的逻辑回归算法可通过设置超参数处理多分类任务,使用方法见本文 5.2)

方法一:OVR法(One vs Rest)

假定N分类问题,首先将其中一个类别和其他类别作为一次二分类,然后从N类别中循环执行N次,分别得到每个样本N个类别的概率,挑出概率最高的类别作为次样本的类别分类。

方法二:OVO法(One vs One)

假定N分类,首先拿出两个类别进行二次分类任务,然后从N类别中循环挑选出两个类别进行分类计算概率,共计算次,得到每个样本N个类别的概率,挑出概率最高的类别作为次样本的类别分类。

4. 自制代码实现

首先编写Sigmoid函数、损失函数、损失函数的偏导,然后根据批量梯度下降的方法不断迭代计算参数,具体编码如下:

注意:

1. 在编写Sigmoid函数时,因为代入的-t = X_b.dot(theta) 比较大,通过指数函数np.exp(-t)后容易导致数据溢出,建议更换为另一个公式代替:return .5 * (1 + np.tanh(.5 * t)),否则会有如下报错:

RuntimeWarning: overflow encountered in exp
  return 1. / (1. + np.exp(-t))

2. 计算损失函数时,由于分母过大,容易导致精度不够,建议增加浮点数的精度,在y_hat后面增加1e-6,否则会有如下报错

RuntimeWarning: divide by zero encountered in log
  return - np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat)) / len(y)

RuntimeWarning: invalid value encountered in multiply
  return - np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat)) / len(y)

RuntimeWarning: invalid value encountered in scalar subtract
  if abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon:

# 自编逻辑回归函数
def MyselfLogisticRegression(X_train, y_train, eta=0.01, n_iters=1e4):
    def sigmoid(t):
        # return 1. / (1. + np.exp(-t))
        return .5 * (1 + np.tanh(.5 * t))

    def J(theta, X_b, y):
        y_hat = sigmoid(X_b.dot(theta))
        try:
            return - np.sum(y * np.log(y_hat + 1e-6) + (1 - y) * np.log(1 - y_hat + 1e-6)) / len(y)
        except:
            return float('inf')

    def dJ(theta, X_b, y):
        return X_b.T.dot(sigmoid(X_b.dot(theta)) - y) / len(y)

    def gradient_descent(X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8):

        theta = initial_theta
        cur_iter = 0

        while cur_iter < n_iters:
            gradient = dJ(theta, X_b, y)
            last_theta = theta
            theta = theta - eta * gradient
            if abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon:
                break

            cur_iter += 1

        return theta

    X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
    # initial_theta = np.zeros(X_b.shape[1])
    initial_theta = np.random.randn(X_b.shape[1])
    theta = gradient_descent(X_b, y_train, initial_theta, eta, n_iters)

    return theta

5 调用sklearn的逻辑回归函数

5.1 模型正则化超参数使用

在sklearn中封装的逻辑函数中,自动封装了正则化,可以通过超参数进行调节,其正则化后的损失函数如下:

python对数几率回归,机器学习,逻辑回归,回归,python

如果读者对正则化感兴趣,可以参考笔者另一篇博文:

模型正则化在多项式回归中的运用:Ridge回归(岭回归)、LASSO回归、弹性网络回归的原理及python代码实现_南山十一少的博客-CSDN博客

C:正则化强度权重,大于0的浮点数,不填写默认1.0。C越小,正则化的效力越强,参数会被压缩得越小。

penalty:正则化方式, 时,损失函数中的为系数值绝对值和,时,损失函数的为系数平方和

solver:优化算法选择参数,参数为liblinear时,使用了坐标轴下降法迭代损失函数。

具体实现代码如下:

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.model_selection import train_test_split
import numpy as np

if __name__ == "__main__":
    # 构造带随机误差的呈非线性关系的数据集
    np.random.seed(666)
    X = np.random.normal(0, 1, size=(200, 2))
    y = np.array((X[:, 0] ** 2 + X[:, 1]) < 1.5, dtype='int')
    for _ in range(20):
        y[np.random.randint(200)] = 1
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

    # 预处理数据进行非线性化多项式组合
    poly = PolynomialFeatures(degree=20)
    poly.fit(X_train)
    X_train = poly.transform(X_train)
    X_test = poly.transform(X_test)

    # 调用sklearn逻辑回归函数
    poly_log_reg = LogisticRegression(C=0.2,solver='liblinear',penalty="l1")
    poly_log_reg.fit(X_train, y_train)
    train_score = poly_log_reg.score(X_train, y_train)
    test_score = poly_log_reg.score(X_test, y_test)
    print(
        "poly_log_reg.intercept_ = {}, poly_log_reg.coef_ = {}".format(poly_log_reg.intercept_[0], poly_log_reg.coef_))
    print("PolynomialLogisticRegression train_score = {}, test_score = {}".format(train_score, test_score))

    # 调用自编逻辑回归函数对比
    theta = MyselfLogisticRegression(X_train, y_train)
    poly_log_reg.intercept_[0] = theta[0]
    poly_log_reg.coef_[0] = theta[1:]
    print("poly_log_reg.intercept_ = {}, poly_log_reg.coef_ = {}".format(poly_log_reg.intercept_, poly_log_reg.coef_))
    train_score = poly_log_reg.score(X_train, y_train)
    test_score = poly_log_reg.score(X_test, y_test)
    print("MyselfLogisticRegression train_score = {}, test_score = {}".format(train_score, test_score))

5.2 多分类超参数使用

如果要进行多分类任务,同样sklearn也封装了OVR和OVO的方法,只需通过超参数设置便能使用。

multi_class:多分类模式

ovr:,一对剩余。有K类,则训练K个模型,每个模型把第i类当一类,其余当一类。最后选择预测概率最高的一类作为预测类别。
multinomial:多项模式,OVR模式,两两分类,最后选择预测概率最高的一类作为预测类,值得注意的是,如果选择次模式,solver超参数需要选择newton-cg

代码如下:

if __name__ == "__main__":
    # 鸢尾花为例调用sklearn逻辑回归函数进行多分类试验
    iris = datasets.load_iris()
    X = iris.data
    y = iris.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
    log_reg = LogisticRegression(multi_class='multinomial',solver='newton-cg')
    log_reg.fit(X_train, y_train)
    score = log_reg.score(X_test, y_test)
    y_predict = log_reg.predict(X_test)
    print("multi_class predict y_predict = {}.".format(y_predict))
    print("multi_class LogisticRegression score = {}".format(score))

6 结论

        本文通过讲解逻辑回归(对数几率回归)从回归模型到分类模型的演变过程以及损失函数的推导过程,然后利用梯度下降编写逻辑回归方法,最后通过调用sklearn封装的逻辑回归方法,分别演示了模型正则化和多分类的超参数使用。文章来源地址https://www.toymoban.com/news/detail-800804.html

到了这里,关于逻辑回归(Logistic回归又名对数几率回归)原理及python代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现逻辑回归(Logistic Regression)

    💥 项目专栏:【Python实现经典机器学习算法】附代码+原理介绍 👑 最近粉丝群中很多朋友私信咨询一些决策树、逻辑回归等机器学习相关的编程问题,为了能更清晰的说明,所以建立了本专栏 专门记录基于原生Python实现一些入门必学的机器学习算法 ,帮助广大零基础用户

    2024年02月01日
    浏览(35)
  • 机器学习实战:Python基于Logistic逻辑回归进行分类预测(一)

    1.1 Logistic回归的介绍 逻辑回归( Logistic regression ,简称 LR )是一种经典的二分类算法,它将输入特征与一个sigmoid函数进行线性组合,从而预测输出标签的概率。该算法常被用于预测离散的二元结果,例如是/否、真/假等。 优点: 实现简单。Logistic回归的参数可以用极大似然

    2024年02月08日
    浏览(39)
  • 数据分析之Logistic回归分析(二元逻辑回归、多元有序逻辑回归、多元无序逻辑回归)

    在研究X对于Y的影响时: 如果Y为定量数据,那么使用多元线性回归分析; 如果Y为定类数据,那么使用Logistic回归分析。 结合实际情况,可以将Logistic回归分析分为3类: 二元Logistic回归分析 多元有序Logistic回归分析 多元无序Logistic回归分析 Logistic回归分析用于研究X对Y的影响

    2024年03月13日
    浏览(65)
  • Logistic回归(逻辑回归)实战案例分析

    Lgistic回归也叫逻辑回归,是广义线性回归的一种,通常用于解决二分类问题。 表达式如下: 经过logit变换,则可以写成广义线性表达式 通常做回归是用其广义线性表达式,且logistic回归的结果概率表现为S型曲线,一般以小于0.5的样本都分类为0,大于0.5的样本都分类为1。

    2024年04月25日
    浏览(40)
  • 逻辑回归(Logistic Regression)

    在分类问题中,你要预测的变量 y是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是否是

    2024年02月09日
    浏览(35)
  • 逻辑回归Logistic

    回归 概念 假设现在有一些数据点,我们用一条直线对这些点进行拟合(这条直线称为最佳拟合直线),这个拟合的过程就叫做回归。进而可以得到对这些点的拟合直线方程。 最后结果用sigmoid函数输出 因此,为了实现 Logistic 回归分类器,我们可以在每个特征上都乘以一个回

    2024年02月09日
    浏览(35)
  • 逻辑回归(Logistic Regression)

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。   目录 一、逻辑回归简介与用途 二、逻辑回归的理论推导 1、问题描述和转化 2、初步思路:找一个线性模型来由X预测Y 3、Sigmoid函数(逻辑函数) 4、刚刚的

    2023年04月18日
    浏览(34)
  • 二元逻辑回归(logistic regression)

    目录 一,原理 二,python代码 2.1 数据集的格式 2.2 代码 三,适用条件 回归 :          假设存在一些数据点,用一条直线或者曲线或折现去拟合这些点就叫做回归。也就是找出平面点上两个轴变量之间的函数关系,或者其他坐标系下的变量间关系。一句话就是:回归就是

    2024年02月06日
    浏览(47)
  • 机器学习:逻辑回归(Logistic Regression)

    Logistic Regression. 本文目录: 逻辑回归模型 Logistic函数 交叉熵损失 梯度下降法 核逻辑回归 逻辑回归(logistic regression) 是一种二分类模型,其思想是通过引入一个函数将线性回归的输出限制在 [ 0 , 1 ] [0,1] [ 0 , 1

    2024年02月09日
    浏览(50)
  • 逻辑回归(Logistic Regression)和正则化

    案例: 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;之前我们也谈到了肿瘤分类问题的例子,区别一个肿瘤是恶性的还是良性的。 二元分类问题: 将因

    2024年01月24日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包