不平衡学习(Imbalanced learning)

不平衡数据的定义

顾名思义即我们的数据集样本类别极不均衡,以二分类问题为例,数据集中的多数类 为Smax,少数类为Smin,通常情况下把多数类样本的比例为100:1、1000:1,甚至是10000:1这种情况下为不平衡数据。

为什么不平衡学习

因为传统的学习方法以降低总体分类精度为目标,将所有样本一视同仁,同等对待,造成了分类器在多数类的分类精度较高而在少数类的分类精 度很低。例如正负样本50:1的例子,算法就算全部预测为另一样本,准确率也会达到98%(50/51),因此传统的学习算法在不平衡数据集中具有较大的局限性。

不平衡学习的方法

解决方法主要分为两个方面:

  • 第一种方案主要从数据的角度出发,主要方法为抽样,既然我们的样本是不平衡的,那么可以通过某种策略进行抽样,从而让我们的数据相对均衡一些;

  • 第二种方案从算法的角度出发, 考虑不同误分类情况代价的差异性对算法进行优化,使得我们的算法在不平衡数据下也能有较好的效果。

采样

随机采样

采样算法通过某一种策略改变样本的类别分布,以达到将不平衡分布的样本转化为相对平衡分布的样本的目的,而随机采样是采样算法中最简单也最直观易 懂的一种方法。随机采样主要分为两种类型,分别为随机欠采样和随机过采样两种。

随机欠采样顾名思义即从多数类Smax中随机选择少量样本E再合 并原有少数类样本作为新的训练数据集,新数据集为Smin+E,随机欠采样有两种类型分别为有放回和无放回两种,无放回欠采样在对多数类某样本被采 样后不会再被重复采样,有放回采样则有可能。

随机过采样则正好相反,即通过多次有放回随机采样从少数类Smin中抽取数据集E,采样的数量要大 于原有少数类的数量,最终的训练集为Smax+E。

显然,随机采样是通过改变多数类或者少数类的样本比例达到修改样本分类分布的目的,其中也存在着诸多的问题,例如随机欠采样,由于丢失了一些样本,造成一些信息的缺失,如果未被采样的样本具有重要的信息呢?而过采样扩大了数据集,训练模型的复杂度会加大,而且有可能造成过拟合的情况。

SMOTE算法

SMOTE全称是Synthetic Minority Oversampling Technique即合成少数类过采样技术,SMOTE算法的基本思想SMOTE算法的基本思想是对少数类样本进行分 析并根据少数类样本人工合成新样本添加到数据集中,具体如图2所示,算法流程如下。

  1. 对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集Smin中所有样本的距离,得到其k近邻。

  2. 根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x^。

  3. 对于每一个随机选出的近邻x^,分别与原样本按照如下的公式构建新的样本。

    xnew=x+rand(0,1)∗(x^−x)

图2 SMOTE算法

SMOTE算法摈弃了随机采样复制样本的做法,使得算法的性能有所提升,但由于每个少数样本都会产生新样本,也会产生样本重叠的问题,下面介绍其改进算法。

Borderline-SMOTE算法

在Borderline-SMOTE中,若少数类样本的每个样本xi求k近邻,记作Si−knn,且Si−knn属于整个样本集合S而不再是少数类样本,若满足

k2<|si−knn∩smax|<k

即k近邻中超过一半是多数样本。

则将样本xi加入DANGER集合,显然DANGER集合代表了接近分类边界的样本,将DANGER当作SMOTE种子样本的输入生成新样本。特别地,当上述条件取右边界,即k近邻中全部样本都是多数类时此样本不会被选择为种样本生成新样本,此情况下的样本为噪音。

图3 Borderline-SMOTE算法

Informed Undersampling

前面讲了关于过采样的的算法,那么下面就是欠采样算法informed undersampling,informed undersampling采样技术主要有两种方法分别是EasyEnsemble算法和BalanceCascade算法。

