第二十周:机器学习

目录

摘要

ABSTRACT

一、吴恩达机器学习exp2——逻辑回归

1、logistic函数

2、数据预处理 

3、损失函数

4、梯度下降

5、设定评价指标 

6、决策边界

7、正则化

二、动手深度学习pytorch——数据预处理

1、数据集读取

2、缺失值处理

3、转换为张量格式

总结


摘要

本周接着上周的线性回归,进一步学习了逻辑回归的完整代码,不仅包含了逻辑回归模型的整个训练过程,还对逻辑回归中的损失函数和梯度下降函数进行代码表达。在复习了逻辑回归模型的数学原理后,对其进行代码实践,并且可视化决策边界函数,将自定义模型与库函数自带模型进行准确率、损失函数及其边界函数的比较。最后,接着pytorch动手深度学习的内容,学习了数据预处理部分。

ABSTRACT

This week follows up on last week's linear regression by further studying the complete code for logistic regression, which not only includes the entire training process of a logistic regression model, but also provides a code representation of the loss function and gradient descent function in logistic regression. After reviewing the mathematical principles of the logistic regression model, code practice on it and visualize the decision boundary function, comparing the accuracy, loss function and its boundary function of the custom model with the model that comes with the library function. Finally, the pytorch hands-on deep learning was followed by learning the data preprocessing component.

一、吴恩达机器学习exp2——逻辑回归

1、logistic函数

sigmoid函数不仅可以调用scikit-learn 库中自带的LogisticRegression模型,还可以自己定义,自定义及验证如下:

def sigmoid(z):     #定义sigmoid函数return 1 / (1 + np.exp(-z))#验证sigmoid函数的正确性
nums = np.arange(-10, 10, step=1)  #np.arange()函数返回一个有终点和起点的固定步长的排列
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(nums, sigmoid(nums), 'r')
plt.show()

import time
import matplotlib.pyplot as plt
import numpy as npfrom LogisticRegression import sigmoid
nums = np.arange(-5, 5, step=0.1)
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(nums, sigmoid(nums), 'r')
ax.set_title("Sigmoid Function")
ax.grid()
plt.show()

2、数据预处理 

加载数据

import pandas as pd
data = np.loadtxt(fname='ex2data1.txt',delimiter=",")
data = pd.read_csv('ex2data1.txt', header=None, names=['Exam 1', 'Exam 2', 'Admitted'])
data.head()

 查看数据集正负样本

import matplotlib.pyplot as plt
import numpy as np# 将列表转换为NumPy数组
data = np.array(data)#绘制数据集正负样本的散点图
fig, ax = plt.subplots(figsize=(12,8))
positive_data_idx= np.where(data[:,2]==1)
positive_data = data[positive_data_idx]
negative_data_idx= np.where(data[:, 2] == 0)
negative_data = data[negative_data_idx]
ax.scatter(x=positive_data[:, 0], y=positive_data[:, 1], s=10, color="red",label="positive")
ax.scatter(x=negative_data[:, 0], y=negative_data[:, 1], s=10, label="negative")
ax.set_title("Dataset")
plt.legend(loc=2)
plt.show()

同理,训练集和验证集分别的分布散点图如下:

 

 划分训练集额、验证集

from sklearn.model_selection import train_test_split
train_x, val_x, train_y, val_y = train_test_split(data[:, :-1], data[:, -1], test_size=0.2)
# train_x, val_x, train_y, val_y = data[:, :-1], data[:, :-1], data[:, -1], data[:, -1]#绘制数据集中训练集和验证集的各个分数段的分布散点图
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(x=train_x[:,0], y=train_x[:,1], s=10, label="Train")
ax.scatter(x=val_x[:,0], y=val_x[:,1], s=10, color="red", label="Validation")
ax.set_title('Dataset for Train and Validation')
ax.legend(loc=2)
plt.show()

3、损失函数

定义损失函数

def cost(theta, X, y):theta = np.matrix(theta)X = np.matrix(X)y = np.matrix(y)first = np.multiply(-y, np.log(sigmoid(X * theta.T)))#这个是(100,1)乘以(100,1)就是对应相乘second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))return np.sum(first - second) / (len(X))

初始化参数

data.insert(0, 'Ones', 1)  #增加一列,使得矩阵相乘更容易cols = data.shape[1]
X = data.iloc[:,0:cols-1] #训练数据
y = data.iloc[:,cols-1:cols]#标签#将X、y转化为数组格式
X = np.array(X.values)
y = np.array(y.values)
theta = np.zeros(3)  #初始化向量theta为0
theta,X,y

 检查矩阵属性和当前损失

