使用不平衡数据集练习机器学习

news2024/11/28 12:47:58

 一、介绍

        在当今世界,机器学习和人工智能几乎被广泛应用于每个领域,以提高绩效和结果。但如果没有数据,它们还有用吗?答案是否定的。机器学习算法严重依赖我们提供给它们的数据。我们提供给算法的数据质量在很大程度上决定了机器学习模型的结果和性能。问题是可用的数据很少是完美的。因此,我们必须修改数据集以充分利用它。

        学习目标

        在本文中,我们将使用机器学习讨论一个这样有趣的数据集,并了解如何修改它以使其接近完美。我们将了解 

1. python 中一些有趣的库用于修改数据集、创建模型并对其进行评估。

2. 如何进行探索性数据分析和特征工程?

3.如何处理异常值?

4. 什么是采样?它是如何执行的?

本文作为数据科学博客马拉松的一部分发表。

        目录

  1. 该项目是关于什么的?
  2. 问题陈述
  3. 在进一步之前,请了解一些先决条件!
  4. 了解更多关于数据集的信息
  5. EDA 和目标数据分析
  6. 查找数据集中的异常值
  7. 通过特征工程转换特征
  8. 是冷的!热图在哪里?
  9. 造型
  10. 数据足够好吗?
  11. 消除数据集中的不平衡
  12. 理解数据采样
    12.1 欠采样
    12.2 过采样
  13. 结论

二、该项目是关于什么的?

        对于任何希望保护家人和资产免受财务风险和损失的人来说,保险单是一个很好的方式。这些计划可帮助您支付任何医疗护理和紧急情况的费用。就车辆保险而言,它有助于支付任何车辆损坏或由车辆造成的损坏。法律规定每个机动车车主都必须拥有汽车保险。为了保证对这些损失进行赔偿,保险公司会要求客户支付少量保费。虽然风险很高,但发生这些损害的概率非常低,比如百分之二。这样,每个人都分担了其他人的风险。

        提供这些医疗和车辆保险的保险公司高度依赖机器学习来改善客户服务、运营效率和欺诈检测。该公司利用用户的经验来预测是否会出现由该客户或该客户造成的事故。在签发任何保单之前,公司可能会收集年龄、性别、健康状况、病史等详细信息。

三、问题陈述

        在本文中,我们将使用车辆保险数据来预测客户是否有兴趣购买车辆的保险单。理想情况下,我们在机器学习中使用的数据集应该具有平衡的目标变量比例,以便模型给出无偏差的结果。但正如我们之前讨论的,样本群体中发生任何事故的概率非常罕见。同样,一个人有兴趣从样本中购买保险单的机会也相当低。因此,我们在本文中使用的数据集是高度不平衡的,我们将看到按原样使用该数据集将如何导致不良且有偏差的结果。因此,在进入建模部分之前,我们必须首先应用技术来平衡数据。

3.1 在进一步之前,请了解一些先决条件!

          对于这个项目,您应该对 python 和Pandas、Numpy和Sklearn 等库有基本的了解。您应该了解机器学习中使用的基本术语,例如训练和测试数据、模型拟合、分类、回归、混淆度量以及逻辑回归、K 最近邻等基本机器学习算法。此外,探索性的粗略想法像 Matplotlib 和 seaborn 这样的数据分析和绘图库将会很有帮助。

3.2 了解更多关于数据集的信息

我        们将在本文中使用的数据集是不平衡保险数据。该数据集可以通过此链接下载。使用此数据集的目的是预测客户是否有兴趣购买车辆保险。为了预测这种客户行为,数据集中有几个特征。该数据集包括客户的年龄、性别、区号、车龄、车辆损坏等人口统计信息,还包含客户之前是否购买过保险、客户支付的保费以及保单等信息销售渠道。该数据集中的目标变量是响应变量,表示客户是否购买了车辆保险。

        该数据集包含 3,82,154 行和 12 列,包括响应变量。为了了解有关数据集的更多信息,我们将使用 pandas 中的一些基本函数。

        python代码:

import numpy as np
import pandas as pd

data = pd.read_csv("aug_train.csv")
print(data.head())

        在上面的代码片段中,我们使用 pandas.DataFrame.head() 函数来获取数据集中的前 5 个观测值。这将帮助我们了解我们将处理什么样的价值观。与 head 函数类似,您可以使用 pandas.DataFrame.tail() 函数获取数据集中的最后 5 个值。如果您想获取更多或更少的几行,您可以在函数中给出一个数字作为参数。

        pandas.DataFrame.shape 允许我们获取数据集的结构。我们现在知道数据集包含 12 列和 3,82,154 条记录。

