在机器学习中,我们常常会遇到不均衡的数据集。比如癌症数据集中,癌症样本的数量可能远少于非癌症样本的数量;在银行的信用数据集中,按期还款的客户数量可能远大于违约客户的样本数量。
 
比如非常有名的德国信用数据集,正负样本的分类就不是很均衡:
 
 
如果不做任何处理简单地进行训练,那么训练结果中(以SVM为例),大部分好客户(约97%)能被正确地识别为好客户,但是大部分的坏客户(约95%)却会被识别为好客户。这个时候,如果我们仅仅使用accuracy来评价模型,那么银行可能会承受违约带来的巨大损失。在南大周志华老师的《机器学习》“模型的选择与评价”部分中,就提到了使用Precision、Recall、F1 Score(加权平均Precision和Recall)等更全面评价模型的方法。本文将探讨如何解决机器学习中遇到的分类非均衡问题:
  • 过采样 Over-sampling
  • 下采样 Under-sampling
  • 上采样与下采样结合
  • 集成采样 Ensemble sampling
  • 代价敏感学习 Cost-Sensitive Learning
注:github开源项目github-scikit-learn-contrib/imbalanced-learn中提供了本回答中大部分算法的实现代码,并配有详细的文档和注释。
 

过采样 Over-sampling

过采样即是将本来数量少的那类样本增加。目前比较常见的方法包含了SMOTE, ADASYN, SVM SMOTE,bSMOTE。其中,SMOTE和ADASYN算法的实现也可以参考这个github项目
我可视化了一下结果:比如说在下图中,蓝色三角形代表的是多数样本(不妨设为正例),绿色三角形代表的是原始的少数样本(不妨设为反例),而红色圆点则是使用SMOTE算法生成的反例。
类似地,ADASYN也可以有类似的效果。
不过,SMOTE在一些情况下表现得并不是特别好,也不是很稳定,这也与它本身的算法思路有关。我们可以对比一下在下面情况下SMOTE和ADASYN的表现:
但ADASYN也不是完美无缺的——当分割两个类别样本能够清晰地被划分而且数据点间隔很大时ADASYN会出现NaN。例如在以下的情况,ADASYN就很可能会出问题:
 

下采样 Under-sampling

下采样即是将本来数量多的那类样本减少。随机下采样就不用说了,实现非常简单。但它的表现并不是很好,因此又有了一些新方法,比较知名的有:

上采样与下采样结合

顾名思义,将原本比较多的样本所属类别的样本减少,同时也将原本属于少数的样本类别中的样本增加。
 

集成采样 Ensemble sampling

如我们所知,一些下采样的方法可能会使我们丢失一些比较重要的数据点,但是Xu-Ying Liu, Jianxin Wu, and Zhi-Hua Zhou的论文Exploratory Undersampling for Class-Imbalance Learning中提出了EasyEnsemble和BalanceCascade的方法一定程度上解决了这个问题。
在论文中,作者提到,EasyEnsemble的思想有一部分与Balanced Random Forests相似,但是EasyEnsemble使用了样本来随机训练决策树。
 

代价敏感学习 Cost-Sensitive Learning

我们都知道比起将一个正常客户误判为不良贷款客户,将一个不良贷款客户误判为正常客户可能会给银行带来更大的损失;比起将非癌症病人误判为癌症病人,将癌症病人误判为非癌症病人可能会导致治疗无法及时进行从而导致更严重的后果。于是就有了cost-sensitive learning这样的思路——来解决这种样本分类不均衡的问题。这部分可以参考Charles X. Ling, Victor S. Sheng的论文Cost-Sensitive Learning and the Class Imbalance Problem
 
 
版权声明:本文是原创博文,请勿转载,违者必究。

