2.【Python】分类算法—Logistic Regression

2023-11-17

2.【Python】分类算法—Logistic Regression


前言

逻辑回归算法一般用于二分类问题,属于典型的监督学习,此算法的复杂度低容易实现。


一、Logistic Regression模型

1.线性可分和线性不可分

在介绍Logistic Regression之前,先了解线性可分和线性不可分的概念。对于分类问题,如果样本可以用线性函数进行分类,则成为线性可分,如图1.1所示;否则成为线性不可分,如图1.2所示。
图1.1 线性可分

图1.1 线性可分(图侵删)

在这里插入图片描述

图1.2 线性不可分(图侵删)

2.Logistic Regression模型

Logistic Regression属于线性分类模型,如图1.1所示的线性函数可以表示为:

Wx+b=0

其中,W为权重,b为偏置。通过对样本的训练,可以得到两个类别的数据,利用阈值函数可以将样本映射到不同类别中,最常用的阈值函数为Sigmoid函数,公式为:
在这里插入图片描述
在这里插入图片描述

(图侵删)

如图所示,是将样本映射至值域(0,1)之间,以下为python的实现过程。

import numpy as np

def sig(x):
	'''sigmoid函数
	input:x(mat):feature*w
	output:sigmoid(x)(mat):sigmoid值
	'''
	return 1.0/(1+np.exp(-x))

3.损失函数

为了求权重w和偏置b,需要先了解损失函数。
若输入值为x,输出值为y,则样本属于y的概率应该为P(y)P(1-y),表示为:
在这里插入图片描述
σ为sigmoid函数。可以使用极大似然法对W和b进行参数估计,假设有m个训练样本,则其似然函数为:
在这里插入图片描述
为了将乘法变为加法,将使用log函数进行对数求解。在Logistic Regression算法中,通常将负的log似然函数当做损失函数,因为损失函数求出的概率越小,损失越小。
在这里插入图片描述
此时需要求min l(W,b)。

二、梯度下降法

梯度下降法是寻找最优的权重W,用的最多的是基于梯度下降的优化函数。

1.梯度下降的过程

选取初始点X0

选取梯度下降的方向,选择步长,在某一时刻到达X3

若判断没有满足终止条件,则重复以上过程,直至找到最优解(最小值)。
在这里插入图片描述

(图侵删)

注意可能存在多个局部最优解得情况,全局最优解就是某一个局部最优解。

2.基于梯度下降法训练Logistic Regression模型

∇为梯度,根据梯度下降法得到权重的更新公式表示为:
在这里插入图片描述
具体过程如下:

def lr_train_bgd(feature,label,maxcycle,alpha):
	'''利用梯度下降训练LR模型
	input:feature(mat)特征
		label(mat)标签
		maxcycle(int)最大迭代次数
		alpha(float)学习率
	output:w(mat):权重
	'''
	n = np.shape(feature)[1] #特征个数
    w = np.mat(np.ones((n, 1))) #初始化权重
    i = 0
    while i <=maxcycle: #在最大迭代次数的范围内
        i += 1 #当前的迭代次数
        h = sig(feature * w) #计算sigmoid的值
        err = label - h
        if i % 100 ==0:
            print("\t---iter="+str(i)+",train error rate="+str(error_rate(h,label)))
        w = w + alpha*feature.T * err #权重修正
    return w

利用函数lr_train_bgd对损失函数进行了优化,函数输入为样本特征、标签、最大迭代次数、学习率,输出为权重,这些都需要自己定义。

在每次迭代过程中,需要计算当前的误差,定义误差函数为error_rate,以下部分应该放在定义函数lr_train_bgd之前。

