数据抽样及样本不均衡处理


一、数据抽样

抽样的组织形式有:

(1)简单随机抽样:按等概率原则直接从总体中抽取样本。该方法适用于个体分布均匀的场景。

(2)分层抽样:先对总体分组,再从每组中随机抽样。该方法适用于带有分类逻辑属性的数据。

(3)等距抽样:先将总体中的每个个体按顺序编号,计算抽样间隔,然后按照固定间隔抽取个体。该方法适用于个体分布均匀或呈现明显的均匀分布规律,无明显趋势或周期性规律的数据。

(4)整群抽样:将总体分为若干部分,(每个部分称为一群),以群为单位随机抽样,跟其他三种方法的不同在于该方法抽取的是群,而不是数据个体。

#读入数据
1
import numpy as np 2 import pandas as pd 3 import random 4 df=pd.read_csv(r'E:\data analysis\test\test2.csv') 5 print(df.head(3))

      id  var0  var1  var2  var3  var4  var5  var6  var7  var8
0  16144     1    14    13     5    25     5    45     6     1
1  16145     1    15    14     6    26     1     6     7     1
2  16146     1    16    15     7    27     2     1     8    
#简单随机抽样
1
df_srs=pd.DataFrame.sample(df,n=20) 2 print(df_srs.head(3)) 3 print(len(df_srs))

    id  var0  var1  var2  var3  var4  var5  var6  var7  var8
99   17090     1    75     6    19    23     9     2     4     5
30   17021     1     6     5    19    55    16     8     9     2
107  17098     0     1    14     1    31    17     2    12     5

20
 #等距抽样
1
sample_count=20 2 df_count=df.shape[0] 3 width=df_count/sample_count 4 df_is=[] 5 i=0 6 while i*width<=df_count-1: 7 sample=df.ix[i*width] 8 df_is.append(sample) 9 i+=1 10 df_is=pd.DataFrame(df_is) 11 print(df_is.head(3)) 12 print(len(df_is))

   id  var0  var1  var2  var3  var4  var5  var6  var7  var8
0   16144     1    14    13     5    25     5    45     6     1
10  17001     1    24    23    15    35     4     1     2     1
20  17011     1    34    33     9    45     6    11     1     2

20
#分层抽样
1
each_sample_count=10 2 label_unique=np.unique(df['var0']) 3 df_ss=pd.DataFrame(np.zeros((1,len(df.columns))),columns=df.columns,dtype=int) 4 for label in label_unique: 5 sample=pd.DataFrame.sample(df[df['var0']==label],each_sample_count) 6 df_ss=pd.concat([df_ss,sample]) 7 df_ss=df_ss[1:] 8 print(df_ss) 9 print(len(df_ss))

        id  var0  var1  var2  var3  var4  var5  var6  var7  var8
161  17152     0    37    14    15    18     5    10    31     8
102  17093     0    78     9     2    26    12     5     7     5
183  18020     0    59    36    10    17     5     7     2     9
131  17122     0     7     6    25    23     9    15     1     7
112  17103     0     1     3     6     4    22     7    17     6
170  18007     0    46    23    24     4     7     2    40     9
126  17117     0     2     1    20    18     4    10    12     6
196  18033     0    72     9    11     7     4     6     3    10
199  18036     0    75    12    14     4     7     3     6    10
158  17149     0    34    11    12    15     8     7    28     8
45   17036     1    21     6     5    70     9    23    11     3
48   17039     1    24     9     8    73     1    26    14     3
4    16148     1    18    17     9    29     4     3    10     1
57   17048     1    33     1    17     6     3     4     7     3
96   17087     1    72     3    16    20     6     6     1     5
76   17067     1    52    20     1     4    12    11     2     4
19   17010     1    33    32     8    44     5    10     7     1
67   17058     1    43    11    27    16     3     2     6     4
11   17002     1    25    24     3    36     5     2     3     1
26   17017     1     2     1    15    51    12     4     5     2

20

 #整群抽样
1
label_unique=np.unique(df['var8']) 2 sample_label=random.sample(list(label_unique),2) 3 df_cs=pd.DataFrame(np.zeros((1,len(df.columns))),columns=df.columns,dtype=int) 4 print(sample_label) 5 for label in sample_label: 6 sample=df[df['var8']==label] 7 df_cs=pd.concat([df_cs,sample]) 8 df_cs=df_cs[1:] 9 print(df_cs) 10 print(len(df_cs))

[10, 2]
        id  var0  var1  var2  var3  var4  var5  var6  var7  var8
187  18024     0    63     2     2    21     4    11     6    10
188  18025     0    64     1     3    22     5    12     7    10
189  18026     0    65     2     4     4     6    13     8    10
......
38   17029     1    14    13    27    63     2    16     4     2
39   17030     1    15     2    28    64     3    17     5     2
40   17031     1    16     1     3    65     4    18     6     2
41   17032     1    17     2     1    66     5    19     7     2
42   17033     1    18     3     2    67     6    20     8     2

36

 

二、解决样本不均衡的问题

样本不均衡是指不同类别的样本量差异很大。

解决方法:

1、过抽样:增加分类中少数类样本的数量,最简单的方法就是复制少数类样本形成多条记录。改进的过抽样方法是在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。例如SMOTE算法。过抽样方法应用极广泛。

     欠抽样:减少分类中多数类样本的数量,最简单的方法就是随机去掉一些多数样本。

2、通过正负样本的惩罚权重来解决不均衡:对于分类中不同样本数量的类别分别赋予不同权重(一般小样本量类别权重大,大样本量类别权重小),然后进行计算和建模,例SVM。

3、通过组合/集成方法解决权重不均衡:从分类中的大样本量中随机抽取数据来与小样本合并构成训练集。

#导入数据,查看类别数量
1
import numpy as np 2 import pandas as pd 3 from imblearn.over_sampling import SMOTE 4 df=pd.read_csv(r'E:\data analysis\test\test3.csv') 5 print(df.head(3)) 6 df_groupby=df.groupby('var8').count() 7 print(df_groupby)

      id  var1  var2  var3  var4  var5  var6  var7  var8
0  16144    14    13     5    25     5    45     6     1
1  16145    15    14     6    26     1     6     7     1
2  16146    16    15     7    27     2     1     8     1


       id  var1  var2  var3  var4  var5  var6  var7
var8                                               
0     174   174   174   174   174   174   174   174
1      26    26    26    26    26    26    26    26
       id  var1  var2  var3  var4  var5  var6  var7

 

#使用SMOTE方法进行过抽样
1
x=df.ix[:,:-1] #id~var7 2 y=df.ix[:,-1] #var8 即标签列 3 model_smote=SMOTE() 4 x_smote,y_smote=model_smote.fit_sample(x,y) 5 x_smote=pd.DataFrame(x_smote,columns=['id','var1','var2','var3','var4','var5','var6','var7']) 6 y_smote=pd.DataFrame(y_smote,columns=['var8']) 7 smote_xy=pd.concat([x_smote,y_smote],axis=1) 8 groupby_smote_xy=smote_xy.groupby('var8').count() 9 print(groupby_smote_xy)

var8                                               
0     174   174   174   174   174   174   174   174
1     174   174   174   174   174   174   174   174

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM