数据增强和数据平衡

news2024/9/19 9:34:53

数据增强(Data Augmentation)

数据增强是一种通过对数据进行变换来增加数据多样性的方法。它可以提高模型的泛化能力,特别是在图像和文本处理任务中。

原理

通过数据增强技术,生成更多样本,提高模型的泛化能力。例如,对于图像数据,可以进行旋转、翻转、裁剪、缩放等操作。

核心公式:

例如,图像旋转:

其中,M 是旋转矩阵,θ 是旋转角度。

生活场景案例:产品图像数据增强

假设我们有一个电子商务网站的产品图像数据集,每个产品只有一张图像。为了提高图像分类模型的性能,我们将使用数据增强技术生成更多样本。

数据描述

  • product_image:产品图像

Python代码

from PIL import Image, ImageOps
import matplotlib.pyplot as plt
import numpy as np
import random

# 加载图像
image_path = './pic1595051357.jpg'  # 图像路径
image = Image.open(image_path)

# 定义数据增强函数
def augment_data(image):
    # 随机旋转
    angle = random.randint(-30, 30)
    rotated_image = image.rotate(angle)

    # 随机水平翻转
    if random.choice([True, False]):
        flipped_image = ImageOps.mirror(rotated_image)
    else:
        flipped_image = rotated_image

    return flipped_image

# 数据增强示例
num_samples = 4
plt.figure(figsize=(12, 8))

for i in range(num_samples):
    augmented_image = augment_data(image)
    plt.subplot(2, num_samples//2, i+1)
    plt.imshow(np.array(augmented_image))
    plt.axis('off')

plt.tight_layout()
plt.show()

代码解析

  1. 加载图像:使用 Pillow (PIL) 加载图像,将图像从文件读取到内存中。
  2. 定义数据增强函数
    • 随机旋转:生成一个随机角度,对图像进行旋转。
    • 随机水平翻转:随机决定是否对图像进行水平翻转。
  1. 数据增强示例:生成4个增强后的图像样本,并使用 Matplotlib 进行展示。

图像数据增强步骤详解

  1. 随机旋转
    • 使用 random.randint(-30, 30) 生成一个随机角度。
    • 使用 image.rotate(angle) 对图像进行旋转。
  1. 随机水平翻转
    • 使用 random.choice([True, False]) 随机选择是否进行水平翻转。
    • 如果选择为 True,使用 ImageOps.mirror(rotated_image) 进行水平翻转。

通过这个生活场景的案例,我们可以看到数据增强如何帮助我们生成更多样本,从而提高模型的泛化能力。这在电子商务等领域的图像分类任务中尤为重要。

数据平衡(Data Balancing)

处理类别不平衡问题,可以使用过采样(如SMOTE)、欠采样等方法。

原理

通过过采样、欠采样等方法平衡类别分布,提高模型在少数类上的表现。

核心公式

过采样(SMOTE):通过在少数类样本之间插值生成新的样本。对于两个少数类样本 xi 和 xj,生成新样本 xnew:

其中,λ 是介于 0 和 1 之间的随机数。

Python案例

数据平衡是数据预处理中的一个重要步骤,特别是在处理分类问题时。如果一个类别的样本数量远多于其他类别,会导致分类器偏向于多数类别,从而影响模型的性能。常见的数据平衡方法包括过采样、欠采样和合成少数类过采样技术(SMOTE)。

下面是一个基于SMOTE的案例,展示如何使用Python代码进行数据平衡,并绘制相关图形。

假设我们有一个客户满意度调查数据集,包含客户的年龄、消费金额、和满意度(满意/不满意)。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
from collections import Counter

# 生成示例不平衡数据集
np.random.seed(42)
ages = np.random.randint(18, 70, 1000)
spending = np.random.randint(500, 10000, 1000)
satisfaction = np.where(spending > 5000, 1, 0)
# 人为制造类别不平衡
satisfaction[:950] = 0

data = pd.DataFrame({'Age': ages, 'Spending': spending, 'Satisfaction': satisfaction})

# 查看原始数据集的类别分布
print(f"Original dataset shape: {Counter(data['Satisfaction'])}")

# 可视化原始数据集
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['Age'], y=data['Spending'], hue=data['Satisfaction'], palette='viridis', alpha=0.6)
plt.title('Original Dataset')
plt.xlabel('Age')
plt.ylabel('Spending')

# 进行SMOTE过采样
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(data[['Age', 'Spending']], data['Satisfaction'])

# 将过采样后的数据转换为 DataFrame
resampled_data = pd.DataFrame(X_res, columns=['Age', 'Spending'])
resampled_data['Satisfaction'] = y_res

# 查看过采样后的数据类别分布
print(f"Resampled dataset shape: {Counter(y_res)}")

