1 min read

python的分层抽样(stratified sampling)

分层抽样,形象的理解,简单抽样就是画同心圆,然后切蛋糕,这样比较好理解。 (周志华 2016)

import pandas as pd
import seaborn.apionly as sns
iris = sns.load_dataset('iris')
print iris.head()
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa
iris.species.unique()
array(['setosa', 'versicolor', 'virginica'], dtype=object)

tolist(): np.array \(\to\) list

iris.species.unique().tolist()
['setosa', 'versicolor', 'virginica']
pctg = {
    'setosa':0.1, 
    'versicolor':0.2, 
    'virginica':0.3
}
pctg.keys()[0]
# pctg.values()[2]
'setosa'

现在讨论分层抽样的问题。其实这个问题之前已经讨论清楚了,就是设置sample里面的比例。 这里直接构建一个dict

  • subsample中的filter使用dictkeys()
  • sample使用dictvalues()
data = {}

#for i in iris.species.unique().tolist():
for i in range(0,3):   
    name = pctg.keys()[i]
    subsample = iris[iris.species == name]
    ratio = pctg.values()[i]
    subsample_size = subsample.species.size
    number = int(ratio*subsample_size)
    data[name] = subsample.sample(number)
type(data)
dict

因此解决了批量合并data.frame的方法

print iris.groupby("species").count()
print pd.concat(data).groupby("species").count()
            sepal_length  sepal_width  petal_length  petal_width
species                                                         
setosa                50           50            50           50
versicolor            50           50            50           50
virginica             50           50            50           50
            sepal_length  sepal_width  petal_length  petal_width
species                                                         
setosa                 5            5             5            5
versicolor            10           10            10           10
virginica             15           15            15           15

检验结果,发现的确是按照每个group id,分层抽样以此递增。

我想到了一个办法,就是我可以导出为.md格式,也是可以deploy的。 但是导出方式一定要是print的。 blogdown可以调用.md文档。

.ipynb文档可以下载 ,方便调用代码。

周志华. 2016. 机器学习: Machine Learning. 清华大学出版社.