P        pandas.dataFrame.describe() 函数提供了有关数据集的许多见解。此功能返回数据集的描述性统计数据,让我们了解分布的频率、集中趋势和离散度。此函数非常有用,但应小心一些,因为某些值可能没有意义。例如,在数据集中,区域代码是一个名义变量(可以分类但不能排名的数据),它的平均值没有意义。但是describe函数将其假定为整数值并返回平均区域码和区域码的标准差,这本身听起来很荒谬。

四、EDA 和目标数据分析

        我们现在已经理解了问题陈述并对数据集有所了解。我们有了一个良好的开端,但关于该数据集还有很多东西需要了解。我们首先检查数据集是否包含任何空值。

从        上面的代码片段可以清楚地看出,数据集不包含任何空值。但是,如果您的数据集确实包含空值,那么您应该访问此链接。

接        下来,我们将分析目标变量,即响应变量。我们将看到响应变量如何分布在数据集中。

从上面的代码片段中,我们可以看到 Response 变量的值计数。我们看到响应变量高度不平衡,0 表示无响应是大多数类别。0 类表示客户对购买保险不感兴趣,而 1 类表示客户有兴趣。让我们使用饼图查看此分布的比率。这是我们使用绘图库 matplotlib 的地方。

        要了解有关 matplotlib 饼图参数的更多信息,请参阅此链接。从上面的饼图我们可以看到,Response类的分布比例几乎是84:16。事实上,数据集可能更加不平衡。因此,为了使其更有趣,我们将从正类中删除一些值。

我们从正类中随机选择并丢弃 70% 的值,现在如您所见,不平衡比率为 95:5。

五、查找数据集中的异常值

        在此步骤中,我们将在数据集中查找异常值。离群值是与总体中的其他值相比似乎异常的观察结果。异常值的原因可能是数据输入错误、抽样问题和异常情况。处理异常值很重要,因为它会降低统计功效并增加数据集中的变异性。

        通常,最好不要为了得到更好的拟合模型而删除异常值,因为这可能会导致重要的合法信息丢失。然而,在本文中,我们的主要目的是学习如何处理不平衡数据,并且数据点很多。因此,我们可以考虑删除异常值。您可以参考此链接了解如何处理异常值。

        我们将使用四分位数范围方法来查找数据集中的异常值。四分位数范围包含数据集第二和第三季度值所在的值。任何位于 (q1-1.5*IQR) 和 (q3+1.5*IQR) 之外的值都被视为异常值。

        正如您在上面的代码片段中看到的,数据集中大约有 9000 个异常值。与原始数据集的大小相比,异常值的大小相当小。因此,我们可以从数据集中删除这些异常值。我们发现近 8500 个异常值属于负类,而大约 600 个异常值属于正类。因此,在删除这些异常值后,数据集的最终大小包含 3,10,857 个正响应类值和 18,147 个负响应类值。

六、  通过特征工程转换特征

在此步骤中,我们将处理数据集中的分类数据。数据集的性别和车辆损坏特征具有二进制数据;也就是说,只有两个可能的值。因此,就性别而言,我们将男性指定为 1,女性指定为 0。同样,如果车辆损坏,我们将“是”指定为 1,将“否”指定为 0。然后,我们将特征的数据类型从字符串更改为整数。

如果我们仔细观察数据集,我们会发现区域代码包含浮点值。由于区域代码是名义上的(意味着我们无法对区域代码进行排名,并且无法对区域代码进行比较或取平均值),因此浮点值没有意义。因此,我们将其数据类型更改为int。

数据集中的 id 变量包含用户的唯一键。因此,它对预测响应没有太大帮助。因此,我们将从数据集中删除 id 列。

七、热图在哪里?

在这一部分中,我们将了解这些特征如何相互关联以及它们如何影响响​​应变量。为此,我们将使用 python 中的 matplotlib 和 seaborn 库创建热图。热图是数据的二维图形表示,其中各个值包含在矩阵中并以颜色的形式表示。较浅的阴影表示彼此正相关的值,而较暗的阴影表示彼此负相关的值。热图是查找数据集中最重要元素的好方法,可用于查找数据中有趣的趋势。

        在上图中,您可以观察到每个值都与其自身完全相关,因此值为 1。您可以观察到先前保险的特征和车辆损坏与响应变量显示出相对较高的相关性。其他值几乎没有相关性,但我们仍然可以将它们用于建模部分。

