Pandas的分层取样

Pandas的分层取样

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

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

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
Python

输出:

Pandas的分层取样

请注意,有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))
Python

输出:

Pandas的分层取样

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

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

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

输出:

Pandas的分层取样

请注意,即使在样本中,也有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()
Python

输出:

Pandas的分层取样

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

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

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

输出:

0    61.616162
1    38.383838
Python

其中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))
Python

输出:

Pandas的分层取样

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

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

输出:

Pandas的分层取样

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册