机器学习——逻辑回归算法代码实现

article/2025/9/16 18:18:12

机器学习——逻辑回归算法代码实现

  • 前言
  • 一、逻辑回归是什么?
  • 二、代码实现
    • 1.数据说明
    • 2.逻辑回归代码


前言

最近准备开始学习机器学习,后续将对学习内容进行记录,该文主要针对逻辑回归代码实现进行记录!

一、逻辑回归是什么?

逻辑回归概念篇可看博主之前的文章,传送门


二、代码实现

1.数据说明

你想根据两次考试的结果来决定每个申请人的录取机会。你有以前的申请人的历史数据,你可以用它作为逻辑回归的训练集。对于每一个培训例子,你有两个考试的申请人的分数和录取决定。为了做到这一点,我们将建立一个分类模型,根据考试成绩估计入学概率。
数据源下载:数据下载 提取码: 5mf2
在这里插入图片描述
打开数据后可以看到,只有数字没有列名,于是在利用pandas创建DataFrame结构时需要手动指定header
数据导入

#三大件
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline   
# 可以在Ipython编译器里直接使用,功能是可以内嵌绘图,并且可以省略掉plt.show()这一步
import os
path = 'data' + os.sep + 'LogiReg_data.txt' #改成数据源路径
pdData = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])#手动指定header
pdData.head()

输出为:
在这里插入图片描述
将数据用散点图绘制出来

positive = pdData[pdData['Admitted'] == 1] # returns the subset of rows such Admitted = 1, i.e. the set of *positive* examples
negative = pdData[pdData['Admitted'] == 0] # returns the subset of rows such Admitted = 0, i.e. the set of *negative* examplesfig, ax = plt.subplots(figsize=(10,5))
ax.scatter(positive['Exam 1'], positive['Exam 2'], s=30, c='b', marker='o', label='Admitted')
ax.scatter(negative['Exam 1'], negative['Exam 2'], s=30, c='r', marker='x', label='Not Admitted')
ax.legend()
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')

输出为
在这里插入图片描述

2.逻辑回归代码

目标:建立分类器(求解出三个参数 θ 0 θ 1 θ 2 \theta_0\theta_1\theta_2 θ0θ1θ2)设定阈值,根据阈值判断录取结果(一般设置为0.5)
待完成模块:
·sigmoid : 映射到概率的函数
·model : 返回预测结果值
·cost : 根据参数计算损失
·gradient : 计算每个参数的梯度方向
·descent : 进行参数更新
·accuracy: 计算精度

具体代码说明:
①sigmoid函数

def sigmoid(z):return 1 / (1 + np.exp(-z))

②model函数

def model(X, theta):return sigmoid(np.dot(X, theta.T))

③增加一列取值为1的特征

if 'Ones' not in pdData.columns:pdData.insert(0, 'Ones', 1) # in a try / except structure so as not to return an error if the block si executed several times

④将pandas转换为ndarray,获取数据总列数

orig_data = pdData.values # convert the Pandas representation of the data to an array useful for further computations
cols = orig_data.shape[1]

⑤提取特征数据X,结果数据y,定义 θ \theta θ

X = orig_data[:,0:cols-1]
y = orig_data[:,cols-1:cols]
theta = np.zeros([1, 3])

