一、数据抽样
抽样的组织形式有:
(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