zoukankan      html  css  js  c++  java
  • 6-机器学习-样本类别分布不均衡处理之过抽样和欠抽样

    总结

    样本类别分布不均衡处理(处理过拟合和欠拟合问题)

    • 过抽样(上采样):通过增加分类中少数类样本的数量来实现样本均衡
      • from imblearn.over_sampling import SMOTE
    • 欠抽样(下采样):通过减少分类中多数类样本的数量来实现样本均衡 (可能造成样本数据大量丢失)
      • from imblearn.under_sampling import RandomUnderSampler 

    样本类别分布不均衡处理

    什么是样本类别分布不均衡

    • 举例说明,在一组样本中不同类别的样本量差异非常大,比如拥有1000条数据样本的数据集中,有一类样本的分类只占有10条,此时属于严重的数据样本分布不均衡。

    样本类别分布不均衡导致的危害

    • 样本类别不均衡将导致样本量少的分类所包含的特征过少,并很难从中提取规律;即使得到分类模型,也容易产生过度依赖与有限的数据样本而导致过拟合问题,当模型应用到新的数据上时,模型的准确性会很差。
    • 解决方法:
      • 通过过抽样和欠抽样解决样本不均衡
        • 也可以叫做上采样,和下采样

    过抽样(over-sampling)

    • from imblearn.over_sampling import SMOTE
    • 通过增加分类中少数类样本的数量来实现样本均衡,比较好的方法有SMOTE算法。
    • SMOTE算法原理介绍:
      • 简单来说smote算法的思想是合成新的少数类样本,合成的策略是对每个少数类样本a,从它的最近邻中随机选一个样本b,然后在a、b之间的连线上随机选一点作为新合成的少数类样本。
      • 参数:k_neighbors
        • 找出类别少的样本点周围最近的k个邻居
    • 环境安装:
      • pip install imblearn
    # 数据源生成
    import pandas as pd
    import numpy as np
    x = np.random.randint(0,100,size=(100,3))
    y = pd.Series(data=np.random.randint(0,1,size=(95,)))
    y = y.append(pd.Series(data=[1,1,1,1,1]),ignore_index=False).values
    y = y.reshape((-1,1))
    all_data_np = np.concatenate((x,y),axis=1)
    np.random.shuffle(all_data_np)
    df = pd.DataFrame(all_data_np)
    df.head()
    
    df.shape  # (100, 4)
    
    df[3].value_counts()  # 样本分类不均衡
    0    95
    1     5
    Name: 3, dtype: int64
    
    X = df[[0,1,2]]
    y = df[3]
    
    from imblearn.over_sampling import SMOTE
    s = SMOTE(k_neighbors=3)
    feature,target = s.fit_sample(X,y)  # 返回一个元组
    
    feature.shape  # 原来100行增加到190  # (190, 3)
    target.shape  # (190,)
    
    target.value_counts()
    1    95
    0    95
    Name: 3, dtype: int64

    欠抽样(under-sampling)

      通过减少分类中多数类样本的数量来实现样本均衡(可能造成样本数据大量丢失)

    • from imblearn.under_sampling import RandomUnderSampler
    from imblearn.under_sampling import RandomUnderSampler
    r = RandomUnderSampler()  # 没有那个n_neighbors参数
    
    a,b = r.fit_sample(X,y)
    
    a.shape  # (10, 3)
    b.shape  # (10,)
    
    b.value_counts()
    1    5
    0    5
    Name: 3, dtype: int64
  • 相关阅读:
    CSharpGL(26)在opengl中实现控件布局/渲染文字
    CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子
    some OpenGL constants
    CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator
    CSharpGL(22)实现顺序无关的半透明渲染(Order-Independent-Transparency)
    CSharpGL(21)用鼠标拾取、拖拽VBO图元内的点、线或本身
    批量重命名文件
    [译]基于GPU的体渲染高级技术之raycasting算法
    CSharpGL(20)用unProject和Project实现鼠标拖拽图元
  • 原文地址:https://www.cnblogs.com/wgwg/p/13386899.html
Copyright © 2011-2022 走看看