八、 造型

在这一部分中,我们将把数据集分为训练数据和测试数据。我们将使用训练数据进行机器学习和模型,然后测试它在测试数据上的表现。我们将使用 70% 的数据进行训练,并保留 30% 的数据用于测试目的。我们将使用 sklearn 库的训练测试分割函数来执行此操作。

8.1  数据足够好吗?

在处理不平衡数据之前,我们首先创建一个函数来评估数据集。这样,我们就可以轻松评估用于平衡数据的技术。

我们将创建一个评估函数并使用五种机器学习算法在测试数据中进行预测。这些算法是逻辑回归、K 最近邻分类器、决策树分类器、朴素贝叶斯分类器和随机森林分类器。为了检查预测是否正确,我们将使用 f1 分数指标。

为了定义分类算法的执行情况,使用了混淆度量。我们不会详细介绍什么是混淆矩阵。简而言之,混淆矩阵比较模型的预测值和实际值。它可用于查找准确度、精确度、召回率和 f1 分数。您可以参考此链接 了解混淆矩阵。

一般来说,我们使用准确度指标来了解模型的表现如何。但是,如果您浏览上面的链接,您会发现使用 f1 分数是比不平衡数据集中的准确性更好的指标。简而言之,准确度分数无助于了解模型是否适用于这两个类别。相反,f1 分数有助于确定每个响应类的模型性能。

现在我们将使用 sklearn 库导入机器学习算法和用于衡量效率的 f1 分数。

8.2 消除数据集中的不平衡

现在是我们处理数据集中不平衡的部分。但问题来了,如果我们直接使用不平衡数据进行训练会发生什么?

按原样使用数据可能会获得良好的准确性分数,但如前所述,在处理不平衡数据时,准确性并不是正确的指标。

上面的代码片段显示逻辑回归、KNN 和随机森林分类器的 f1 分数几乎为 0。因此,我们可以得出结论,我们不能按原样使用数据,必须处理不平衡的数据。

处理不平衡数据有两种有效的方法:采样和加权。在本文中,我们将讨论采样和采样中的各种技术。

九、了解数据采样

数据采样是一种统计技术,用于操作和分析数据点的子集以识别较大集合中的模式。可以通过减少多数类的样本或增加少数类的样本来实现。采样时要记住的一件重要事情是,它仅应用于训练数据以影响机器学习模型。采样时测试数据保持不变。

9.1 欠采样

欠采样是一种用于平衡不均匀数据集的技术。当数据集包含大量数据点时使用此技术。这里,通过从多数类中删除一些样本来减小多数类的大小,而不对少数类进行任何改变以使其平衡。这是一个非常有用的技术。然而,它会导致信息丢失,因此当数据集已经具有很少的数据点时可以避免。

9.2 随机欠采样

欠采样是一种欠采样技术,其中样本是从多数类中随机选择并从训练数据中删除的。它也被称为朴素采样,因为它不对数据进行任何假设。该技术实现起来快速且简单,因此通常选择复杂且大型的数据集。它可用于二元或多类分类,可能具有一个或多个少数或多数类。

如前所述,随机欠采样可能会导致数据集中有用信息的丢失。解决这个问题的一种方法是使用抽样策略。使用抽样策略,我们可以提供少数类与多数类的所需比例。因此,我们可以决定我们可以承受多少数据丢失。

9.3 最近邻重采样  

这种重采样使用最近邻算法来删除与其邻域不一致的样本。这包括算法的几种变体,例如编辑的最近邻居、重复编辑的最近邻居和 All KNN。这些算法可以在整个数据集上执行,或者特别是在大多数类上执行。

9.4 过采样

过采样是与欠采样相反的技术。在这种技术中,我们重现了少数类的样本并增加了少数类数据集。这种新的少数数据可以通过随机生成(随机过采样)或数学计算(SMOTE 采样)来添加。过采样非常有用;然而,它使得数据集容易过度拟合。

9.5 随机过采样

随机过采样与随机欠采样类似。它不是从多数类中删除样本,而是从少数类中随机选择样本并创建重复项。因此,增加了少数群体的规模。它快速且易于实施。然而,它可能会导致过度拟合。因此,我们可以使用采样策略来进行欠采样和过采样。

9.6 SMOTE(合成少数过采样技术)