X.shape, theta.shape, y.shape
cost(theta, X, y)

 

 

4、梯度下降

 定义梯度下降函数

def gradient(theta, X, y):  #梯度下降theta = np.matrix(theta)    #将参数theta、特征值X和标签y转化为矩阵形式X = np.matrix(X)y = np.matrix(y)parameters = int(theta.ravel().shape[1])    #.ravel()将数组维度拉成一维数组,  .shape()是长度,parameters指theta的下标个数grad = np.zeros(parameters) error = sigmoid(X * theta.T) - y  #误差for i in range(parameters):    #迭代的计算梯度下降term = np.multiply(error, X[:,i])grad[i] = np.sum(term) / len(X)return gradgradient(theta, X, y)       

 最优化

import scipy.optimize as opt
result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))#opt.fmin_tnc()函数用于最优化
result

最优化后的损失

cost(result[0], X, y)

 

以上的1、2、3、4条都是可以自定义的函数模块,把很多个功能封装到LogisticRegression类中,后面逻辑回归的训练过程就是直接调用其内部的函数即可。

5、设定评价指标 

定义准确率函数

def predict(theta, X):   #准确率probability = sigmoid(X * theta.T)return [1 if x >= 0.5 else 0 for x in probability]theta_min = np.matrix(result[0])
predictions = predict(theta_min, X)
correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]#zip 可以同时比较两个列表
accuracy = (sum(map(int, correct)) % len(correct))#map会对列表correct的每个元素调用int函数,将其转换成一个整数,然后返回一个迭代器,可以用来迭代所有转换后的结果
print ('accuracy = {0}%'.format(accuracy))  #因为数据总共100 个所以准确率只加测对的就行不用除了

 

查看精确度、损失和F1-score 

acc = logistic_reg.test(val_x,val_y_ex)
print("Accuracy on Test Set: {:.2f}%".format(acc * 100))
from sklearn.metrics import f1_score
f1 = f1_score(y_true=val_y_ex,y_pred=logistic_reg.predict(val_x))
print("My F1 Score: {:.4f}".format(f1))

 

调用库函数进行验证

from sklearn.linear_model import LogisticRegression
sk_lr = LogisticRegression(max_iter=50000)
sk_lr.fit(train_x,train_y)
sk_pred = sk_lr.predict(val_x)
count = np.sum(np.equal(sk_pred,val_y))
sk_acc = count/val_y.shape[0]
sk_prob = sk_lr.predict_proba(val_x)from LogisticRegression import bce_loss
sk_loss = bce_loss(sk_prob[:,1], val_y_ex)
sk_theta = np.array([[sk_lr.intercept_[0],sk_lr.coef_[0,0],sk_lr.coef_[0,1]]])
sk_f1 = f1_score(y_true=val_y_ex,y_pred=sk_pred)
print("Sklearn Accuracy: {:.2f}%".format(sk_acc * 100))
print("Sklearn Val Loss: {:.4f}".format(sk_loss))
print("SKlearn Parameters: ",sk_theta)
print("Sklearn F1 Score: {:.4f}".format(sk_f1))

6、决策边界

绘制决策边界函数 

#计算系数:结果是2*3维数组
coef = -(theta/ theta[0, 2])
coef1 = -(sk_theta / sk_theta[0, 2])data = data.to_numpy()  # 将dataframe形式的数据转化为numpy形式: 使用.to_numpy()方法x = np.arange(0,100, step=10)   #x轴是等距刻度
y = coef[0,0] + coef[0,1]*x   #y是自定义边界函数
y1 = coef1[0,0] + coef[0,1]*x  #y1是调用边界函数#绘制边界函数
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x,y,label="My Prediction",color='purple')
ax.plot(x,y1,label="Sklearn",color='orange')#绘制散点图
ax.scatter(x=positive_data[:, 0], y=positive_data[:, 1], s=10, color="red",label="positive")
ax.scatter(x=negative_data[:, 0], y=negative_data[:, 1], s=10, color="blue",label="negative")
ax.set_title("Decision Boundary")
plt.legend(loc=2)
plt.show()

 绘制训练过程 

记录每一轮的损失值 

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(1,epochs+1), train_loss, 'r', label="Train Loss")
ax.plot(np.arange(1,epochs+1), val_loss, 'b', label="Val Loss")
ax.set_xlabel('Epoch')
ax.set_ylabel('Loss')
ax.set_title('Train Curve')
plt.legend(loc=2)
plt.show()

 

