科技 > 人工智能 > 机器学习

逻辑回归

105人参与 2024-08-06 机器学习

目录

第1关:逻辑回归核心思想

相关知识

什么是逻辑回归

编程要求

代码文件

第2关:逻辑回归的损失函数

相关知识

为什么需要损失函数

逻辑回归的损失函数

题目答案

第3关:梯度下降

相关知识

什么是梯度

梯度下降算法原理

编程要求

代码文件

第4关:动手实现逻辑回归 - 癌细胞精准识别

相关知识

数据集介绍

构建逻辑回归模型

训练逻辑回归模型

编程要求

代码文件

第5关:手写数字识别

相关知识

数据简介

logisticregression

编程要求

代码文件


第1关:逻辑回归核心思想

相关知识

什么是逻辑回归

假设现在已经训练好了一个逻辑回归的模型为 f(x) ,模型的输出是样本 x 的标签是 1 的概率,则该模型可以表示, p^​=f(x) 。若得到了样本 x 属于标签 1 的概率后,很自然的就能想到当 p^​>0.5 时 x 属于标签 1 ,否则属于标签 0 。

(其中 y^​ 为样本 x 根据模型预测出的标签结果,标签 0 和标签 1 所代表的含义是根据业务决定的,比如在癌细胞识别中可以使 0 代表良性肿瘤, 1 代表恶性肿瘤)。

函数图像如下图所示:

sigmoid函数的图像可以看出当 t 趋近于 −∞ 时函数值趋近于 0 ,当 t 趋近于 +∞ 时函数值趋近于 1 。可见sigmoid函数的值域是 (0,1) ,满足我们要将 (−∞,+∞) 的实数转换成 (0,1) 的概率值的需求。因此逻辑回归在预测时可以看成

编程要求

补充 python 代码,实现sigmoid函数。底层代码会调用您实现的sigmoid函数来进行测试。(提示: numpy.exp()函数可以实现 e 的幂运算)

代码文件

#encoding=utf8
import numpy as np

def sigmoid(t):
    '''
    完成sigmoid函数计算
    :param t: 负无穷到正无穷的实数
    :return: 转换后的概率值
    :可以考虑使用np.exp()函数
    '''
    #********** begin **********#
    ans = 1/(1+np.exp(-t))
    return ans
    #********** end **********#

第2关:逻辑回归的损失函数

相关知识

为什么需要损失函数

逻辑回归的损失函数

逻辑回归计算出的样本所属类别的概率 p^​=σ(wtx+b) ,样本所属列表的判定条件为

假设有情况a:现在有个样本的真实类别是 0 ,但是模型预测出来该样本是类别 1 的概率是 0.7 (也就是说类别 0 的概率为 0.3 );情况b:现在有个样本的真实类别是 0 ,但是模型预测出来该样本是类别 1 的概率是 0.6 (也就是说类别 0 的概率为 0.4 );很显然,情况a的误差更大!因为情况a中模型认为样本是类别 0 的可能性只有 30% ,而b有 40% 。

假设有情况a:现在有个样本的真实类别是 0 ,但是模型预测出来该样本是类别 1 的概率是 0.7 (也就是说类别 0 的概率为 0.3 );情况b:现在有个样本的真实类别是 1 ,但是模型预测出来该样本是类别 1 的概率是 0.3 (也就是说类别 0 的概率为 0.7 );ab两种情况的误差一样大!

当样本的真实类别为 1 时,式子就变成了 cost=−log(p^​)。此时函数图像如下:

从图像能看出当样本的真实类别为1的前提下,p^​ 越大,损失函数值就越小。因为 p^​ 越大就越说明模型越认为该样本的类别为 1 。

当样本的真实类别为 0 时,式子就变成了 cost=−log(1−p^​) 。此时函数图像如下:

从图像能看出当样本的真实类别为 0 的前提下,hatp 越大,损失函数值就越大。因为 p^​ 越大就越说明模型越认为该样本的类别为 1 。

逻辑回归的训练流程就是寻找一组合适的 wt 和 b ,使得损失值最小。找到这组参数后模型就确定下来了。

题目答案

第3关:梯度下降

相关知识

什么是梯度

梯度下降算法原理

假设你迷失在山上的迷雾中,你能感觉到的只有你脚下路面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。这就是梯度下降的做法:通过测量参数向量 θ 相关的损失函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度降为 0 ,达到最小值。

假设此时只有一个参数,则损失函数对参数的梯度即损失函数对参数的导数。如果刚开始参数初始在最优解的左边,

这个时候损失函数对参数的导数是小于 0 的,而学习率是一个 0 到 1 之间的数,此时按照公式更新参数,初始的参数减去一个小于 0 的数是变大,也就是在坐标轴上往右走,即朝着最优解的方向走。同样的,如果参数初始在最优解的右边,

此时按照公式更新,参数将会朝左走,即最优解的方向。所以,不管刚开始参数初始在何位置,按着梯度下降公式不断更新,参数都会朝着最优解的方向走。

编程要求

使用 python 实现梯度下降算法,并损失函数最小值时对应的参数thetatheta会返回给外部代码,由外部代码来判断theta是否正确。损失函数为:loss=2∗(θ−3) ,最优参数为:3.0 ,答案跟最优参数的误差低于0.0001才能通关。

代码文件

import numpy as np
import warnings
warnings.filterwarnings("ignore")

def gradient_descent(initial_theta,eta=0.05,n_iters=1000,epslion=1e-8):
    '''
    梯度下降
    :param initial_theta: 参数初始值,类型为float
    :param eta: 学习率,类型为float
    :param n_iters: 训练轮数,类型为int
    :param epslion: 容忍误差范围,类型为float
    :return: 训练后得到的参数
    '''
    #   请在此添加实现代码   #
    #********** begin *********#
    theta = initial_theta
    i_iters = 0
    while i_iters < n_iters:
        loss = 2*(theta-3)
        theta0 = theta
        theta = theta - eta*loss #权重
        if(abs(theta-theta0) < epslion):
            break
        i_iters += 1
    return theta
    #********** end **********#