它是最常见的过采样技术之一。它通过少数类的线性插值来复制少数类样本。该技术通过从少数类中随机选择一个或多个 k 个最近邻来生成综合训练记录。这种方法是有效的,因为它添加了来自少数类别的新合成样本,这些样本是合理的并且相对接近现有样本。尽管该算法有一个缺点,但它没有考虑多数类样本。因此,如果类之间存在大量重叠,则可能会出现不明确的记录。

9.7 欠采样后过采样

现在我们知道了欠采样和过采样的优缺点,我们可以结合使用它们来充分利用它们。我们可以手动应用欠采样,然后进行过采样,或者使用 imblearn 库。

首先,我们将 SMOTE 过采样与随机欠采样结合起来。在这里,我们将使用采样策略,因为我们不想同时对整个数据进行重新采样。可以调整该参数来改变数据分布并提高最终分数。

接下来,我们将使用 SMOTE 过采样和最近邻欠采样。这种组合已经在 imblearn 库中实现,并被证明是一种有效的采样方法。编辑的最近邻使用 3 个最近邻来定位数据集中那些错误分类的样本。

现在我们已经看到了几种平衡数据的方法。这取决于您使用哪种技术。但您应该对某种技术保持公正,并首先分析数据集,以了解需求并充分利用所有技术。您可以调整采样策略参数以改进结果以满足您的要求。如果你想学习更多采样技术,可以参考imblearn库的原始文档。

十、结论

来源:freepowerpointtemplates.com

在本文中,我们了解了使用机器学习的有趣的车辆保险数据集。我们看到一类如何主要分布在数据集中,而另一类很少存在于数据中。我们对数据进行了探索性数据分析并应用了特征工程。我们了解了为什么不能将这种不平衡数据视为平衡数据集。甚至用于评估不平衡数据的指标也与平衡数据中使用的指标不同。我们研究了如何处理数据不平衡的问题。

要点

1.你知道几种可以用来平衡这些数据的算法,这些算法只能用于建模。

2. 您看到了当数据集按原样使用时与使用采样技术修改数据集时模型的性能如何变化。

3. 了解每种算法的优缺点;最后,我们测试了结合这些采样算法是否会产生更好的结果。

您可以在此 git hub repo中找到本文的代码。读完本文后,我希望您知道如何处理不平衡的数据集。

您可以在这里查看我的更多文章。

您可以在 Linkedin 上与我联系。

 

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

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

相关文章

LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain

思维之树( Tree of Thoughts ToT)是一个算法,它结合了普林斯顿大学和谷歌DeepMind在本文中提出的大型语言模型(LLMs)和启发式搜索。看起来这个算法正在被实现到谷歌正在开发的多模式生成AI Gemini中。 现在&#xff0…

vue2-009——mixin混入

一、基础使用案例 1.1、定义混合 1.2、引入混合 1.2.1、局部混入 1.2.2、全局引入 二、注意点 1、组件和混合有同名变量时,以组件的变量为主 2、组件和混合有同名生命周期钩子时,两者都会生效

c盘清理——常用方法和工具整理

背景 最近c盘满了,只剩下1-2G,周末有空清理一下。对这块不太熟悉,下面只是把今天网上看到的比较好用的工具整理一下。 使用工具 磁盘大小查看工具——TreeSize(收费) 之前都是右键一个个看每个文件的大小&#xff0…

Flutter桌面应用开发之毛玻璃效果

目录 效果实现方案依赖库支持平台实现步骤注意事项话题扩展 毛玻璃效果:毛玻璃效果是一种模糊化的视觉效果,常用于图像处理和界面设计中。它可以通过在图像或界面元素上应用高斯模糊来实现。使用毛玻璃效果可以增加图像或界面元素的柔和感,同…

什么是 Node.js?

在 Node.js 出现之前,最常见的 JavaScript 运行时环境是浏览器,也叫做 JavaScript 的宿主环境。浏览器为 JavaScript 提供了 DOM API,能够让 JavaScript 操作浏览器环境(JS 环境)。 2009 年初 Node.js 出现了&#xf…

USB简介系列-02

系列文章目录 USB简介之二 文章目录 系列文章目录USB数据流一、USB总线二、USB收发器三、USB速率识别三、USB总线状态总结USB数据流 本部分讨论USB低速和全速模式下的数据流。 一、USB总线 想象一下USB主机根集器下级联了集线器和设备的设置,如下图示。我们需要记住的是,在…

FFmpeg零基础学习(二)——视频文件信息获取