7、正则化

正则化实际上就是对损失函数及梯度下降的一种改进方式,它在其他数据预处理、训练过程及结果可视化的方面都都跟普通的逻辑回归没什么差别。下面仅指出不同的地方进行修改

正则化损失函数

相比于正常的损失函数,多了一个正则项reg 

#正则化代价函数
def costReg(theta, X, y, learningRate):theta = np.matrix(theta)X = np.matrix(X)y = np.matrix(y)first = np.multiply(-y, np.log(sigmoid(X * theta.T)))second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))reg = (learningRate / (2 * len(X))) * np.sum(np.power(theta[:,1:theta.shape[1]], 2))#注意下标 j是从1开始到n的  不包含0return np.sum(first - second) / len(X) + reg

 正则化梯度下降

在迭代的计算梯度的时候,如果是第一次计算梯度就不需要加正则化项,其余轮次需要加上正则化项

#正则化梯度下降
def gradientReg(theta, X, y, learningRate):theta = np.matrix(theta)X = np.matrix(X)y = np.matrix(y)parameters = int(theta.ravel().shape[1])grad = np.zeros(parameters)error = sigmoid(X * theta.T) - yfor i in range(parameters):term = np.multiply(error, X[:,i])if (i == 0):grad[i] = np.sum(term) / len(X) #和上文一样,我们这里没有执行梯度下降,我们仅仅在计算一个梯度步长else:grad[i] = (np.sum(term) / len(X)) + ((learningRate / len(X)) * theta[:,i])return grad

决策边界可视化

fig, ax = plt.subplots(figsize=(12,8))# 使用更鲜明的颜色和更小的点
ax.plot(x, y, label="My Prediction", color='purple', linestyle='--')  # 虚线
ax.plot(x, y1, label="Sklearn", color='orange', linestyle=':')  # 点线
# ax.scatter(x=my_bd[:, 0], y=my_bd[:, 1], s=5, color="yellow", edgecolor='black', label="My Decision Boundary")
# ax.scatter(x=sk_bd[:, 0], y=sk_bd[:, 1], s=5, color="gray", edgecolor='black', label="Sklearn Decision Boundary")# 保持正负样本点的颜色鲜艳,但可以适当减小大小
ax.scatter(x=positive_data[:, 0], y=positive_data[:, 1], s=20, color="red", label="positive")
ax.scatter(x=negative_data[:, 0], y=negative_data[:, 1], s=20, color="blue", label="negative")ax.set_title('Decision Boundary')
ax.legend(loc=2)
plt.show()

二、动手深度学习pytorch——数据预处理

1、数据集读取

 创建一个人工数据集,并存储在CSV(逗号分隔值)文件

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n')f.write('NA,Pave,127500\n')f.write('2,NA,106000\n')f.write('4,NA,178100\n')f.write('NA,NA,140000\n')

 从创建的CSV文件中加载原始数据集

import pandas as pddata = pd.read_csv(data_file)
print(data)

               

2、缺失值处理

 处理缺失值的方法有插值法和删除法,下面代码以插值法为例

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

 

3、转换为张量格式

import torchX = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y

总结

本周继续完成吴恩达机器学习的实验2部分——逻辑回归 ,并且复习了对应的理论知识,对交叉熵、梯度更新、正则化表示的数学原理进行推导并且实现在代码上;pytorch学习了数据集的读取、缺失值的处理以及张量格式的转换。下周继续完成吴恩达实验,并接着学习pytorch比较细致的知识点。

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

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

相关文章

从人-物到人-机再到人-AI

