机器学习 | 使用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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传