# 可视化过采样后的数据集
plt.subplot(1, 2, 2)
sns.scatterplot(x='Age', y='Spending', hue='Satisfaction', data=resampled_data, palette='viridis', alpha=0.6)
plt.title('SMOTE Resampled Dataset')
plt.xlabel('Age')
plt.ylabel('Spending')

plt.tight_layout()
plt.show()

# 数据平衡前后的类别分布直方图
fig, axes = plt.subplots(1, 2, figsize=(12, 6))

sns.histplot(data['Satisfaction'], ax=axes[0], bins=2, kde=False)
axes[0].set_title('Original Dataset Class Distribution')
axes[0].set_xlabel('Class')
axes[0].set_ylabel('Frequency')

sns.histplot(y_res, ax=axes[1], bins=2, kde=False)
axes[1].set_title('SMOTE Resampled Dataset Class Distribution')
axes[1].set_xlabel('Class')
axes[1].set_ylabel('Frequency')

plt.tight_layout()
plt.show()

代码解析

  1. 加载和生成数据:模拟一个不平衡的客户满意度数据集,其中包括客户年龄、消费金额和满意度。
  2. 定义数据增强函数:使用 SMOTE 方法进行过采样,平衡满意度类别的分布。
  3. 数据增强示例:使用 SMOTE 方法生成新的样本,使得满意和不满意的样本数量相等,并使用 Matplotlib 和 Seaborn 可视化原始和增强后的数据集。

数据平衡步骤详解

  1. 生成示例数据集
    • 创建一个不平衡的客户满意度数据集,年龄和消费金额为特征,满意度为标签。
  1. 查看原始数据集的类别分布
    • 使用 Counter 统计类别分布,观察数据不平衡情况。
  1. 可视化原始数据集
    • 使用 Seaborn 的 scatterplot 方法可视化原始数据集中客户年龄和消费金额的分布情况。
  1. 进行SMOTE过采样
    • 使用 SMOTE 方法对数据进行过采样,生成新的少数类样本,平衡类别分布。

  1. 查看过采样后的数据类别分布
    • 再次使用 Counter 统计类别分布,验证数据平衡情况。
  1. 可视化过采样后的数据集
    • 使用 Seaborn 的 scatterplot 方法可视化过采样后的数据集中客户年龄和消费金额的分布情况。
  1. 数据平衡前后的类别分布直方图
    • 使用 Matplotlib 绘制数据平衡前后的类别分布直方图,对比数据增强效果。

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

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

相关文章

Github个人网站搭建详细教程【Github+Jekyll模板】

文章目录 前言一、介绍1 Github Pages是什么2 静态网站生成工具3 Jekyll简介Jekyll 和 GitHub 的关系 4 Mac系统Jekyll的安装及使用安装Jekyll的简单使用 二、快速搭建第一个Github Pages网站三、静态网站模板——Chirpy1 个人定制 四、WordPress迁移到Github参考资料 前言 23…

chrome浏览器驱动(所有版本)

chrome浏览器驱动 114之前版本 https://chromedriver.storage.googleapis.com/index.html 125以后 125以后版本下载链接在此,只有后面status是绿色对勾的才可以下载,驱动大版本一致就可以使用,不需版本号一模一样;下载所需版本只…

STM32智能工业监控系统教程

目录 引言环境准备智能工业监控系统基础代码实现:实现智能工业监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:工业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能工业监控系统通…

Java集合框架2024最通俗易懂(图片超全)

集合 1.1、定义 集合就是类型统一的数据组合而成的数据结构,该数据结构可以任意的改变长度。 1.3、Set Set数据存储结构,无序,且不可以重复,元素可以为null,但是也只能出现一次,如下图: 1.3.1、HashSe…

2. 卷积神经网络无法绕开的神——LeNet

卷积神经网络无法绕开的大神——LeNet 1. 基本架构2. LeNet 53. LeNet 5 代码 1. 基本架构 特征抽取模块可学习的分类器模块 2. LeNet 5 LeNet 5: 5 表示的是5个核心层,2个卷积层,3个全连接层.核心权重层:卷积层、全连接层、循环层&#xff…

从零开始学习网络安全渗透测试之基础入门篇——(二)Web架构前后端分离站Docker容器站OSS存储负载均衡CDN加速反向代理WAF防护

Web架构 Web架构是指构建和管理Web应用程序的方法和模式。随着技术的发展,Web架构也在不断演进。当前,最常用的Web架构包括以下几种: 单页面应用(SPA): 特点:所有用户界面逻辑和数据处理都包含…

Apache Nifi挂接MQTT与Kafka实践

目录 1. 说明: 2. 方案设计: 2.1 资源配置: 2.2 交互Topics: 3. 实现步骤 3.1 Nifi 桌面 3.2 MqttToKafka 3.2.1 配置 3.2.2 测试 3.2.3 结果 3.3 KafkaToMqtt 3.3.1 配置 3.3.1 测试 3.3.1 结果 ​编辑 4. 总结&#xff…

