Advertisement

数据挖掘核心技术-抽样篇

阅读量:

在统计学中,抽样(Sampling)是一种推论统计方法,是指从目标总体(Population,或称为母体)中抽取一部分个体作为样本(Sample),通过观察样本的某一或某些属性,依据所获得的数据对总体的数量特征得出具有一定可靠性的估计判断,从而达到对总体的认识。

概率抽样方法

简单随机抽样

简单随机抽样(simple random sampling),也叫纯随机抽样。从总体N个单位中随机地抽取n个单位作为样本,使得每一个容量为样本都有相同的概率被抽中。特点是:每个样本单位被抽中的概率相等,样本的每个单位是完全独立,彼此间无一定的关联性和排斥性。简单随机抽样是其它各种抽样形式的基础。通常只是在总体单位之间差异程度较小和数目较少时,才采用这种方法。

简单随机抽样。是最基本的抽样方法。分为重复抽样和不重复抽样。在重复抽样中,每次抽中的单位仍放回总体,样本中的单位可能不止一次被抽中。不重复抽样中,抽中的单位不再放回总体,样本中的单位只能抽中一次。社会调查采用不重复抽样。

纯随机抽样的具体作法有:①抽签法。将总体的全部单位逐一作签,搅拌均匀后进行抽取。②随机数字表法。将总体所有单位编号,然后从随机数字表中一个随机起点(任一排或一列),开始从左向右或从右向左、向上或向下抽取,直到达到所需的样本容量为止。

纯随机抽样必须有一个完整的抽样框,即总体各单位的清单。总体太大时,制作这样的抽样框工作量巨大,加之有许多情况,使总体名单根本无法得到。故在大规模社会调查中很少采用纯随机抽样。

随机抽样是在全部调查单位中按照随机原则抽取部分单位进行调查,根据调查结果推断总体的一种调查方式。

具有以下几个基本特点。

(1)按照随机原则抽选调查单位。所谓随机原则就是指样本单位的抽取不受任何主观因素及其他系统性因素的影响,总体的每个单位都有一定的机会被抽选为样本单位。

(2)对部分单位调查的目的是为了推断总体指标。根据数理统计原理,抽样调查中的样本指标和对应的总体指标之间存在内在联系,而且两者的误差是可以计算出来的,因此提供了用实际调查部分信息对总体数量特征进行推断的科学方法。

(3)抽样误差可以事先计算并加以控制。以样本资料对总体数量特征进行推断,不可避免会产生代表误差,但抽样调查的代表性误差是可以根据有关资料事先计算并进行控制,故可以保证推断结果达到预期的可靠程度。

最主要的优点是,由于每个样本单位都是随机抽取的,根据概率论不仅能够用样本统计量对总体参数进行估计,还能计算出抽样误差,从而得到对总体目标变量进行推断的可靠程度。但随机抽样比较复杂,对调查人员的专业技术要求高,调查中需要抽样框,而构建和维护一个高质量的抽样框费用很高,抽样单位可能非常分散,而且不能轻易更换样本单位,增加了调查费用。

系统抽样

系统抽样(systematic sampling),也称等距抽样。将总体中的所有单位按一定顺序排列,在规定的范围内随机地抽取一个单位作为初始单位,然后按事先规定好的规则确定其他样本单位。先从数字1到k之间随机抽取一个数字r作为初始单位,以后依次取r+k、r+2k……等单位。这种方法操作简便,可提高估计的精度。

系统抽样又称等距抽样。是纯随机抽样的变种。在系统抽样中,先将总体从1~N相继编号,并计算抽样距离K=N/n。式中N为总体单位总数,n为样本容量。然后在1~K中抽一随机数k1,作为样本的第一个单位,接着取k1+K,k1+2K……,直至抽够n个单位为止。

系统抽样要防止周期性偏差,因为它会降低样本的代表性。例如,军队人员名单通常按班排列,10人一班,班长排第 1名,若抽样距离也取10时,则样本或全由士兵组成或全由班长组成。

