mysql随机分层抽样_数据抽样及样本不均衡处理

一、数据抽样

抽样的组织形式有:

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

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

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

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

#读入数据

1 importnumpy as np2 importpandas as pd3 importrandom4 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_count4 df_is=[]5 i=06 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 inlabel_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 insample_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 importnumpy as np2 importpandas as pd3 from imblearn.over_sampling importSMOTE4 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


版权声明:本文为weixin_30443729原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。