机器学习 | 使用Scikit-Learn实现分层抽样

2024-04-14 22:04

本文主要是介绍机器学习 | 使用Scikit-Learn实现分层抽样,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在本文中,我们将学习如何使用Scikit-Learn实现分层抽样。

什么是分层抽样?

分层抽样是一种抽样方法,首先将总体的单位按某种特征分为若干次级总体(层),然后再从每一层内进行单纯随机抽样,组成一个样本。可以提高总体指标估计值的精确度。在抽样时,将总体分成互不交叉的层,然后按一定的比例,从各层次独立地抽取一定数量的个体,将各层次取出的个体合在一起作为样本,这种抽样方法是一种分层抽样。

分层抽样的特点是将科学分组法与抽样法结合在一起,分组减小了各抽样层变异性的影响,抽样保证了所抽取的样本具有足够的代表性。

如何进行分层抽样?

要执行分层抽样,您需要遵循以下讨论的步骤:

  1. 定义层:根据种族、性别、收入、教育水平、年龄组等相关特征,确定和定义人口中的子群体状态。
  2. 样本量:确定总体样本量和单个亚组样本量,确保所选每个亚组的比例在总体中具有比例代表性。
  3. 选择抽样:通过应用随机抽样技术,如简单随机抽样或系统随机抽样,从每个确定的分层中随机选择样本。
  4. 最终抽样:将来自不同层的所有样品组合成统一的代表性样品。

在这里插入图片描述

什么时候使用分层抽样?

  • 群体异质性:当群体可以根据特定特征分为相互排斥的亚组时。
  • 平等代表性:当我们想要确保一个特定的特征或一组特征在最终样本中得到充分代表时。
  • 资源限制:当您想将研究结果推广到整个人群并确保估计值对每个阶层都有效,但资源有限时。

例如,在市场调研中,如果需要调查不同年龄、性别、职业等人群的消费习惯,可以将总体按照这些特征进行分层,然后在每个层内随机抽样,从而得到更具代表性的样本。

需要注意的是,分层抽样并不是一种简单地将总体分成几份然后随机抽样的方法,而是需要考虑到各层之间的差异和相似性,以及抽样比例等因素。因此,在使用分层抽样时,需要根据具体情况进行设计和操作。

分层抽样的优点

分层抽样的优点包括:

  • 提高样本的代表性:分层抽样能够根据总体中不同层次的比例来抽取样本,从而使得样本更加具有代表性,提高由样本推断总体的精确性。

  • 便于组织:分层抽样可以根据不同的层次进行抽样,因此可以灵活地选择不同的抽样方法和组织方式,便于组织和管理。

  • 节省经费:由于分层抽样可以针对不同层次进行抽样,因此可以更加有效地利用资源,节省经费。

需要注意的是,分层抽样需要考虑到各层之间的差异和相似性,以及抽样比例等因素,因此需要更加精细的设计和操作。

与其他采样技术进行比较

分层抽样只是研究中使用的几种抽样技术之一。让我们将分层抽样与其他几种常见的抽样技术进行比较:

分层抽样:

  • 确保所有分组的代表性。当群体中存在显著变异时有用。
  • 需要了解有效分层的人群特征。

简单随机抽样:

  • 简单随机抽样很容易实现,特别是当总体是同质的时候。
  • 可能无法捕获群体内的变异性,某些亚组可能代表性不足。

整群抽样:

  • 在整群抽样中,人口被自然地分组为群组,这可能不一定基于感兴趣的特征。
  • 整个集群成为采样单位。
  • 聚类是随机选择的,并且所选聚类中的所有个体都包括在样本中。
  • 适用于地理上分散的人群,降低成本和时间。

配额抽样:

  • 随机抽样涉及根据某些特征将人口划分为亚组或配额。
  • 主要区别在于,在分层抽样中,我们从每个子组中抽取随机样本(概率抽样)。在配额抽样中,我们根据我们的知识为特定特征设定预定配额。此外,所选择的样本是非随机的,这意味着研究人员可以使用方便或判断抽样来满足预定的配额。

系统抽样:

  • 系统抽样(Systematic sampling)是一种抽样方法,在第一个成员被随机选择后,每第n个成员被选择纳入样本。这是通过选择一个随机的起点,然后从总体中挑选每第k个元素来完成的。“k”的值通过将总体的总大小除以期望的样本大小来确定。

分层抽样的实现

让我们加载 iris 数据集来实现分层采样。

import pandas as pd
from sklearn import datasetsiris = datasets.load_iris()
iris_df=pd.DataFrame(iris.data)iris_df['class']=iris.target
iris_df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']iris_df['class'].value_counts()

让我们看看当分层stratify设置为None时的类分布。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test= train_test_split(X,y, train_size=0.8, random_state=None, shuffle=True, stratify=None)print("Class distribution of train set")
print(y_train.value_counts())
print()
print("Class distribution of test set")
print(y_test.value_counts())

输出

 Class distribution of train set
0    43
2    40
1    37
Name: class, dtype: int64
Class distribution of test set
1    13
2    10
0     7
Name: class, dtype: int64

让我们看看当分层stratify设置为True时的类分布。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test= train_test_split(X,y, train_size=0.8, random_state=None,shuffle=True, stratify=y)
print(y_train.value_counts())
print(y_test.value_counts())

输出

Class distribution of train set
0    40
2    40
1    40
Name: class, dtype: int64
Class distribution of test set
2    10
1    10
0    10
Name: class, dtype: int64

如果我们想使用k倍的分层采样,我们可以使用Scikit Learn中的StratifiedShuffleSplit类,如下所示。

  • StratifiedShuffleSplit是scikit-learn中的一个类,它提供了一种生成用于交叉验证的训练/测试数据的方法。它是专门为以下场景而设计的:您希望在将数据拆分为训练集和测试集时,确保数据集中的类分布得到维护。
  • n_splits:重新拆分迭代的次数。在示例中,n_splits=2意味着数据集将被分成2个不同的训练集/测试集。
  • test_size:要包含在测试拆分中的数据集的比例。它可以是浮点数(例如,0.2表示20%)或整数(例如,2表示2个样本)。
  • random_state:随机数生成器的种子,以确保可重复性。如果设置为整数,则每次将生成相同的随机拆分。
import numpy as np
from sklearn.model_selection import StratifiedShuffleSplit
skf = StratifiedShuffleSplit(n_splits=2, train_size = .8)
X = iris_df.iloc[:,:-1]
y = iris_df.iloc[:,-1]for i, (train_index, test_index) in enumerate(skf.split(X, y)):print(f"Fold {i}:")print(f" {iris_df.iloc[train_index]['class'].value_counts()}")print("-"*10)print(f" {iris_df.iloc[test_index]['class'].value_counts()}")print("*" * 60)

输出

Fold 0:2    40
1    40
0    40
Name: class, dtype: int64
----------2    10
1    10
0    10
Name: class, dtype: int64
************************************************************
Fold 1:2    40
1    40
0    40
Name: class, dtype: int64
----------2    10
0    10
1    10
Name: class, dtype: int64
************************************************************

总结

在本文中,我们看到了如何使用分层抽样来确保最终样本代表总体,确保感兴趣的特征既不代表不足,也不代表过度。

这篇关于机器学习 | 使用Scikit-Learn实现分层抽样的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904134

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置