目录 前言正文一、获取宽高信息1、核心代码2、AVFormatContext3、avformat_alloc_context4、avformat_open_input5、avformat_find_stream_info6、av_dump_format7、av_find_best_stream End、遇到的问题1、Qt Debug模式avformat_alloc_context 无法分配对象,而Rele…

go对rabbitmq基本操作

一、安装rabbitmq 1、直接使用docker拉取镜像 docker pull rabbitmq:3.82、启动容器 docker run \-e RABBITMQ_DEFAULT_USERadmin \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name rabbit01 \--hostname rabbit01 --restartalways \-p 15672:15672 \-p 5672:…

为什么高斯核是实现尺度空间变换的唯一变换核,并且是唯一的线性核?再研究

请先看,我们前面一篇,尺度为什么是sigma。 下面要说的是,我们研究的是:g(x,y,sigma)和g(x,y,k*sigma)的关系 而不是:I(x,y)和g(x,y,sigma)之间的关系 也不…

十分钟让你搞懂JVM中的GC垃圾回收机制(分代回收)

文章目录 0. 为什么要有垃圾回收?1. 垃圾回收哪个内存区域?2. 如何找到垃圾(死亡对象的判断)2.1 引用计数法2.2 可达性分析法2.3 两种算法的差别 3. 如何清理垃圾(死亡对象的回收)3.1 标记-清楚法3.2 复制法3.3 标记-整理法 4. JVM使用的回收方法4.1 什么是分代回收4.2 哪些对…

数据结构 / day04 作业

1. 单链表任意位置删除, 单链表任意位置修改, 单链表任意位置查找, 单链表任意元素查找, 单链表任意元素修改, 单链表任意元素删除, 单链表逆置 // main.c#include "head.h"int main(int argc, const char *argv[]) {Linklist headNULL; //head 是头指针// printf(&q…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1)爬虫下载原始图片2)手动筛选图片 2. 数据处理3. 模型训练及保存4. 模型测试1)前端2)后端 系统测试1. 测试效果2. 模型应用1&#…

极兔快递查询,极兔快递单号查询,对需要的单号记录进行备注

批量查询极兔快递单号的物流信息,对需要的快递单号记录进行备注。 所需工具: 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左…

redis(Remote Dictionary Service) 底层数据结构

redis 底层数据结构 动态字符串SDS 优点 获取字符串长度的时间复杂度O(1) 支持动态扩容,减少内存分配次数 新字符串小于1M – 新空间为扩展后字符串长度的两倍 1 新字符串大于1M – 新空间为扩展后字符串长度 1M 1. 内存预分配 二进制安全(记录了…

java springboot中使用 AOP监听方法执行周期

首先 我们在 pom.xml 中 dependencies标签中加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>然后 我们随便创建一个类 编写代码如下 package com.ex…

pytorch导出rot90算子至onnx

如何导出rot90算子至onnx 1 背景描述2 等价替换2.1 rot90替换(NCHW)2.2 rot180替换(NCHW)2.3 rot270替换(NCHW) 3 rot导出ONNX 1 背景描述 在部署模型时&#xff0c;如果某些模型中或者前后处理中含有rot90算子&#xff0c;但又希望一起和模型导出onnx时&#xff0c;可能会遇到…

YOLOv5轻量化改进之mobilenetv3,更换mobilenetv3中的注意力机制。

目录 一、原理 二、代码 三、YOLOv5改进 一、原理 我们提出了基于互补搜索技术和新颖架构设计相结合的下一代mobilenet。MobileNetV3通过硬件网络架构搜索(NAS)和NetAdapt算法的结合来调整到移动电话cpu,然后通过新的架构进步进行改进。本文开始探索自动搜索算法和网络设计如…

Java新建项目如何整理项目结构,没有src文件夹

现在IDEA2023中新建项目时, 不会有src文件夹。这时需要自己创建一个src的包&#xff0c;然后将这个包设置为source root。 可能出现没有这个选项的情况&#xff0c;这是需要把设置的当前项目首先Unmark了&#xff0c;然后再对src文件夹mark一下。 src: 这是源代码的根目录。 …

Self Distillation 自蒸馏论文解读

paper&#xff1a;Be Your Own Teacher: Improve the Performance of Convolutional Neural Networks via Self Distillation official implementation&#xff1a; https://github.com/luanyunteng/pytorch-be-your-own-teacher 前言 知识蒸馏作为一种流行的压缩方法&#…