def error_rate(h,label):
    '''计算当前的损失函数值
    input:h(mat):预测值
        label(mat):实际值
    output:err/m(float):错误率
    '''
    m = np.shape(h)[0]
    sum_err  = 0.0
    for i in range(m):
        if h[i,0] > 0 and (1-h[i,0]) > 0:
            sum_err -= (label[i,0] * np.log(h[i,0])+(1-label[i,0]) * np.log(1 - h[i,0])
        else:
            sum_err -= 0
    return sum_err/m

3.下降方向和步长的选择

若梯度下降<0,则最小值在minimum的右侧;若梯度下降<0,则最小值在minimum的左侧。
在这里插入图片描述

(图侵删)

左图步长过小,收敛速度较慢;右图步长过大,可能会跳过最优解,因此需要选择合适的步长。
在这里插入图片描述

(图侵删)

三、Logistic Regression实践

学习以上理论以后,接下来将进行实践,主要分为两个部分:对训练集训练模型和对测试集进行预测。

1.利用训练样本训练Logistic Regression模型

将训练文件命名为lr_train。
首先,导入训练样本数据,需要定义load_data函数。

# coding : UTF-8
import numpy as np

#filename文件名
def load_data(filename):
    '''
    input: filename(string)训练数据的文件位置
    output: feature_data(mat)特征
        label_data(mat)标签
    '''
    f = open(filename) #打开文件
    feature_data = []
    label_data = []
    #逐行读取
    for line in f.readlines():
        feature_tmp = []
        label_tmp = []
        lines = line.strip().split("\t")
        feature_tmp.append(1) #偏置项
        for i in range(len(lines)-1): #读除最后一行的前几行
            feature_tmp.append(float(lines[i]))
        label_tmp.append(float(lines[-1])) #读最后一行

        feature_data.append(feature_tmp)
        label_data.append(label_tmp)
    f.close() #关闭文件
    return np.mat(feature_data),np.mat(label_data)

然后,利用梯度下降法对训练数据进行训练,结合第一二节的代码。

def sig(x):
    '''sigmoid函数
    input:x(mat):feature*w
    output:sigmoid(x)(mat):sigmoid值
    '''
    return 1.0/(1+np.exp(-x))

def error_rate(h,label):
    '''计算当前的损失函数值
    input:h(mat):预测值
        label(mat):实际值
    output:err/m(float):错误率
    '''
    m = np.shape(h)[0]
    sum_err  = 0.0
    for i in range(m):
        if h[i,0] > 0 and (1-h[i,0]) > 0:
            sum_err -= (label[i,0] * np.log(h[i,0])+(1-label[i,0]) * np.log(1 - h[i,0]))
        else:
            sum_err -= 0
    return sum_err/m

def lr_train_bgd(feature_data,label_data,maxcycle=1000,alpha=0.01):
    """利用梯度下降训练LR模型
    input:feature(mat)特征
        label(mat)标签
        maxcycle(int)最大迭代次数
        alpha(float)学习率
    output:w(mat):权重
    """
    n = np.shape(feature_data)[1] #特征个数
    w = np.mat(np.ones((n, 1))) #初始化权重
    j = 0
    while j <= maxcycle: #在最大迭代次数的范围内
        j += 1 #当前的迭代次数
        h = sig(feature_data * w) #计算sigmoid的值
        err = label_data - h
        if j % 100 ==0:
            print("\t---iter="+str(j)+",train error rate="+str(error_rate(h,label)))
        w = w + alpha *feature.T * err #权重修正
    return w

将文件输入到文件weights中,保存模型需要定义save_model函数,可以将训练好的模型以文件的形式保存。

def save_model(filename,w):
    '''保存最终模型
    input: filename(string):模型保存的文件名
        w(mat): LR模型的权重
    '''
    m = np.shape(w)[0] #读取矩阵第一维的长度
    f_w = open(filename,'w')
    w_array = []
    for i in range(m):
        w_array.append(str(w[i,0]))
    f_w.write("\t".join(w_array))
    f_w.close()

综上述定义的函数,训练模型的主函数代码如下。

if __name__ == "__main__":
    #1.导入训练数据
    print("------1.load data------")
    feature,label = load_data("data.txt")
    #2.训练logistics regression模型
    print("------2.training-------")
    w = lr_train_bgd(feature,label,1000,0.01) #最大迭代次数1000,学习率0.01
    #3.保存最终的模型
    print("------3.save model------")
    save_model("weights",w)

2.对新的样本进行预测

接下来利用训练好的logistics regression模型对新的样本数据进行预测,lr模型保存在了weights文件中。

首先,在对新的数据集测试之前,需要先导入训练好的模型,将训练好的权重数值导入到权重矩阵中,需要定义load_weight函数。

# coding : UTF-8
import numpy as np
from numpy.doc.constants import line


def load_weights(w):
    '''导入lr模型
    input:w(string)权重所在文件的位置
    output:np.mat(w)权重的矩阵
    '''
    f = open(w)
    w = []
    for lines in f.readlines():
        lines = line.strip().split("\t")
        w_tmp = []
        for x in lines:
            w_tmp.append(w_tmp)
        f.close()
        return np.mat(w)

其次,导入测试数据集,需要定义load_data函数。
n为特征的个数,当测试集的长度不等于特征数减一时,继续循环,否则丢弃。

def load_data(filename,n):
    '''导入测试数据
    input:filename(string)测试集的位置
        n(int)特征的个数
    output:np.mat(feature_data) (mat)测试集的特征
    '''
    f = open(filename)
    feature_data = []
    for line in f.readlines():
        feature_tmp = []
        lines = line.strip().split("\t")
        #print lines[2]
        if len(lines) != n-1:
            continue
        feature_tmp.append(1)
        for x in lines:
            feature_tmp.append(float(x))
        feature_data.append(feature_tmp)
    f.close()
    return np.mat(feature_data)

在模型和测试数据都导入之后,可以对新的数据集进行预测,需要定义predict函数。其中需要使用sig函数,需要从lr_train文件中调用。

def predict(feature_data,w):
    '''对测试数据进行预测
    input:data(mat)测试数据的特征
        w(mat)模型的权重参数
    output:h(mat)最终的预测结果
    '''
    h = sig(feature_data * w.T) #求sigmoid对应的值
    m = np.shape(h)[0]
    for i in range(m):
        if h[i,0] < 0.5:
            h[i,0] = 0.0
        else:
            h[i, 0] = 1.0
    return h

由于此次logistics regression算法探究的是二分类问题,于是将0.5作为分类边界,小于0.5的sigmoid概率值归为0,大于0.5的sigmoid概率值归为1。

最后保存预测结果,需要定义save_result函数。

def save_result(filename,h):
    '''保存最终的预测结果
    input:filename(string):预测结果保存的文件名
        result(mat):预测的结果
    '''
    m = np.shape(h)[0]
    #输出预测到文件
    tmp = []
    for i in range(m):
        tmp.append(str(h[i,0]))
    f_result = open(filename,"w")
    f_result.write("\t".join(tmp))
    f_result.close()

filename为保存预测结果的文件名。


总结

以上针对Logistic Regression(逻辑回归)算法的原理和python具体实现过程进行了介绍,python的具体实现过程主要分为两个部分—训练和预测。

参考文献:《Python机器学习算法》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.【Python】分类算法—Logistic Regression 的相关文章

随机推荐

  • 23. 客户默认选项(Default Customer Options)

    Editing Email Templates Email Sender Contact Us
  • iphone尺寸_2007至2020:最全的iPhone手机25部历代发展及价格变化历史

    所以iPhone SE 2020 是真的廉价倒地了 智能手机时代的开始 第一代iPhone 2G 2007 4G 3800 8G 4560 2007年 史蒂夫 乔布斯 Steve Jobs 穿着运动鞋 牛仔裤 T恤站在舞台上 宣布了第一部i
  • Maven、pom.xml

    maven库中心 Maven Central Repository Search 搜索可以用的包与版本 目录 Maven 使用方法 1 下载 配置 2 项目中使用 3 生命周期 4 构建插件 MAVEN工程 的目录结构 父子项目 创建父项目
  • dpr-2000 四usb口无线多功能打印服务器,D-Link DPR-2000 超高兼容的打印服务器

    PConline资讯 DPR 2000无线802 11 G多功能打印服务器是一个通用多端口的打印服务器 是办公 学校和商业使用的理想选择 它提供4个USB连接接口可以连接4台USB打印机 本设备给用户提供添加多个打印机 多功能打印机或扫描仪
  • vue项目使用luckyexcel插件预览excel表格

    温馨提示 需要用到luckysheet文件和luckyexcel插件 根据下面步骤一步一步操作会避免踩坑 比如我当时遇到了window luckysheet is not defined控制台报红的问题 第一步 引入luckysheet的相
  • JAVA单元测试框架-14-实现TestNG失败案例重跑

    前面是通过java代码指定重跑 本节是讲解通过实现IAnnotationTransformer接口实现失败案例重跑 创建MyRetry 实现IRetryAnalyzer 接口 package Listener import org test
  • MMsegmentation文档学习

    1 了解配置 config文件结构 config base 下有4种基本组件类型 dataset model schedule default runtime 同一文件夹下的所有配置 建议只具有一个原始配置 所有其他配置从原始配置继承 这样
  • JDK8升级JDK11最全实践干货来了

    1 前言 截至目前 2023年 Java8发布至今已有9年 2018年9月25日 Oracle发布了Java11 这是Java8之后的首个LTS版本 那么从JDK8到JDK11 到底带来了哪些特性呢 值得我们升级吗 而且升级过程会遇到哪些问
  • Ts接口的使用

    TypeScript 的核心原则之一是对值所具有的结构进行类型检查 我们使用接口 Interfaces 来定义对象的类型 接口是对象的状态 属性 和行为 方法 的抽象 描述 接口初探 需求 创建人的对象 需要对人的属性进行一定的约束 id是
  • 工作10年我面试过上百个程序员,真想对他们说…

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 一 写在前面 最近收到不少读者反馈 说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不少困惑 这些同学说自己也做了精心准备 网上搜集了不少Java面试题
  • Edit Distance

    Given two words word1 and word2 find the minimum number of steps required to convert word1 to word2 each operation is co
  • 【转载】探索推荐引擎内部的秘密

    原网址 https www ibm com developerworks cn web 1103 zhaoct recommstudy1 index html icomments 这是2011年ibm发布的文章 较为通俗易懂 适合想入门推荐
  • 配置msf连接postgresql数据库

    BackTrack 5 R3版本的Metasploit在每次的升级后总会出现奇奇怪怪的错误 主要是Ruby的库出错 网上找了一些解决的办法 但每次更新后又会出错 蛋碎 解决方法 BackTrack 5中默认自动开启端口7337 1 查看Po
  • Zabbix监控MariaDB服务

    文章目录 1 概述监控MariaDB服务主机 2 安装MariaDB服务和配置MariaDB 3 配置Zabbix的userparameter mysql conf 文件模板 4 在Web配置模板 5 在server进行压力测试mysql服
  • svg实现文本的垂直居中对齐样式

    项目中用到表格内画折线趋势图 本人使用的svg绘制简单折线 没有数据的单元格显示文字 为了不影响表格的宽度自适应 就想到在svg上写文字 于是就有了在svg上对文字样式进行垂直居中的需求 上代码
  • Linux教程:在虚拟机中如何配置Linux系统网络环境 ?

    对于很多初学Linux 的同学 大多选择使用虚拟机来展开学习 可以方便的做实验 修改 测试 不必害怕出问题 可以随便折腾 大不了换一个虚拟机 原来的系统不受任何影响 但由于不是实体pc机 使用难免受限 如果配置不好 后期开发必受其累 比如
  • C++Primer(4-8章)

    第四章 表达式 求值顺序 C 中没有明确规定大多数运算符的求值顺序 因此我们要避免 改变了某个运算对象的值 又在表达式其他地方使用这个运算对象 这种情况出现 赋值运算满足右结合律 在输出表达式中使用条件运算符 条件运算符的优先级非常低 因此
  • java修改AD域用户密码使用SSL连接方式

    正常情况下 JAVA修改AD域用户属性 只能修改一些普通属性 如果要修改AD域用户密码和userAccountControl属性就得使用SSL连接的方式修改 SSL连接的方式需要操作以下步骤 1 安装AD域证书服务 2 证书颁发机构中设置以
  • 【C语言】结构体中的函数指针

    目录 一 函数指针是什么 二 结构体中的函数指针 一 函数指针是什么 函数指针是指向函数的指针变量 通常我们说的指针变量是指向一个整型 字符型或数组等变量 而函数指针是指向函数 函数指针可以像一般函数一样 用于调用函数 传递参数 正确形式
  • 2.【Python】分类算法—Logistic Regression

    2 Python 分类算法 Logistic Regression 文章目录 2 Python 分类算法 Logistic Regression 前言 一 Logistic Regression模型 1 线性可分和线性不可分 2 Logis