从 人-物 到 人-机 再到 人-AI ,这一演化过程展现了人类与技术、工具的互动方式随着时代的发展而发生的深刻变化。这一变化不仅是技术进步的体现,更是社会、文化以及工作方式的根本转变。以下是这一演变的主要特点及其背后的影响: 1. 人-物时…

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中,我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API,包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库,并创建user 表 …

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别(ASR)项目,由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型,通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别(large-v2 为 70 倍实时&#xf…

【C++ 算法进阶】算法提升十六

目录 背包问题变种 (动态规划)题目题目分析 连续可组成数字题目题目分析 min-patches题目 最小补丁问题题目分析代码 逆序对个数 (归并排序)题目题目分析 约瑟夫环问题 (公式)题目题目分析 背包问题变种 &a…

链表的基本操作

链表,由若干个结点组成,每个结点包含数据域和指针域。结点结构如下图所示: 一般来讲,链表中只会有一个结点的指针域为空,该结点为尾结点,其他结点的指针域都会存储一个结点的内存地址。链表中也只会有一个结…

C#高级:Winform中的自定义窗体输入

目录 一、多样式输入(无封装) 1.代码 2.效果 二、单输入框封装 1.使用 2.封装 3.效果 三、组合框批量输入封装 1.使用 2.封装 3.效果 一、多样式输入(无封装) 1.代码 private async void button1_Click(object send…

memblock内存分配器

一、简述 memblock 是 Linux 内核中的一个内存管理子系统,主要用于在系统启动早期阶段管理物理内存。它在内核初始化期间负责管理内存,直到更复杂的内存管理子系统(如伙伴系统)接管。 二、工作原理 初始化:在内核启…

【C++滑动窗口】1248. 统计「优美子数组」|1623

本文涉及的基础知识点 C算法:滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…

⽂件内容的读写

文件 InputStream (字节流读出 抽象类) InputStream 只是⼀个抽象类,要使⽤还需要具体的实现类 FileInputStream(字节流读出) OutputStream(字节流写入) Reader(字符流读入&#xff…

FreeRTOS消息队列实验与出现的问题

目录 实验名字:队列操作实验 1、实验目的 2、实验设计 3、实验工程 4、实验程序与分析 ●任务设置 ● 其他应用函数 ● main()函数 ● 任务函数 ●中断初始化及处理过程 5.程序运行结果分析 6.进行实验移植时所遇到的问题 1.项目中mymalloc等函数缺少 …

el-cascader 使用笔记

1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载&#xff08;官网&#xff09; <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…

Linux之进程概念(2)

Linux之进程概念&#xff08;2&#xff09; 孤儿进程 父进程如果提前退出&#xff0c;那么子进程后退出&#xff0c;进入Z之后&#xff0c;那该如何处理呢&#xff1f; 父进程先退出&#xff0c;子进程就称之为“孤儿进程” 孤儿进程被1号init进程领养&#xff0c;当然要有in…

1+X应急响应(网络)日志分析:

日志分析&#xff1a; Web日志分析&#xff1a; http协议&#xff1a; http版本演变&#xff1a; http协议工作原理&#xff1a; http协议的特点&#xff1a; http请求报文&#xff1a; http请求方法&#xff1a; http响应报文&#xff1a; UserId&#xff1a;注册网站的序列号…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中&#xff0c;我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板&#xff0c;包括模型、逻辑、处理器、路由等&#xff0c;大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

计算机编程中的设计模式及其在简化复杂系统设计中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的…

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时&#xff0c;经常表格需要置顶写&#xff0c;则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连&#xff0c;如何通过明令&#xff0c;留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…

leetcode01——合并两个有序数组

0.本题学到的知识 1.python的操作中&#xff0c;哪些是在原数据上进行操作的&#xff1f; 新开辟的行为&#xff1a;list1list1[m:n] 原数据&#xff1a;list1[a:b]list1[m:n] 新开辟&#xff1a;list1list1list2 原数据&#xff1a;list1.append(list2[i]); list1.extend(list…

深度学习的艺术:揭秘卷积神经网络(CNN)的神秘面纱

深度学习的艺术&#xff1a;揭秘卷积神经网络&#xff08;CNN&#xff09;的神秘面纱 一、CNN的构成要素二、CNN的工作流程三、CNN的应用领域四、CNN的优势与局限 #引言&#xff1a; 在人工智能的璀璨星空中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;如同一颗耀眼的…

Linux高阶——1116—环形队列生产者消费者

目录 1、环形队列 2、生产者消费者 环形队列数组实现代码 成功截图 1、环形队列 相比于线性队列&#xff0c;环形队列可以有效避免访问越界问题&#xff0c;使用下标访问队列元素时&#xff0c;到达末尾后下标归0&#xff0c;返回起始位置&#xff0c;使用下标运算即可 a…

学习大数据DAY61 宽表加工

目录 模型设计 加工宽表 任务调度&#xff1a; 大表 - 把很多数据整合起来 方便后续的明细查询和指标计算 模型设计 设计 建模 设计: excel 文档去编写 建模: 使用建模工具 PowerDesigner Navicat 在线画图工具... 把表结构给绘 制出来 共享\项目课工具\pd 加工宽表 数…