分层抽样,形象的理解,简单抽样就是画同心圆,然后切蛋糕,这样比较好理解。 (周志华 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
使用dict
的keys()
, - 在
sample
使用dict
的values()
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. 清华大学出版社.