sklearn分层抽样

如果数据集足够庞大(特别是相较于属性的数量而言), 纯随机抽样方法通常不错,如果数据集较小,则有可能导致明显的抽样偏差。若一家调查公司打电话给1000个人来调研几个问题,他们试图确保让着1000人能够代表全体人口。例如美国人口组成为51.3%的女性和 48.7%的男性,所以若要进行一场有效的调查,1000个样本中应该试图也维持这一比例,即513名女性和487名男性,这就是分层抽象的思想

sklearn实现步骤

这里以美国加州住房信息housing.csv文件数据为例进行分层抽样演示。该文件自行百度搜索下载

from sklearn.model_selection import StratifiedShuffleSplit # 引入分层抽样类


# pd.cut()来划分5个类别的中位数收入(labels属性),bins属性列表表示划分的范围,即0~1.5,1.5~3.0等等
#其中df['income_cat']表示在原始DataFrame中插入income_cat属性列,income_cat列的值为pd.cut()函数返回的值(labels属性列表中的某个值)
df['income_cat'] = pd.cut(df['median_income'], bins=[0, 1.5, 3.0, 4.5, 6., np.inf], labels=[1, 2, 3, 4, 5])
split = StratifiedShuffleSplit(test_size=0.2, random_state=42)
# split()函数返回分层抽样后训练集、测试机二者的索引
for train_index, test_index in split.split(df, df['income_cat']):
    start_train_set = df.loc[train_index] # 根据索引来从df中抽取训练数据集
    start_test_set = df.loc[test_index] # 根据索引来从df中抽取测试数据集

猜你喜欢

转载自blog.csdn.net/weixin_47834823/article/details/128807373