第4关:动手实现逻辑回归 - 癌细胞精准识别

相关知识

数据集介绍

乳腺癌数据集,其实例数量是 569 ,实例中包括诊断类和属性,帮助预测的属性一共 30 个,各属性包括为 radius 半径(从中心到边缘上点的距离的平均值), texture 纹理(灰度值的标准偏差)等等,类包括: wdbc-malignant 恶性和 wdbc-benign 良性。用数据集的 80% 作为训练集数据集的 20% 作为测试集,训练集和测试集中都包括特征和类别。其中特征和类别均为数值类型,类别中 0 代表良性, 1 代表恶性。

构建逻辑回归模型

由数据集可以知道,每一个样本有 30 个特征和 1 个标签,而我们要做的事就是通过这 30 个特征来分析细胞是良性还是恶性(其中标签 y=0 表示是良性, y=1 表示是恶性)。逻辑回归算法正好是一个二分类模型,我们可以构建一个逻辑回归模型,来对癌细胞进行识别。模型如下:

其中 xi​表示第 i 个特征,wi​表示第 i 个特征对应的权重,b表示偏置。 为了方便,我们稍微将模型进行变换,其中x0​等于 1 :

将一个样本输入模型,如果预测值大于等于 0.5 则判定为 1 类别,如果小于 0.5 则判定为 0 类别。

训练逻辑回归模型

我们已经知道如何构建一个逻辑回归模型,但是如何得到一个能正确对癌细胞进行识别的模型呢?

要使用梯度下降算法首先要知道损失函数对参数的梯度,即损失函数对每个参数的偏导,如下:

编程要求

构建一个逻辑回归模型,并对其进行训练,最后将得到的逻辑回归模型对癌细胞进行识别。只需返回预测结果即可,预测正确率高于 95% 视为过关。构建模型时 x0​ 是添加在数据的左边,请根据提示构建模型,且返回theta形状为(n,)n为特征个数。   

代码文件

import numpy as np
import warnings
warnings.filterwarnings("ignore")

def sigmoid(x):
    '''
    sigmoid函数
    :param x: 转换前的输入
    :return: 转换后的概率
    '''
    return 1/(1+np.exp(-x))


def fit(x,y,eta=1e-3,n_iters=10000):
    '''
    训练逻辑回归模型
    :param x: 训练集特征数据,类型为ndarray
    :param y: 训练集标签,类型为ndarray
    :param eta: 学习率,类型为float
    :param n_iters: 训练轮数,类型为int
    :return: 模型参数,类型为ndarray
    '''
    #   请在此添加实现代码   #
    #********** begin *********#
    theta = np.zeros(x.shape[1])
    i_iters = 0
    while i_iters < n_iters:
        loss = (sigmoid(x.dot(theta))-y).dot(x)
        theta = theta - eta*loss
        i_iters += 1
    return theta
    #********** end **********#

第5关:手写数字识别

相关知识

数据简介

本关使用的是手写数字数据集,该数据集有 1797 个样本,每个样本包括 8*8 像素(实际上是一条样本有 64 个特征,每个像素看成是一个特征,每个特征都是float类型的数值)的图像和一个 [0, 9] 整数的标签。比如下图的标签是 2 :

sklearn为该数据集提供了接口,若想使用该数据集,代码如下:

from sklearn import datasets
import matplotlib.pyplot as plt

#加载数据集
digits = datasets.load_digits()
#x表示图像数据,y表示标签
x = digits.data
y = digits.target

#将第233张手写数字可视化
plt.imshow(digits.images[232])

logisticregression

logisticregression的使用代码如下:

logreg = logisticregression(solver='lbfgs',max_iter =10,c=10)
logreg.fit(x_train, y_train)
result = logreg.predict(x_test)

编程要求

填写digit_predict(train_sample, train_label, test_sample)函数完成手写数字识别任务。

只需返回预测结果即可,程序内部会检测您的代码,预测正确率高于 0.97 视为过关。

代码文件

from sklearn.linear_model import logisticregression

def digit_predict(train_image, train_label, test_image):
    '''
    实现功能:训练模型并输出预测结果
    :param train_sample: 包含多条训练样本的样本集,类型为ndarray,shape为[-1, 8, 8]
    :param train_label: 包含多条训练样本标签的标签集,类型为ndarray
    :param test_sample: 包含多条测试样本的测试集,类型为ndarry
    :return: test_sample对应的预测标签
    '''

    #************* begin ************#
    #数据预处理:使用min-max标准化
    trainimage = train_image.reshape((-1,64))
    train_min = trainimage.min()
    train_max = trainimage.max()
    trainimage = (trainimage-train_min)/(train_max-train_min)
    testimage = test_image.reshape((-1,64))
    test_min = testimage.min()
    test_max = testimage.max()
    testimage = (testimage-test_min)/(test_max-test_min)
    #训练预测
    logreg = logisticregression(c=10)
    logreg.fit(trainimage,train_label)
    result = logreg.predict(testimage)
    return result
    #************* end **************#
(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

机器学习:逻辑回归

08-06

智能风控体系之逻辑回归

08-06

机器学习——逻辑回归

08-06

随机森林、逻辑回归、多层感知机和极端梯度提升(XGBoost)是四种常见的机器学习模型-代码模型评价可视化

08-06

最大似然估计和逻辑回归

08-06

机器学习个人作业:回归分析

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论