⑥损失函数
J ( θ ) = 1 n ∑ i = 1 n [ ( − y l o g ( h θ ( x ) ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) ] J(\theta)=\frac{1}{n}\sum_{i=1}^n[(-ylog(h_\theta(x)))-(1-y)log(1-h_\theta(x))] J(θ)=n1i=1n[(ylog(hθ(x)))(1y)log(1hθ(x))]

def cost(X, y, theta):left = np.multiply(-y, np.log(model(X, theta)))right = np.multiply(1 - y, np.log(1 - model(X, theta)))return np.sum( left-right) / (len(X)) #n取决于传递进来的X样本的个数,根据不同的梯度下降方法对应不同的n

⑦计算梯度方向

def gradient(X, y, theta):grad = np.zeros(theta.shape)error = (model(X, theta)-y ).ravel() #拉成一个一维数组#有三个待求参数,需要对每个参数机进行求偏导后存放到grad数组中for j in range(len(theta.ravel())): #for each parmeterterm = np.multiply(error, X[:,j]) #相当于乘了每个样本的第j个特征grad[0, j] = np.sum(term) / len(X) #n取决于传递进来的X样本的个数,根据不同的梯度下降方法对应不同的nreturn grad #返回每一个参数应该下降

⑧比较3中不同梯度下降方法

STOP_ITER = 0#根据迭代次数停止
STOP_COST = 1#根据损失停止
STOP_GRAD = 2#根据梯度def stopCriterion(type, value, threshold):#设定三种不同的停止策略if type == STOP_ITER:        return value > thresholdelif type == STOP_COST:      return abs(value[-1]-value[-2]) < thresholdelif type == STOP_GRAD:      return np.linalg.norm(value) < thresholdimport numpy.random
#洗牌
def shuffleData(data):np.random.shuffle(data)cols = data.shape[1]X = data[:, 0:cols-1]y = data[:, cols-1:]return X, yimport time
#batchsize=1表示随机梯度下降,batchsize=100表示批量梯度下降,为其他表示小批量
def descent(data, theta, batchSize, stopType, thresh, alpha):#梯度下降求解init_time = time.time()i = 0 # 迭代次数k = 0 # batchX, y = shuffleData(data)grad = np.zeros(theta.shape) # 计算的梯度costs = [cost(X, y, theta)] # 损失值while True:grad = gradient(X[k:k+batchSize], y[k:k+batchSize], theta)k += batchSize #取batch数量个数据if k >= n: k = 0 X, y = shuffleData(data) #重新洗牌theta = theta - alpha*grad # 参数更新costs.append(cost(X, y, theta)) # 计算新的损失i += 1 if stopType == STOP_ITER:       value = ielif stopType == STOP_COST:     value = costselif stopType == STOP_GRAD:     value = gradif stopCriterion(stopType, value, thresh): breakreturn theta, i-1, costs, grad, time.time() - init_timedef runExpe(data, theta, batchSize, stopType, thresh, alpha):#import pdb; pdb.set_trace();theta, iter, costs, grad, dur = descent(data, theta, batchSize, stopType, thresh, alpha)name = "Original" if (data[:,1]>2).sum() > 1 else "Scaled"name += " data - learning rate: {} - ".format(alpha)if batchSize==n: strDescType = "Gradient"elif batchSize==1:  strDescType = "Stochastic"else: strDescType = "Mini-batch ({})".format(batchSize)name += strDescType + " descent - Stop: "if stopType == STOP_ITER: strStop = "{} iterations".format(thresh)elif stopType == STOP_COST: strStop = "costs change < {}".format(thresh)else: strStop = "gradient norm < {}".format(thresh)name += strStopprint ("***{}\nTheta: {} - Iter: {} - Last cost: {:03.2f} - Duration: {:03.2f}s".format(name, theta, iter, costs[-1], dur))fig, ax = plt.subplots(figsize=(12,4))ax.plot(np.arange(len(costs)), costs, 'r')ax.set_xlabel('Iterations')ax.set_ylabel('Cost')ax.set_title(name.upper() + ' - Error vs. Iteration')return theta

对结果进行绘图分析:

#选择的梯度下降方法是基于所有样本的,迭代50000次,每一次步长为0.000001
n=100
runExpe(orig_data, theta, n, STOP_ITER, thresh=5000, alpha=0.000001)

在这里插入图片描述

runExpe(orig_data, theta, n, STOP_COST, thresh=0.000001, alpha=0.001)

在这里插入图片描述

runExpe(orig_data, theta, n, STOP_GRAD, thresh=0.05, alpha=0.001)

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述



http://chatgpt.dhexx.cn/article/qIcnv4sd.shtml

相关文章

逻辑回归算法的优化

一:有无截距: 如上图。可以知道,有截距的线条数比无截距的线条数(过原点的线条)要多。所以在选择逻辑回归的时候,通常要设置截距。增加正确的概率。 代码: val lr = new LogisticRegressionWithSGD() ----创建逻辑回归对象 l…

Python机器学习--回归算法--逻辑回归算法

逻辑回归算法 逻辑回归算法类型: 逻辑回归属于有监督学习的分类算法&#xff08;只能做二分类&#xff09; 逻辑回归算法原理: 将线性回归的结果输入sigmoid函数中&#xff0c;得出预测为类1的概率&#xff08; 如果概率为0.2 有20%的可能属于类1&#xff0c;属于类0的概率…

算法笔记(11)逻辑回归算法及Python代码实现

逻辑回归算法是一种被广泛使用的分类算法&#xff0c;通过训练数据中的正负样本&#xff0c;学习样本特征到样本标签之间的假设函数。逻辑回归假设因变量 y 服从伯努利分布&#xff0c;而线性回归假设因变量 y 服从高斯分布。 因此与线性回归有很多相同之处&#xff0c;去除Sig…

深度学习原理-----逻辑回归算法

系列文章目录 深度学习原理-----线性回归梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网络&#xff08;RNN、LSTM&#xff09; 时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络…

逻辑回归算法原理及python实现

文章目录 引言逻辑回归算法原理逻辑回归损失函数 python实现逻辑回归决策边界python实现多项式逻辑回归sklearn中的逻辑回归逻辑回归中的正则化sklearn实现逻辑回归 引言 逻辑回归&#xff08;Logistic Regression&#xff09;是一种分类学习算法&#xff0c;其本质是将样本的…

基于逻辑回归算法模型搭建思路

在真实工作场景中&#xff0c;有多种算法依据借贷数据集建立模型&#xff0c;主要使用的算法有逻辑回归、神经网络、决策树、贝叶斯信念网、GBDT算法等&#xff0c;本系列文章旨在为刚入门和对模型感兴趣的同学介绍传统风控模型算法之一——逻辑回归。 前方高能&#xff01;准…

【机器学习】Logistic Regression 逻辑回归算法详解 + Java代码实现

文章目录 一、逻辑回归简介1.1 什么是逻辑回归1.2 Sigmoid函数1.3 预测函数 二、逻辑回归实战 - Java代码实现 一、逻辑回归简介 1.1 什么是逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;是一种用于解决二分类&#xff08;0 or 1&#xff09;问题的机器学习…

机器学习之逻辑回归算法

文章目录 逻辑回归原理推导逻辑回归求解 逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习中的一种分类模型&#xff0c;它是一种分类算法&#xff0c;虽然名字中带有回归&#xff0c;但是它与回归之间有一定的联系。 看到回归二字&#xff0c;很多人可能会认为…

机器学习算法 之 逻辑回归算法

1 逻辑回归之第一次学习 本文内容主要转自两处&#xff1a; [1] 逻辑回归从入门到深入&#xff08;logistic regression) 本文内容从Python 逻辑回归实际使用的角度出发&#xff0c;较为通俗易懂&#xff0c;感谢其作者的分享。 [2] 《百面机器学习》之逻辑回归 注意&#xf…

逻辑回归算法简介

逻辑回归算法&#xff1a;虽然名字中带有回归两个字&#xff0c;但它却不是回归算法&#xff0c;它是一个经典的二分类算法。 回归与分类的区别&#xff1a; 回归&#xff1a;可以得到一个准确值或一个区间值&#xff0c;比如房屋价格预测&#xff0c;NBA比赛得分等。 分类&am…

逻辑回归算法原理

回归与分类的不同在于其目标变量是否是连续的。分类是预测出一个标签&#xff0c;找到一条线或超平面去区分数据&#xff0c;输出是离散的、有限的。回归是预测出一个量&#xff0c;找到一条线去尽可能的拟合逼近这些数据&#xff0c;输出是连续的、无限的。 逻辑回归本质上是线…

机器学习算法--逻辑回归原理介绍

一、逻辑回归基本概念 1. 什么是逻辑回归 逻辑回归就是这样的一个过程&#xff1a;面对一个回归或者分类问题&#xff0c;建立代价函数&#xff0c;然后通过优化方法迭代求解出最优的模型参数&#xff0c;然后测试验证我们这个求解的模型的好坏。 Logistic回归虽然名字里带“…

逻辑回归算法

逻辑回归算法-龙珠计划 一、逻辑回归算法原理 逻辑回归&#xff08;Logistic Regression&#xff09; 属于机器学习 — 监督学习 — 分类。 逻辑回归&#xff08;Logistic Regression&#xff09;主要解决二分类问题&#xff0c;用来表示某件事情发生的可能性。 逻辑回归本…

【机器学习】逻辑回归算法

逻辑回归算法 学习目标1. 逻辑回归的介绍1.1 逻辑回归的应用场景1.2 逻辑回归的原理1.2.1 输入1.2.2 激活函数 1.3 损失以及优化1.3.1 损失1.3.2 优化 1.4 小结 2. 逻辑回归api介绍3. 案例&#xff1a;癌症分类预测-良&#xff0f;恶性乳腺癌肿瘤预测3.1 背景介绍3.2 案例分析3…

java中字符流和字节流的区别_java中字节流和字符流有哪些区别

java中字节流和字符流的区别有&#xff1a;1、定义不同&#xff1b;2、结尾不同&#xff1b;3、处理方式不同&#xff1b;4、缓冲区不同&#xff1b;5、编码方式不同。字节流默认不使用缓冲区&#xff0c;而字符流使用缓冲区。字节流采用ASCII编码&#xff0c;字符流采用unicod…

JAVA--字节流和字符流区别

&#xff08;一&#xff09;功能区别 1、FileInputSteam和FileOutputStream可以完成所有格式文件的复制&#xff1b; 2、FileReader和FileWriter只能完成文本格式的复制&#xff0c;无法完成视频、音频等文件的复制&#xff1b; &#xff08;二&#xff09;区别原理 1、字节…

Java进阶(四十五)java 字节流与字符流的区别

字节流与和字符流的使用非常相似&#xff0c;两者除了操作代码上的不同之外&#xff0c;是否还有其他的不同呢&#xff1f; 实际上字节流在操作时本身不会用到缓冲区&#xff08;内存&#xff09;&#xff0c;是文件本身直接操作的&#xff0c;而字符流在操作时使用了缓冲区&a…

字节流与字符流的区别用字节流好还是用字符流好?

字节流&#xff1a; (A)FileOutputStream(File name) 创建一个文件输出流&#xff0c;向指定的 File 对象输出数据。 (B)FileOutputStream(FileDescriptor) 创建一个文件输出流&#xff0c;向指定的文件描述器输出数据。 (C)FileOutputStream(String name) 创建一个文件输出流&…

Java基础面试题 | 字节流和字符流有什么区别?

字节流按 8 位传输&#xff0c;以字节为单位输入输出数据&#xff0c;字符流按 16 位传输&#xff0c;以字符为单位输入输出数据。 但是不管文件读写还是网络发送接收&#xff0c;信息的最小存储单元都是字节。 java 字节流与字符流的区别_afa的专栏-CSDN博客_java中字节流和…