简单的一个例子:在100个人里要抽10个人,现把他们从1号编到100号,然后分成1-10号, 11-20号, 21-30号, 31-40号, 41-50号。。。。。。91号到100号。在这10组中,第一组抽3号(其实可以选1-10号里的任意一号)。 那么第2组抽13号,第3组抽23号,第4组抽33号。。。第10组抽93号。

分层抽样

分层抽样(stratified sampling),将抽样单位按某种特征或某种规则划分为不同的层,然后从不同的层中独立、随机地抽取样本。从而保证样本的结构与总体的结构比较相近,从而提高估计的精度。

先依据一种或几种特征将总体分为若干个子总体,每一子总体称作一个层;然后从每层中随机抽取一个子样本,这些子样本合起来就是总体的样本。各层样本数的确定方法有 3种:①分层定比。即各层样本数与该层总体数的比值相等。例如,样本大小n=50,总体N=500,则n/N=0.1即为样本比例,每层均按这个比例确定该层样本数。②奈曼法。即各层应抽样本数与该层总体数及其标准差的积成正比。③非比例分配法。当某个层次包含的个案数在总体中所占比例太小时,为使该层的特征在样本中得到足够的反映,可人为地适当增加该层样本数在总体样本中的比例。但这样做会增加推论的复杂性。

总体中赖以进行分层的变量为分层变量,理想的分层变量是调查中要加以测量的变量或与其高度相关的变量。分层的原则是增加层内的同质性和层间的异质性。常见的分层变量有性别、年龄、教育、职业等。分层随机抽样在实际抽样调查中广泛使用,在同样样本容量的情况下,它比纯随机抽样的精度高,此外管理方便,费用少,效度高。

整群抽样

整群抽样(cluster sampling),将总体中若干个单位合并为组,抽样时直接抽取群,然后对中选群中的所有单位全部实施调查。抽样时只需群的抽样框,可简化工作量,缺点是估计的精度较差。

整群抽样又称聚类抽样。先将总体按照某种标准分群,每个群为一个抽样单位,用随机的方法从中抽取若干群,抽中的样本群中所有单位都要进行调查。与分层抽样相反,整群抽样的分类原则是使群间异质性小,群内异质性大。分层抽样时各群(层)都有样本,整群抽样时只有部分群有样本。整群抽样只需列出入样群的单位,因此可节约大量财力、人力。整群抽样的代表性低于简单随机抽样。

多阶段抽样

多阶段抽样又称多级抽样。前 4种抽样方法均为一次性直接从总体中抽出样本,称为单阶段抽样。多阶段抽样则是将抽样过程分为几个阶段,结合使用上述方法中的两种或数种。例如,先用整群抽样法从北京市某中等学校中抽出样本学校,再用整群抽样法从样本学校抽选样本班级,最后用系统或纯随机抽样从样本班级的学生中抽出样本学生。当研究总体广泛且分散时,多采用多阶段抽样,以降低调查费用。但由于每级抽样都会产生误差,经过多级抽样产生的样本,误差也相应增大。

非概率抽样方法

方便抽样

方便抽样(Convenience Sampling),调查者以自己方便的方式抽取偶然得到的样本,最典型的方便抽样是“街头拦人法”。方便抽样的优点是易于实施,代价较小,缺点是样本代表性差,有很大的偶然性。

定额抽样

定额抽样(Quota Sampling),调查者先将总体按某种特征划分成不同的组,然后在配额内以主观判断选定样本作为研究对象。定额抽样和分层抽样的相同之处是对总体进行分组,不同之处是分层抽样按概率原则在层内抽选样本,而定额抽样选取样本是主观的。定额抽样的优点是能够缩小抽样范围,减少抽样成本,缺点是确定额度困难,需多次探索。

判断抽样

判断抽样(Judgement Sampling),研究人员根据调查目的和主观经验,从总体中选择最具代表性的样本。判断抽样的优点是可以用于总体难以确定的研究对象,缺点是受研究人员的主观倾向性影响大,一旦主观判断失误, 则易引起较大的抽样偏差。

滚雪球抽样