web学习笔记(八十三)git

目录 1.Git的基本概念 2.gitee常用的命令 3.解决两个人操作不同文件造成的冲突 4.解决两个人操作同一个文件造成的冲突 1.Git的基本概念 git是一种管理代码的方式,广泛用于软件开发和版本管理。我们通常使用gitee(码云)来云管理代码。 …

使用SpringTask框架

目录 一.什么是SpringTask? 二.cron表达式: 三.SpringTask框架的使用操作: 1.导入maven坐标spring-context: 2.启动类添加 EnableScheduling 以此来开启任务调度: 3.自定义定时任务类: 普通案例&#…

如何写好技术文档 - 来自Google十多年的文档经验

[导读]本文大部分内容翻译总结自《Software Engineering at Google》第10章节 Documentation。另外,该书电子版近日已经可以免费阅读了https://qiangmzsx.github.io/Software-Engineering-at-Google/#/?idsoftware-engineering-at-google,有兴趣的同学可…

Dockerfile指令详解和Docker操作命令

1.容器的特点:1)自包含(包括应用程序及其运行环境);2)可移植;3)相互隔离;4)轻量级。 2.docker成为容器的事实标准在于:1)在运行环境上…

Unity 资源 之 Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享

精彩呈现:Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享 一、Pop It 3D 解压玩具的魅力二、双人游戏的互动乐趣三、Unity 游戏资源包的优势四、如何获取资源包 亲爱的游戏爱好者们,今天为大家带来一款令人兴奋的游戏资源——Pop It 3D 解压玩具双人带…

ubuntu串口重命名助手arm64架构(下)Qt交叉编译arm64

✨✨ Rqtz 个人主页 : 点击✨✨ 🎈PyQt系列专栏:点击🎈 🎈Qt智能车上位机专栏: 点击🎈 🎈Qt串口助手专栏:点击🎈 💫宗旨:共享IT之美,共创机器未来 目录 前言 设备介绍 查询系统架构 下载…

【JVM基础05】——组成-能不能解释一下方法区?

目录 1- 引言:方法区概述1-1 方法区是什么?(What)1-2 为什么用方法区?方法区的作用 (Why) 2- ⭐核心:详解方法区(How)2-1 能不能解释一下方法区?2-2 元空间内存溢出问题2-3 什么是常量池?2-4 运行时常量池 …

Stable Diffusion WebUI本地环境搭建

一、项目代码下载 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、环境配置 conda create --n stafu python3.10.6 实际上跟自己创建的环境没有关系,项目启动会自动复制这个环境,之后项目根据这个基础环境构建 也可以在自己…

【五】MySql8基于m2芯片arm架构Ubuntu24虚拟机安装

文章目录 1. 更新系统包列表2. 安装 MySQL APT Repository3. 更新系统包列表4. 安装 MySQL Server5. 运行安全安装脚本6. 验证 MySQL 安装7. 配置远程连接7.1 首先要确认 MySQL 配置允许远程连接:7.2 重启 MySQL 服务:7.3 检查 MySQL 用户权限&#xff1…

TensorRT推理时间不稳定的解决方案

目录 解决方案 第一步 第二步 效果 解除锁频方法 解决方案 锁定GPU时钟频率(实测有效) 第一步 使用 nvidia-smi -q -d SUPPORTED_CLOCKS 查询GPU支持的最高频率,如下图所示为 8001 MHz 第二步 cmd(管理员权限&#xff09…

0719_驱动2 编写编译linux内核模块

一、编写linux内核模块 linux内核模块三要素&#xff1a; 入口&#xff1a;执行insmod 安装命令操作 出口&#xff1a; 执行rmmod 卸载命令操作 许可证&#xff1a;遵循GPL协议&#xff0c;开源&#xff0c;指定入口地址&#xff0c;出口地址 #include <linux/init.h> #i…

JAVA同城圈子达人交友系统源码支持微信小程序+公众号+H5+APP

&#x1f308; 同城圈子达人交友系统&#xff0c;遇见志同道合的TA&#xff01; &#x1f389; 开篇&#xff1a;告别孤单&#xff0c;同城圈子等你来探索&#xff01; 在这个快节奏的城市生活中&#xff0c;你是否常常感到孤独&#xff0c;渴望找到一群志同道合的朋友&#…

SQL labs-SQL注入(三,sqlmap使用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言&#xff1a; 盲注简述&#xff1a;是在没有回显得情况下采用的注入方式&#xff0c;分为布尔盲注和时间盲注。 布尔盲注&#xff1a;布尔仅有两种形式&#xff0c;ture&#…