zoukankan      html  css  js  c++  java
  • train_test_split, 关于随机抽样和分层抽样

    https://zhuanlan.zhihu.com/p/49991313

    在将样本数据分成训练集和测试集的时候,应当谨慎地考虑一下是采用纯随机抽样,还是分层抽样。

    通常,数据集如果足够大,纯随机抽样的方式,将样本数据分成两个子集是没有太大的问题。

    如果不是,纯随机抽样肯可能会导致抽样数据偏差,影响训练效果,降低预测模型预测的准确性。

    设想调查公司需要做1000份抽样调查,调查的问题和性别可能有较大的相关性。如果想让调查结果代表全国男性和女性对这些问题的看法,假设全国人口男女比例大致为60:40,那么在1000份问卷也应当尽量保持男女比例达到同样的比例,即参加问卷调查的男女数差不多是600和400。

    这个就是分层抽样。

    如果参加问卷的男女数比例很不一样,比如女性占到了60%或更多,那么调查结伦就会出现重大偏差。

    使用sklearn.model_selection.train_test_split,参数stratify即用来指定按照某一特征进行分层抽样,生成训练集和测试集。

    看一下随机抽样和分层抽样时,按照某一特征的取值,在训练集的占比情况。

    income_count = housing['income_cat'].value_counts().sort_index()
    print('
    After categorized:
    {}'.format(income_count))
    income_count.plot.bar()
    plt.show()
    
    print('Overall dataset, distribution of each category: (%)')
    print(income_count/len(housing)*100)
    
    # random split
    train_set, test_set = train_test_split(housing, random_state=42)
    train_set_income_count = train_set['income_cat'].value_counts().sort_index()
    print('
    Random split train dataset, distribution: (%)')
    print(train_set_income_count/len(train_set)*100)
    
    # stratify split
    train_set, test_set = train_test_split(housing, 
                         stratify=housing['income_cat'], random_state=42)
    train_set_income_count = train_set['income_cat'].value_counts().sort_index()
    print('
    Startify split train dataset, distribution: (%)')
    print(train_set_income_count/len(train_set)*100)
    

    得到结果如下:

    可以看到分层抽样所分出来的训练集(和测试集)数据在关键特征上具有和总体数据集上基本一致的分布。

    因此采用分层抽样来生成训练集和测试集将会更严谨。

  • 相关阅读:
    SAP HANA中创建分析权限(Analytic Privilege)
    SAP HANA 中的决策表(Decision Table)
    SAP HANA procudure 创建用户
    数据挖掘与分析学习链接汇总
    Wpf 自定义窗体
    Winform里实现一个双击ListBox可以切换为TextBox编辑的效果
    一个从没见过的C# ?.语法
    VB.net怎么用Sub Main
    Office2010 帮助查看器遇到意外问题
    WcfService:单服务多契约接口以及用户名密码认证
  • 原文地址:https://www.cnblogs.com/fengff/p/10008363.html
Copyright © 2011-2022 走看看