EasyEnsemble算法如下图所示,此算法类似于随机森林的Bagging方法,它把数据划分为两部分,分别是多数类样本和少数类样 本,对于多数类样本Smaj,通过n次有放回抽样生成n份子集,少数类样本分别和这n份样本合并训练一个模型,这样可以得到n个模型,最终的模型是 这n个模型预测结果的平均值。

BalanceCascade算法是一种级联算法,BalanceCascade从多数类Smax中有效地选择N且满 足∣N∣=∣Smin∣,将N和Smin合并为新的数据集进行训练,新训练集对每个多数类样本xi进行预测 若预测对则Smax=Smaj−xi。依次迭代直到满足某一停止条件,最终的模型是多次迭代模型的组合。

核心思想:使用之前已形成的集成分类器来为下一次训练选择多类样本,然后再进行欠抽样。

靶点生物活性数据不平衡处理示例


导入库

%matplotlib inline
from rdkit importChem
from rdkit.ChemimportAllChem
from rdkit.ChemimportDataStructs
from sklearn.ensemble importRandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import ADASYN
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPythonimport display
from sklearn.decomposition import PCA

载入数据预处理并查看

df = pd.read_csv('chembl_5HT.csv')
df = df.dropna()
df.head()

定义类别pIC50> 8为active,其他类别为inactive

df['CLS'] = np.array(df.pchembl_value > 9, dtype=np.int)

查看数据分布

plt.hist(df.CLS)

活性数据和非活性数据比例接近13000:1,非平衡数据

计算分子指纹

mols = [Chem.MolFromSmiles(smi) for smi in df.canonical_smiles]
fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 2) for mol in mols]

定义函数指纹转数组

def fp2np(fp):arr = np.zeros((0,))DataStructs.ConvertToNumpyArray(fp, arr)return arr
X = np.array([fp2np(fp) for fp in fps])
Y = df.CLS.to_numpy()

数据没有进行抽样

train_X, test_X, train_Y, test_Y = train_test_split(X, Y, random_state=123, test_size=0.2)
print(train_X.shape)
print(train_Y.shape)
print(sum(train_Y)/len(train_Y))

(11340, 2048)

(11340,)

0.08686067019400352

随机森林模型

rf = RandomForestClassifier(n_estimators=10)
rf.fit(train_X, train_Y)
pred_Y = rf.predict(test_X)
print(classification_report(test_Y, pred_Y))
print(confusion_matrix(test_Y, pred_Y))

基于SMOTE算法的随机抽样

X_resampled, Y_resampled = SMOTE().fit_resample(train_X, train_Y)
print(X_resampled.shape)
print(Y_resampled.shape)
print(sum(Y_resampled)/len(Y_resampled))

(20710, 2048)

(20710,)

0.5

随机森林模型

代码示例

rf = RandomForestClassifier(n_estimators=10)
rf.fit(X_resampled, Y_resampled)
pred_Y = rf.predict(test_X)
print(classification_report(test_Y, pred_Y))
print(confusion_matrix(test_Y, pred_Y))

X_resampled, Y_resampled = ADASYN().fit_resample(train_X, train_Y)
print(X_resampled.shape)
print(Y_resampled.shape)
print(sum(Y_resampled)/len(Y_resampled))

(20884, 2048)

(20884,)

0.5041658686075464

rf = RandomForestClassifier(n_estimators=10)
rf.fit(X_resampled, Y_resampled)
pred_Y = rf.predict(test_X)
clsreport = classification_report(test_Y, pred_Y)

PCA分析

代码示例

pca = PCA(n_components=3)
res = pca.fit_transform(X)
col = {0:'blue', 1:'red'}
color = [col[np.int(i)] for i in Y]
plt.figure(figsize=(10,7))
plt.scatter(res[:,0], res[:,1], c=color, alpha=0.5)


参考资料

  • https://blog.csdn.net/hren_ron/article/details/81172044

  • http://www.360doc.com/content/17/1023/09/42392246_697348454.shtml

