问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Pandas的分层取样

创作时间:
2025-03-13 15:54:24
作者:
@小白创作中心

Pandas的分层取样

引用
1
来源
1.
https://geek-docs.com/pandas/pandas-tutorials/stratified-sampling-in-pandas.html

分层抽样是一种重要的抽样技术,通过将总体划分为同质的子群(阶层),并从每个阶层中随机抽取数据,从而减少样本选择的偏差。在数据分析和机器学习领域,分层抽样常用于创建测试数据集,特别是在处理大规模且不平衡的数据集时。本文将详细介绍如何使用Pandas库实现分层抽样,并通过具体示例帮助读者掌握这一技术。

分层抽样是一种抽样技术,用于获得最能代表总体的样本。它通过将总体划分为同质的子群,称为阶层,并从每个阶层中随机抽取数据,从而减少了选择样本的偏差。

在统计学中,当每个阶层的平均值不同时,就会使用分层抽样。在机器学习中,分层抽样通常用于创建测试数据集以评估模型,特别是当数据集明显庞大且不平衡时。

分层抽样所涉及的步骤

  • 将总体分为不同的阶层。在这一步骤中,总体根据相似的特征被划分为不同的阶层,总体中的每个成员必须正好属于一个阶层(阶层的单数)。
  • 确定样本大小。决定样本应该有多小或多大。
  • 对各层进行随机抽样:从各层中随机抽取样本,采用不按比例抽样,即各层的样本量与该层的总体数量相等,或者采用比例抽样,即各层的样本量与该层的总体数量成比例。

示例 1:

在这个例子中,我们有一个由10名学生组成的虚拟数据集,我们将根据他们的成绩抽出6名学生,同时使用不成比例和成比例的分层抽样。

步骤1:使用pandas DataFrame从python字典中创建假数据集。

import pandas as pd

# Create a dictionary of students
students = {
    'Name': ['Lisa', 'Kate', 'Ben', 'Kim', 'Josh',
             'Alex', 'Evan', 'Greg', 'Sam', 'Ella'],
    'ID': ['001', '002', '003', '004', '005', '006', 
           '007', '008', '009', '010'],
    'Grade': ['A', 'A', 'C', 'B', 'B', 'B', 'C', 
              'A', 'A', 'A'],
    
    'Category': [2, 3, 1, 3, 2, 3, 3, 1, 2, 1]
}

# Create dataframe from students dictionary
df = pd.DataFrame(students)

# view the dataframe
df

输出:

请注意,有50%的A级学生,30%的B级学生,20%的C级学生。

步骤2:建立一个由6名学生组成的不成比例的样本(每个年级层的学生数量相等)。

不按比例抽样:使用pandas groupby,根据学生的年级将他们分成几组,即A、B、C,并使用抽样函数从每个年级组中随机抽取2名学生。

df.groupby('Grade', group_keys=False).apply(lambda x: x.sample(2))

输出:

步骤3:按比例抽出60%的学生(根据其在总体中的比例,从每个分层中建立比例样本)。

比例抽样:使用pandas groupby,根据学生的成绩即A、B、C分成几组,并根据总体比例从每组中随机抽样。总的样本量是总体的60%(0.6)。

df.groupby('Grade', group_keys=False).apply(lambda x: x.sample(frac=0.6))

输出:

请注意,即使在样本中,也有50%的A级学生,30%的B级学生,以及20%的C级学生。

示例 2:

在这个例子中,我们将从泰坦尼克号数据集中创建样本数据。泰坦尼克号是英国乘客,在撞上冰山后沉没在北大西洋。该数据集包含了所有登上泰坦尼克号的乘客的信息,一个乘客要么死亡,要么在坠机中幸存,所以我们将使用幸存列作为我们的分层列。

第1步:从CSV文件中读入数据集。

import pandas as pd

# read the dataset as csv file
data = pd.read_csv('Titanic.csv')

# drop the name column as it is of no importance here
data.drop('Name', axis=1, inplace=True)

# view the first 5 rows of the titanic dataset
data.head()

输出:

第2步:检查死亡/幸存乘客的百分比

检查死亡或幸存的乘客的比例/百分比,这是给死亡或幸存的乘客人数/乘客总数*100。

(data['Survived'].value_counts()) / len(data) * 100

输出:

0    61.616162
1    38.383838

其中0代表死亡的乘客(61.6%),1代表幸存的乘客(38.4%)。

步骤3:不成比例地抽出8名乘客(4人死亡,4人幸存)。

# Disproportionate sampling:
# randomly select 4 samples from each stratum

data.groupby('Survived', group_keys=False).apply(lambda x: x.sample(4))

输出:

第四步:按比例抽出1%(0.01)的乘客(0.6%死亡,0.4%幸存)。

data.groupby('Survived', group_keys=False).
apply(lambda x: x.sample(frac=0.01))

输出:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号