滚雪球抽样(Snowball Sampling),先选取若干符合特征的样本构成最初的调查对象,然后依靠他们提供新的调查对象,随着调查的推进,样本如同滚雪球般由小变大,滚雪球抽样方法的优点是能够很方便地找到被调查者,用于探索性研究,缺点是样本之间必须存在联系且愿意保持和提供这种联系。

抽样数据方式

通常,可通过实验测试来对学习器的泛化误差进行评估并进而做出选择,测试样本是从样本真实分布中独立同分布抽样而得,测试集应该尽可能与训练集互斥,即测试样本尽量不在训练集中出现,未在训练过程中使用。

留出法(hold-out)

方法

直接将数据集D划分为两个互斥的集合,训练集合S和测试集合T,在S上训练模型,用T来评估其测试误差。注意:训练/测试集的划分要尽可能保持数据分布的一致性,避免因为数据划分过程引入额外的偏差而对最终结果产生影响。

缺点与改进

单次使用留出法得到的估计往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果

实际运用

实际中一般将大约2/3~4/5的样本用于训练,剩余样本用于测试。

交叉验证法(cross validation)

方法

先将数据集D划分为k个大小相似的互斥子集.每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到 .然后每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样就可以获得k组训练/测试集,从而可以进行k次训练和测试,最终返回的是这k个测试结果的均值。

实际运用

一般而言k的取值为10,常用的还有5、20等

自助法(bootstrap)

问题引出

我们希望评估的是用D训练出来的模型,但是留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差,为此提出自助法。

方法

它以自助采样(bootstrap sampling)为基础.给定包含m个样本的数据集D,我们对它进行采样产生数据集 D′:每次随机从D中挑选出一个样本,将其拷贝放入D′, 然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采样到;这个过程重复执行m次后,我们就得到可包含m个样本数据的数据集D′,这就是自助采样的结果.样本在m次采样中始终不被采到到概率为

由此可知通过自助采样,初始数据集D中约有36.8%的样本未出现在采样数据集D′中。于是我们可将D′ 用作训练集,D∖D′用作测试集。

优缺点

自助法在数据集较小,难以有效划分训练/测试集时很有用,但是,自助法改变了初始数据集的分布,这会引入估计偏差,所以在数据量足够时,一般采用留出法和交叉验证法。

伪随机数

伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的初值(种子)不变,那么伪随机数的数序也不变。伪随机数可以用计算机大量生成,在模拟研究中为了提高模拟效率,一般采用伪随机数代替真正的随机数。模拟中使用的一般是循环周期极长并能通过随机数检验的伪随机数,以保证计算结果的随机性。

在python中,可通过random.seed函数来设置种子,如下:

复制代码
 import random

    
 random.seed( 10 )
    
 print("Random number with seed 10 : ", random.random())
    
  
    
 # 生成同一个随机数
    
 random.seed( 10 )
    
 print("Random number with seed 10 : ", random.random())
    
  
    
 # 生成同一个随机数
    
 random.seed( 10 )
    
 print("Random number with seed 10 : ", random.random())
    
    
    
    

Random number with seed 10 : 0.5714025946899135

Random number with seed 10 : 0.5714025946899135

Random number with seed 10 : 0.5714025946899135

Python中的抽样函数

random模块

Python中的random模块用于生成随机数。下面介绍一下random模块中最常用的几个函数。

random.random

random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0

random.uniform

random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机浮点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: b <= n <= a。如果 a <b, 则 a <= n <= b。

复制代码
 print(random.uniform(10, 20))  
    
 print(random.uniform(20, 10))
    
 #---- 结果(不同机器上的结果不一样)  
    
 #18.7356606526  
    
 #12.5798298022  
    
    
    
    

random.randint

random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

复制代码
 print(random.randint(12, 20))  #生成的随机数n: 12 <= n <= 20  
    
 print(random.randint(20, 20))  #结果永远是20  
    
 #print(random.randint(20, 10))  #该语句是错误的。下限必须小于上限。
    
    
    
    

random.randrange

random.randrange的函数原型为:random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。

random.choice

random.choice从序列中获取一个随机元素。其函数原型为:random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。有关sequence可以查看python手册数据模型这一章。下面是使用choice的一些例子:

复制代码
 print(random.choice("学习Python"))

    
 print(random.choice(["JGood", "is", "a", "handsome", "boy"]))
    
 print(random.choice(("Tuple", "List", "Dict")))
    
    
    
    

random.shuffle

random.shuffle的函数原型为:random.shuffle(x[, random]),用于将一个列表中的元素打乱。如:

复制代码
 p = ["Python", "is", "powerful", "simple", "and so on..."]  
    
 random.shuffle(p)  
    
 print(p)
    
 #---- 结果(不同机器上的结果可能不一样。)  
    
 #['powerful', 'simple', 'is', 'Python', 'and so on...']  
    
    
    
    

random.sample

random.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。

复制代码
 list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  
    
 slice = random.sample(list, 5)  #从list中随机获取5个元素,作为一个片断返回  
    
 print(slice)  
    
 print(list) #原有序列并没有改变。  
    
    
    
    

统计分布的抽样

指数分布

random.expovariate(lambd)

Gamma分布

random.gammavariate(alpha, beta)

Gamma分布,要求alpha>0且beta>0,注意这个不是Gamma函数。当然在计算过程中用到了Gamma函数。

Gauss分布

random.gauss(mu, sigma)

random.normalvariate(mu, sigma)

这两个都是产生Gauss分布,两者采用不同的思路产生,前者使用统计意义上的计算,后者是依据标准的正态分布定义产生。前者生成速度还要快点,不过在多线程场景下使用要自己加锁控制并发。

对数级别的正态分布

random.lognormvariate(mu, sigma)

Beta分布

random.betavariate(alpha, beta)

Beta Distribution,要求alpha>0且beta>0,依赖于gamma分布,通过gamma分布函数生成。

pandas.DataFrame.sample

复制代码
    DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
    

Return a random sample of items from an axis of object.

You can use random_state for reproducibility.

Parameters: n :int, optional Number of items from axis to return. Cannot be used with frac. Default = 1 if frac = None. frac :float, optional Fraction of axis items to return. Cannot be used with n. replace :bool, default False Sample with or without replacement. weights :str or ndarray-like, optional Default ‘None’ results in equal probability weighting. If passed a Series, will align with target object on index. Index values in weights not found in sampled object will be ignored and index values in sampled object not in weights will be assigned weights of zero. If called on a DataFrame, will accept the name of a column when axis = 0. Unless weights are a Series, weights must be same length as axis being sampled. If weights do not sum to 1, they will be normalized to sum to 1. Missing values in the weights column will be treated as zero. Infinite values not allowed. random_state :int or numpy.random.RandomState, optional Seed for the random number generator (if int), or numpy RandomState object. axis :int or string, optional Axis to sample. Accepts axis number or name. Default is stat axis for given data type (0 for Series and DataFrames, 1 for Panels).
Returns: Series or DataFrame A new object of same type as caller containing n items randomly sampled from the caller object.
复制代码
 >>> df = pd.DataFrame({'num_legs': [2, 4, 8, 0],

    
 ...                    'num_wings': [2, 0, 0, 0],
    
 ...                    'num_specimen_seen': [10, 2, 1, 8]},
    
 ...                   index=['falcon', 'dog', 'spider', 'fish'])
    
 >>> df
    
     num_legs  num_wings  num_specimen_seen
    
 falcon         2          2                 10
    
 dog            4          0                  2
    
 spider         8          0                  1
    
 fish           0          0                  8
    
  
    
 >>> df['num_legs'].sample(n=3, random_state=1)
    
 fish      0
    
 spider    8
    
 falcon    2
    
 Name: num_legs, dtype: int64
    
  
    
 >>> df.sample(frac=0.5, replace=True, random_state=1)
    
       num_legs  num_wings  num_specimen_seen
    
 dog          4          0                  2
    
 fish         0          0                  8
    
  
    
 >>> df.sample(n=2, weights='num_specimen_seen', random_state=1)
    
     num_legs  num_wings  num_specimen_seen
    
 falcon         2          2                 10
    
 fish           0          0                  8
    
    
    
    

全部评论 (0)

还没有任何评论哟~