十六、机器学习进阶知识:线性回归与逻辑回归算法

news2024/12/22 20:35:32

文章目录

  • 1、线性回归
    • 1.1 一元线性回归及实例
    • 1.2 多元线性回归及实例
  • 2、逻辑回归
    • 2.1 逻辑回归与线性回归的区别
    • 2.2 逻辑函数
    • 2.3 逻辑回归的概念
    • 2.4 损失函数及参数的确定
    • 2.6 逻辑回归实例

1、线性回归

回归分析(Regression Analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,属于监督学习方法。回归分析的方法有很多种,按照变量的个数,可以分为一元回归分析和多元回归分析;按照自变量和因变量之间的关系,可以分为线性回归分析和非线性回归分析。
线性回归的自变量和因变量之间是线性关系,可以采用线性预测函数进行建模。利用回归分析来确定多个变量的依赖关系的方程称为回归方程。如果回归方程所呈现的图形为一条直线,则称为线性回归方程。线性回归(Linear Regression)算法的核心是线性回归方程,通过在输入数据和输出数据之间建立一种直线的相关关系,完成预测的任务,即将输入数据乘以一些常量,经过基本处理就可以得到输出数据。线性回归方程的参数可以有一个或多个,经常用于实际的预测问题,如股票走势预测、商品价格预测等。
由于线性回归能够使用一条直线来描述数据之间的关系,因此假设输入的数据X=(x1,x2,x3,…,xn),则回归方程可以归纳如下:
在这里插入图片描述

即y和x之间的关系可以使用一条直线进行表示。

1.1 一元线性回归及实例

在上述回归方程中,若X只有一个数值,回归方程可归纳为y=wX+b,则此时该回归方程为一元线性回归,对于一元线性回归,只需要通过对数据进行拟合,求得参数w和b的取值即可。
实例:
现有某公司出品的电影数据,包括成本和票房两项,单位为千万元,目前有一部电影成本耗费两亿,要求使用一元线性回归预测其票房金额。

电影编号成本票房
169
2912
31229
41435
51659

sklearn中的linear_model模块提供了LinearRegression函数用于实现线性回归。
语法格式:

sklearn.linear_model.LinearRegression(fit_intercept = True,normalize = False,copy_x=True,n_jobs=None)

其中fit_intercept表示是否会计算截距,normalize表示在回归前是否进行归一化处理,copy_x表示是否要复制一份数据进行处理,n_jobs为线程数。
对象属性中coef_表示线性回归问题的估计系数,intercept_表示回归方程的截距。

from sklearn import linear_model
import matplotlib.pyplot as plt
#定义函数用于绘制图像
def drawplt():
    plt.figure()
    plt.title('Cost and Income Of a Film') #标题
    plt.xlabel('Cost') #横坐标标题
    plt.ylabel('Income') #纵坐标标题
    plt.axis([0, 25, 0, 60]) #x轴、y轴范围
    plt.grid(True) #显示网格线

X = [[6], [9], [12], [14], [16]]
y = [[9], [12], [29], [35], [59]]
model = linear_model.LinearRegression() 
model.fit(X, y) #模型训练
a = model.predict([[20]])
w = model.coef_
b = model.intercept_
print("投资两亿的电影预计票房收入为:{:.2f}千万元".format(model.predict([[20]]) [0][0]))
print("回归模型的系数是:",w)
print("回归模型的截距是:",b)  
print("最佳拟合线: y = ",int(b),"+", int(w),"× x" )
drawplt()
#绘制点
plt.plot(X, y, '.')
#绘制直线
plt.plot([0,25],[b,25*w+b])
plt.show()

在这里插入图片描述

在这里插入图片描述

1.2 多元线性回归及实例

如果在回归方程中,X是一组数值X=(x1,x2,x3,…,xn),那么该回归方程为多元线性回归,多元线性回归方程的求解相较于一元线性回归更加复杂,经常使用最小二乘法等数学方法进行拟合。最小二乘法是一种数学优化方法,也称最小平方法,它通过最小化误差的平方和寻找最佳结果。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
实例:
现有某公司出品的电影数据,包括成本、广告费用和以及票房三项,单位为千万元,目前有一部电影成本耗费一亿,推广费为三千万,要求使用多元线性回归预测其票房金额。

电影编号成本广告费用票房
1619
29312
312229
414335
516459
import numpy as np
from sklearn import datasets,linear_model

x = np.array([[6,1,9],[9,3,12],[12,2,29],
              [14,3,35],[16,4,59]])
X = x[:,:-1]
Y = x[:,-1]
print('X:',X)
print('Y:',Y)

# 训练数据
regr = linear_model.LinearRegression()
regr.fit(X,Y)
print('系数(w1,w2)为:',regr.coef_)
print('截距(b)为:',regr.intercept_)
# 预测
y_predict = regr.predict(np.array([[10,3]]))
print('投资一亿,推广3千万的电影票房预测为:',y_predict,'千万')

在这里插入图片描述

2、逻辑回归

对于简单的线性相关问题,可以使用线性回归,将数据点拟合成一条直线。线性回归的假设是所有的数据都精确或粗略地分布在这条直线上,因此可以完成基本的预测任条。
有时人们只想知道待判定的数据点位于直线的上边还是下边、左侧还是右侧。以便得知当前数据的归属或类型。针对这项任务,就需要使用逻辑回归这种方式来实现。

2.1 逻辑回归与线性回归的区别

线性回归输出的是一个值,且为连续的,而逻辑回归则将值映射到集合(0,1)中。例如,要通过一个人信用卡欠款的数额预测一个人的还款时长,在预测模型中还款时长的值是连续的,因此,最后的预测结果是一个数值,这类问题就是线性回归能解决的问题。而如果要通过信用卡欠款数额预测还款是按期还是逾期,在预测模型中,结果应该是某种可能性(类别),预测对象属于哪个类别,这样的问题就是逻辑回归能解决的分类问题。所以逻辑回归也叫逻辑分类。也就是说,线性回归经常用来预测一个具体数值,如预测房价、未来的天气情况等。逻辑回归经常用于将事物归类,例如,判断一幅X光片上的肿瘤是良性的还是恶性的,判断一个动物是猫还是狗等。

2.2 逻辑函数

逻辑函数(Logistic)是逻辑回归中重要的一个函数概念,其中的经典函数为Sigmod函数,逻辑函数起源于逻辑模型,该模型也称为Verhulst模型或逻辑增长曲线,是一个早期的人口分布研究模型,由Pierre-Francois Verhulst 在1845年提出,描述系统中人口的增长率和当下的人日数目成正比,还受到系统容量的限制。Logistic 模型是由微分方程形式描述的,求解后可以得到 Logistic 函数。Logistic函数的简单形式为:
在这里插入图片描述
其中x的取值范围为正无穷到负无穷,值域为(0,1)。
由于由于Logistic函数的图形外形看起来像S形,因此Logistic函数经常被称为Sigmoid函数(S形函数)。在机器学习中,人们经常把Sigmoid函数和Logistic函数看作同一个函数的两个名称。Sigmoid逻辑函数的图形如下所示。
在这里插入图片描述
由上图可以看出,当x趋于正无穷时,函数值趋近于1;当x趋向负无穷时,函数值趋近于0。当x等于0时,y等于0.5,可以使用x等于0处的轴将函数划分,右边大于0.5的判断为1,左边小于0.5的判断为0,就可以完成二分类的判断。

2.3 逻辑回归的概念

逻辑回归(Logistics Regression)是根据现有数据对分类边界线建立回归公式,以此进行分类。逻辑回归在线性回归模型的基础上,通过引入Sigmoid函数,将线性回归的输出值映射到(0,1)。接下来使用阈值将结果转换成0或1,就能够完成两类问题的预测。
首先已知线性回归表达式如下:
在这里插入图片描述
将y代入Sigmod函数公式:
在这里插入图片描述
可以计算得到逻辑回归方程:
在这里插入图片描述

2.4 损失函数及参数的确定

损失是真实模型与假设模型之间差异的度量。机器学习或者统计机器学习常见的损失函数有0-1损失函数、平方损失函数、绝对值损失函数和对数损失函数,逻辑回归中采用的则是对数损失函数。如果损失函数越小,表示模型越好。
对数损失函数也称为对数似然损失函数,是在概率估计上定义的,可用于评估分类器的概率输出,对数损失函数形式如下。
在这里插入图片描述
其中P(Y|X)表示被正确分类的概率,损失函数则是对其进行对数取反。概率计算中样本所属类别Y由逻辑回归函数h(y)计算获得,真实样本类别为0或1,假设待确定的参数如下:
在这里插入图片描述
可以得到基于对数损失函数的逻辑回归损失函数如下:
在这里插入图片描述
将上述表达式进行合并,则可以将单个样本的损失函数描述为:
在这里插入图片描述
在这个式子中,当y_i取值为1时,公式取前半段,当y_i取值为0时,公式取后半段,正好将其分理出上述的两个表达式。
在实际计算时,可以选用各个样本分布计算损失值再取平均值,也可以使用全部样本的综合作为损失值。
获得损失函数后,接下来的关键步骤是进行参数的确定,对于逻辑回归来说,较好的参数获取方法是梯度下降法,梯度下降法的思路主要是相对参数赋初值,然后通过改变参数的值,使得参数按照梯度下降的方向逐渐减少,利用这一方式,朝着偏导数的反方向,每次前进一小步,使得损失函数达到预先设置的较小值或满足停止条件时停止此行为。
梯度下降的计算思路具体可以参考神经网络梯度下降计算过程:
十三、机器学习进阶知识:神经网络之反向传播算法(梯度、误差反向传播算法BP)

2.6 逻辑回归实例

逻辑回归的实现主要有两种方式,第一种是使用sklearn库来实现,第二种是采用Python自编写的方式来实现。
sklearn实现逻辑回归鸢尾花分类预测实例
在sklearn中,有三个逻辑回归相关的模块,分别是分别是LogisticRegression、LogisticRegressionCV和 LogisticRegression_path。三者的区别在于:LogisticRegression 需要手动指定正则化系数;LogisticRegressionCV 使用了交叉验证选择正则化系数;LogisticRegression_path只能用来拟合数据,不能用于预测。所以通常使用的是前两个模块 LogisticRegression和LogisticRegressionCV,这两个模块中相关参数的意义也是相同的。
LogisticRegression的语法格式如下:

sklearn.linear_model.LogisticRegression(penalty='l2',dual=False,tol=0.0001,C=1.0,fit_intercept=True,intercept_scaling=1,class_weight=None,random_state=None,solver='warn',max_iter=100,multi_class='warn',verbose=0,warm_start=False,n_jobs=None,l1_ratio=None)

主要参数如下:
tol:收敛阈值。
C:正则化系数。
random_state:整型,伪随机数生成器的种子,用于在混淆数据时使用。
solver:优化算法。取值“liblinear”代表坐标轴下降优化法,“lbfgs”和“newton-cg”分别表示两种拟牛顿优化方法,“sag”是随机梯度下降优化法。
max_iter:int,可选,默认值为100,是求解器收敛的最大迭代次数。
主要属性如下。
classes_:数组型,表示类别,是分类器已知的类的列表。
coef_:数组型,表示特征系数,是决策函数中的特征系数。
intercept_:数组型,表示决策用的截距。

以sklearn库中可导入的鸢尾花数据集为例,对其使用逻辑回归进行分类预测。

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics

X, y = load_iris(return_X_y=True)  #数据集的导入
#将数据集分割成训练集、测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)  
#使用逻辑回归对训练数据集中的样本特征以及类别标签进行训练
clf=LogisticRegression(random_state=0,solver='lbfgs',multi_class='multinomial').fit(X_train, y_train)
#输出决策函数中的特征系数以及截距
print('coef:\n',clf.coef_)
print('intercept:\n',clf.intercept_ )
#对训练集中的前两个样本进行分类预测
print('predict first two:\n',clf.predict(X_train[:2, :]))
#返回分类器性能决定系数R^2
print('classification score:\n',clf.score(X_train, y_train))
#对测试集样本特征进行类别分类
predict_y = clf.predict(X_test)
#输出分类的性能评估结果
print('classfication report:\n ',metrics.classification_report (y_test,predict_y))

在这里插入图片描述
可以看出,在计算结果中,分类器的性能评价结果为0.97,精确率、召回率和f1指数结果均为0.93,分类性能较好。
Python自编写逻辑回归实现信用卡逾期情况类别预测
某银行搜集了用户贷款、收入和信用卡是否逾期三项信息,保存在数据集credit.csv中,使用用户贷款以及收入作为特征数据,是否逾期作为类别,构建一个能够预测信用卡是否逾期的逻辑回归模型,参数采用梯度下降法进行获取,使用绘图的方式记录损失函数的变化情况。(使用Jupyter Notebook编写)

#1、加载数据集
import pandas as pd
df = pd.read_csv("credit.csv", header=0) # 加载数据集
df.head()  #查看前5行数据
#2、绘制数据的散点图,查看数据分布情况
from matplotlib import pyplot as plt
plt.figure(figsize=(10, 6))
map_size = {0: 20, 1: 100}
size = list(map(lambda x: map_size[x], df['overdue']))
plt.scatter(df['debt'],df['income'], s=size,c=df['overdue'],marker='v')

在这里插入图片描述
在这里插入图片描述

#2、模型训练
#定义Sigmoid函数
def sigmoid(z):
    sigmoid = 1 / (1 + np.exp(-z))
    return sigmoid
#定义对数损失函数
def loss(h, y):
    loss = (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()  #取均值
    return loss
#定义梯度下降函数
def gradient(X, h, y):
    gradient = np.dot(X.T, (h - y)) / y.shape[0]
    return gradient
# 逻辑回归过程
def Logistic_Regression(x, y, lr, num_iter):
    intercept = np.ones((x.shape[0], 1))  # 初始化截距为 1
    x = np.concatenate((intercept, x), axis=1)
    w = np.zeros(x.shape[1])  # 初始化参数为 0

    for i in range(num_iter):  # 梯度下降迭代
        z = np.dot(x, w)     # 线性函数
        h = sigmoid(z)      # sigmoid 函数
        g = gradient(x, h, y)  # 计算梯度
        w -= lr * g     # 通过学习率 lr 计算步长并执行梯度下降
        z = np.dot(x, w)     # 更新参数到原线性函数中
        h = sigmoid(z)      # 计算 sigmoid 函数值
        l = loss(h, y)        # 计算损失函数值
    return l, w        # 返回迭代后的梯度和参数

#初始化模型,进行训练
import numpy as np
x = df[['debt','income']].values
y = df['overdue'].values
lr = 0.001                 # 学习率
num_iter = 10000          # 迭代次数
# 模型训练
L = Logistic_Regression(x, y, lr, num_iter)
L

在这里插入图片描述
上述过程已经将模型训练完成,逻辑回归模型参数已确定,之后显示模型的分类线并测试模型的性能。

#3、绘制模型分类线
plt.figure(figsize=(10, 6))
map_size = {0: 20, 1: 100}
size = list(map(lambda x: map_size[x], df['overdue']))
plt.scatter(df['debt'],df['income'], s=size,c=df['overdue'],marker='v')
x1_min, x1_max = df['debt'].min(), df['debt'].max(),
x2_min, x2_max = df['income'].min(), df['income'].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = (np.dot(grid, np.array([L[1][1:3]]).T) + L[1][0]).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, levels=[0], linewidths=1, colors='red');

在这里插入图片描述

#4、绘制损失函数变化曲线
def Logistic_Regression(x, y, lr, num_iter):
    intercept = np.ones((x.shape[0], 1))  # 初始化截距为 1
    x = np.concatenate((intercept, x), axis=1)
    w = np.zeros(x.shape[1])           # 初始化参数为 1

    l_list = []                 # 保存损失函数值
    for i in range(num_iter):    # 梯度下降迭代
        z = np.dot(x, w)       # 线性函数
        h = sigmoid(z)        # sigmoid 函数

        g = gradient(x, h, y)    # 计算梯度
        w -= lr * g      # 通过学习率 lr 计算步长并执行梯度下降

        z = np.dot(x, w)  # 更新参数到原线性函数中
        h = sigmoid(z)   # 计算 sigmoid 函数值

        l = loss(h, y)     # 计算损失函数值
        l_list.append(l)
    return l_list

lr = 0.01          # 学习率
num_iter = 30000  # 迭代次数
l_y = Logistic_Regression(x, y, lr, num_iter)  # 训练

# 绘图
plt.figure(figsize=(10, 6))
plt.plot([i for i in range(len(l_y))], l_y)
plt.xlabel("Number of iterations")
plt.ylabel("Loss function")

在这里插入图片描述

信用卡逾期预测实例数据集、python文件以及用于Jupyter Notebook的ipynb文件下载链接(包含详细代码解释)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习 NVIDIA Omniverse 的最基础概念

无用的前言 近两年关于 Omniverse 的宣传一直很多,可我一直没去了解,连它是个啥都不知道。最近正好有契机需要了解它,于是我今天抽时间看了些它的官方介绍,并按照自己的理解梳理在这里。 官方资料索引 Omniverse 官网主页&…

HashMap常见面试问题

简述HashMap原理? HashMap基于数组加链表的方式来实现,数组下标通过hash值来计算,当下表冲突时,就会进行遍历链表,当链表长度大于8的时候会转化为红黑树。 HashMap的put过程? put的第一步是计算hash值&a…

自定义异步任务管理器和线程

import com.lancoo.common.utils.Threads; import com.lancoo.common.utils.spring.SpringUtils;import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** 异步任务管理器* * author lancoo*/ public c…

apisix下自定义 Nginx 配置

apisix下自定义 Nginx 配置 在apisix配置文件/conf/config.yaml中添加nginx配置。生成的nginx.conf配置文件如下:说明: APISIX 会通过 apisix/cli/ngx_tpl.lua 这个模板和 conf/config-default.yaml 加 conf/config.yaml 的配置生成 Nginx 配置文件。 在…

如果将视频转化为gif格式图

1.选择视频转换GIF: 2.添加视频文件: 3.点击“开始”: 4.选择设置,将格式选择为1080P更加清晰: 5.输出后的效果图:

传统渠道与互联网新零售较量中:2023年之后电商如何引流裂变?

传统渠道与互联网新零售较量中:2023年之后电商如何引流裂变? 互联网新零售是指通过互联网技术和数据驱动,打造以消费者为中心、以线上线下融合为特点的全新零售模式,也是近年来电商行业转型升级的必然趋势。目前普通市场竞争激烈…

图解python | 元组

1.Python元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号,列表使用方括号。 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。 python 复制代码 tup1 (ByteDance, ShowMeAI, 199…

运动重定向:C-3PO-v1

TeachMe: Three-phase learning framework for robotic motion imitation based on interactive teaching and reinforcement learning解析 摘要1. 简介2. 相关工作2.1 基于编码器-解码器的架构2.2 强化学习 3. 方法3.1 问题表述3.2 NTU-DB3.3 阶段1: 编码器和解码器3.4 阶段2:…

9.静态路由

静态路由 中小型网络都会用到,防火墙核心交换机用的很多,一般是用在出口 路由表:路由器用来转发数据包唯一的依据 NextHop下一跳 Static静态路由需要手动设置 ip route-static 目标网段 掩码 下一跳例如:ip route-static 192…

SD-WAN VS MPLS :怎么选择最合适的网络连接方案?

随着企业网络需求的不断增长,网络连接方案也变得更加多样化。在这种情况下,SD-WAN和MPLS成为了企业考虑的两种主要选择。本文将就SD-WAN和MPLS这两种网络连接方案进行比较,深入探讨它们在成本、体验、部署周期和运维等方面的差异。 1、成本投…

LV.13 D2 开发板启动流程 学习笔记

一、开发板启动过程 EMMC:相当于电脑的外存,断电不丢失 开发板上电后首先运行SOC内部iROM中固化的代码(BL0),这段代码先对基本的软硬件环境(时钟等...)进行初始化,然后再检测拨码开关位置获取启动方式,然后再将对应存储…

vs vue项目目录说明

vue项目目录结构说明 视图: 主要描述src和依赖配置 src下 assets:存放需要用到的静态资源文件的地方 如css.js.img.view等 commponents:存放一些通用的组件;例:在开发当中如果有需要抽出来的公用模块,可以封装为通用组件&#xf…

AI 绘画 | Stable Diffusion 真实人物动漫二次元化

前言 如何让一张真实人物变成动漫二次元风格的图片?Stable Diffusion WebUI加上contolNet扩展插件帮你快速实现。快来使用AI绘画打开异世界的大门吧!!! 真人动漫化 选择大模型 首先选择一个二次元风格人物画风的大模型(我这里选择是SD1.5通用模型anything-v5-PrtRE.sa…

【数字经济】你必须知道的SABOE数字化转型

【文末送书】今天推荐一本企业管理类前沿书籍《企业架构驱动数字化转型:以架构为中心的端到端转型方法论》 目录 01传统企业数字化转型面临诸多挑战02SABOE数字化转型五环法为企业转型破除迷雾03文末送书 01传统企业数字化转型面临诸多挑战 即将过去的2023年&#…

赛邮云全新改版-SUBMAIL.v4,快来看都有哪些变化吧!

赛邮云全新改版-SUBMAIL.v4,快来看都有哪些变化吧! [![](https://img-blog.csdnimg.cn/img_convert/b57c34f9d1732e78d85a73d5f0ec5669.png)](https://libraries.mysubmail.com/public/745bbd47ee09e5810cebad1688282e65/images/a8901d3890dd27fae0745ec…

可以组成网络的服务器 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 在一个机房中,服务器的位置标识在n*m的整数矩阵网格中,1表示单元格上有服务器,0表示没有。如果两台服务器位于同一行或者同一列…

git入门教程+常用命令

Git入门教程 本文章主要参照视频教程:https://www.bilibili.com/video/BV1FE411P7B3/?spm_id_from333.337.search-card.all.click&vd_source06caf161b187fb3f4c039bc15e238fea 为什么要使用GIT 版本控制是项目、文档迭代的必然要求,所以需要使用…

traj_dist 笔记:Cython部分(cydist)

1 basic_euclidean.pyx 1.1 cimport 部分 from libc.math cimport sqrt from libc.math cimport fmin #使用 cimport 从 C 的标准库 libc 中导入数学函数 sqrt(平方根)和 fmin(两个浮点数的最小值)cimport numpy as np导入 NumP…

张正友相机标定法原理与实现

张正友相机标定法是张正友教授1998年提出的单平面棋盘格的相机标定方法。传统标定法的标定板是需要三维的,需要非常精确,这很难制作,而张正友教授提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可…

Qt开发 之 记一次安装 Qt5.12.12 安卓环境的失败案例

文章目录 1、安装Qt2、安卓开发的组合套件2.1、CSDN地址2.2、官网地址2.3、发现老方法不适用了 3、尝试用新方法解决3.1、先安装JDK,搞定JDK环境变量3.1.1、安装jdk3.1.2、确定jdk安装路径3.1.3、打开系统环境变量配置3.1.4、配置系统环境变量3.1.5、验证JDK环境变量…