RDKit | 化合物活性数据的不平衡学习相关推荐

  1. RDKit | 化合物活性数据的不平衡学习

    不平衡学习(Imbalanced learning) 不平衡数据的定义 顾名思义即我们的数据集样本类别极不均衡,以二分类问题为例,数据集中的多数类 为Smax,少数类为Smin,通常情况下把多数类样本 ...

  2. [深度学习技巧]·数据类别不平衡问题处理

    数据类别不平衡问题处理 转载地址 1.什么是类别不平衡问题 如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰.例如有998个反例,但是正例只有2个,那么学习方法只 ...

  3. 基于机器学习的化合物活性预测模型

    利用化合物的结构与活性数据,基于RDKit和Python3的机器学习活性预测模型小示例. 代码示例: #导入必须的包 #!/usr/bin/env python3 from rdkit.Chem im ...

  4. 深入理解机器学习——类别不平衡学习(Imbalanced Learning):应用领域

    类别不平衡学习技术并不仅仅停留在理论上,在很多现实世界的应用领域中,都会用到此类技术.其应用领域包括但不限于以下几方面. 网络入侵检测 目前,随着互联网产业的快速发展,人类的日常生活和网络的联系也变得 ...

  5. 值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(下)

    作者 | 黄浴 来源 | 转载自知乎专栏自动驾驶的挑战和发展 [导读]在近日发布的<值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)>一文中,作者介绍了一部分各大公司和机构基于 ...

  6. Github|类别不平衡学习资源(下)

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 139 篇文章,本文大约 3600 字,阅读大约需要 10 分钟 继续 ...

  7. Github|类别不平衡学习资源(上)

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 138 篇文章,本文大约 5400 字,阅读大约需要 15 分钟 今天 ...

  8. 数据类别不平衡/长尾分布?不妨利用半监督或自监督学习

    本文转载自知乎,已获作者授权转载,请勿二次转载. 链接:https://zhuanlan.zhihu.com/p/259710601 来给大家介绍一下我们的最新工作,目前已被NeurIPS 2020接 ...

  9. 类别不平衡学习:论文/代码/框架/库

    作者:ZhiningLiu1998 编译:CV君 今天向大家介绍一个跟踪不平衡学习问题的Github资源仓库,文末附其中 7 篇相关综述论文下载. Github地址: https://github.c ...

最新文章

  1. 存储过程排版工具_我的绘图工具箱
  2. 探讨一下Java单例设计模式
  3. Cachefiled
  4. Java基础部分快速复习(以前复习的时候放在自己的新浪博客上)
  5. 一生只有一个配偶的动物,如果一方死亡了,另一方会怎么办?
  6. 1619. [HEOI2012]采花
  7. python windows 消息通讯_如何使用python與windows中的事件/消息掛鈎
  8. 是什么让你萌发了跳槽的念头?
  9. 基于node.js的微博博客实现
  10. Linux网络属性及其配置
  11. 关于学习BEX5的问题
  12. 全球与中国消防系统市场现状及未来发展趋势
  13. 四大行、城商行等银行都在使用什么数据库?
  14. VPP线程之间报文调度
  15. matlab 7x5 棋盘格,matlab画棋盘格程序
  16. VBA - 粘贴为数值型
  17. 抖音SEO优化源码,企业号搜索排名系统,矩阵分发。
  18. Problem-A 老衲的嘱托
  19. rust - trait学习
  20. python coding style_python coding style guide 的高速落地实践

热门文章

  1. 云原生时代,Java还有优势么?
  2. 菜鸟实时数仓2.0进阶之路
  3. Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...
  4. 告诉你一种精简、优化代码的方式
  5. 远程办公让企业生产力大打折扣?那是你的打开方式错了
  6. 推荐10个安全又有实力的办公软件,极大提升办公效率
  7. 如何判断Java中两个Class对象是否相同
  8. 嵌入式系统学习笔记之五-- uboot常用命令 概述
  9. 16DOM之事件基础
  10. Python3中一些有用的函数