【Machine Learning】如何处理机器学习中的非均衡数据集?的更多相关文章

  1. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 17—Large Scale Machine Learning 大规模机器学习

    Lecture17 Large Scale Machine Learning大规模机器学习 17.1 大型数据集的学习 Learning With Large Datasets 如果有一个低方差的模型 ...

  2. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  3. 【Machine Learning】机器学习の特征

    绘制了一张导图,有不对的地方欢迎指正: 下载地址 机器学习中,特征是很关键的.其中包括,特征的提取和特征的选择.他们是降维的两种方法,但又有所不同: 特征抽取(Feature Extraction): ...

  4. 人工智能(Machine Learning)—— 机器学习

    https://blog.csdn.net/luyao_cxy/article/details/82383091 转载:https://blog.csdn.net/qq_27297393/articl ...

  5. 機器學習基石(Machine Learning Foundations) 机器学习基石 课后习题链接汇总

    大家好,我是Mac Jiang,非常高兴您能在百忙之中阅读我的博客!这个专题我主要讲的是Coursera-台湾大学-機器學習基石(Machine Learning Foundations)的课后习题解 ...

  6. 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答

    今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到非常多困难,当我在网上寻找答案时却找不到,而林 ...

  7. 機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 Q13-20 MATLAB实现

    大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业四 Q13-20的MATLAB实现. 曾经的代码都 ...

  8. [Machine Learning] 深度学习中消失的梯度

    好久没有更新blog了,最近抽时间看了Nielsen的<Neural Networks and Deep Learning>感觉小有收获,分享给大家. 了解深度学习的同学可能知道,目前深度 ...

  9. 《Hands-On Machine Learning with Scikit-Learn&TensorFlow》mnist数据集错误及解决方案

    最近在看这本书看到Chapter 3.Classification,是关于mnist数据集的分类,里面有个代码是 from sklearn.datasets import fetch_mldata m ...

随机推荐

  1. windows安装多个版本的jdk,解决java-version和javac-version版本不一致的问题

    系统先装了jdk1.8 ,环境变量里配置的是jdk1.8,java -version 与javac -version 版本一致. 然后安装了jdk1.6 ,环境变量java_home 改成了1.6,但 ...

  2. mysql碰到的问题总结

    1.问题描述: 连接数据库出现大约10s延迟后才能连接,排除网络问题 解决方案: 通过抓包工具tcpdump抓包分析mysql在连接开始有近10s的空白请求,问题原因就在这 ,不知道在执行什么请求,后 ...

  3. Android 微信页面刷新问题

    今天测试妹纸提了个bug,Android手机用微信打开测试页面,刷新功能无效.因为开发时懒,只验证了Ios手机无异常,没有注意打安卓这个问题. 我是直接用的window.location.reload ...

  4. Java代码注释

    单行注释: 选中代码,按下ctrl+/ 一条代码单行注释:选中一条代码按下ctrl+/,则为一条代码单行注释: 多条代码单行注释:选中多条代码按下ctrl+/,则为多条代码单行注释: 取消注释:对已经 ...

  5. Manjaro Linux KDE个人的一些安装配置

    安装manjaro kde linux的个人步骤 1 换源 1.1 自动寻找最快的源 sudo pacman-mirrors -i -c China -m rank 1.2 修改源文件 sudo ge ...

  6. JZ2440开发板:修改ARM芯片时钟(学习笔记)

    想要修改ARM芯片的时钟,需要去查询芯片手册和原理图,获取相关的信息(见下方图片) 首先来看时钟的结构图 根据结构图可以看出,时钟源有两种选择:1. XTIpll和XTOpll所连接的晶振 2. EX ...

  7. Django中ORM简述

    ORM:对象关系映射(Object Relational Mapping,简称ORM) 作用:根据类生成表结构,将对象.列表的操作转换成对象的SQL语句,将SQL语句查询的结果转换为对象或列表 优点: ...

  8. Oracle,SQL Server 数据库较MySql数据库,Sql语句差异

    原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...

  9. 成都Uber优步司机奖励政策(3月1日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  10. c++ 面向对象程序设计

    1. OOP:概述 2. 定义基类和派生类 3. 虚函数 4. 抽象基类 5. 访问控制与继承 6. 继承中的类作用域 7. 构造函数与拷贝控制 8. 容器与继承