python 无放回分层抽样
时间: 2023-11-01 17:57:38 浏览: 120
无放回分层抽样是指在进行样本抽取时,按照不同的分层标准将样本划分为不同的层,然后从每个层中抽取样本,且每个样本只能被抽取一次,不放回。在Python中,可以使用scikit-learn库的StratifiedShuffleSplit类来实现无放回分层抽样。
以下是使用StratifiedShuffleSplit类实现无放回分层抽样的代码示例:
```python
from sklearn.model_selection import StratifiedShuffleSplit
# 假设X和y是你的特征和标签数据
# n_splits为抽样次数,test_size为测试集比例
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=0)
for train_index, test_index in sss.split(X, y):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
```
相关问题
1.在素材数据文件 car_profiles. csv 中,共有 40 个关于汽车配置的样本,包括类型、气缸涡轮式、燃料、排气量、压缩率、功率、换档、车重、里程几项特征。试编写程序,完成以下几 项数据抽样:(1) 随机抽样。无放回,抽取出 30% 的样本量,并将抽样结果保存到新建的 Excel 文件中文件名为 samples.xlsx,数据表标签为“随机抽样”。 (2) 系统抽样。抽取 8 个本,并将结果保存到结果文件中标签为“系统抽样”的表中。 (3) 分层抽样。以车重属性分层,抽取属性值为“中”的样本9个,为“轻”的样本3个为“重”的样本 2个,共 14 个样本,并将结果保存到结果文件中标签为“分层抽样”的表中。(4) 整群抽样。随机抽取里程属性取值为“高”“中”“低”中的2 组样本,并将结果保存到结果文件中标签为“整群抽样”的表中。
抽样代码如下所示(注:需要 pandas 和 openpyxl 库):
```python
import pandas as pd
import random
from math import ceil
from openpyxl import Workbook
# 读取原始数据文件
df = pd.read_csv('car_profiles.csv')
# 随机抽样
random_sample = df.sample(frac=0.3, replace=False, random_state=2022) # 无放回抽样,抽取30%
random_sample.to_excel('samples.xlsx', sheet_name='随机抽样', index=False)
# 系统抽样
k = ceil(len(df) / 8) # 每 k 个样本抽取一个
systematic_sample = df.iloc[::k, :]
systematic_sample.to_excel('samples.xlsx', sheet_name='系统抽样', index=False)
# 分层抽样
stratified_sample = pd.concat([df[df['车重'] == '中'].sample(9),
df[df['车重'] == '轻'].sample(3),
df[df['车重'] == '重'].sample(2)])
stratified_sample.to_excel('samples.xlsx', sheet_name='分层抽样', index=False)
# 整群抽样
group1 = df[df['里程'] == '高'].sample(2)
group2 = df[df['里程'] == '中'].sample(2)
group3 = df[df['里程'] == '低'].sample(2)
cluster_sample = pd.concat([group1, group2, group3])
cluster_sample.to_excel('samples.xlsx', sheet_name='整群抽样', index=False)
```
以上代码中,`df` 是读取的原始数据文件,`random_sample`、`systematic_sample`、`stratified_sample` 和 `cluster_sample` 分别是四种抽样方法得到的样本集,最终结果保存到名为 `samples.xlsx` 的 Excel 文件中。
1.在素材数据文件 car _ profiles . csv 中,共有40个关于汽车配置的样本,包括类型、气缸、 涡轮式、燃料、排气量、压缩率、功率、换档、车重、里程几项特征。试编写程序,完成以下几项数据抽样: (1)随机抽样。无放回,抽取出30%的样本量,并将抽样结果保存到新建的 Excel 文件中,文件名为 samples . xlsx ,数据表标签为"随机抽样"。(2)系统抽样。抽取8个样本,并将结果保存到结果文件中标签为"系统抽样"的表中。 (3)分层抽样。以车重属性分层,抽取属性值为"中"的样本9个,为"轻"的样本3个,为"重"的样本2个,共14个样本,并将结果保存到结果文件中标签为"分层抽样"的表中。 (4)整群抽样。随机抽取里程属性取值为"高""中""低"中的2组样本,并将结果保存到结果文件中标签为"整群抽样"的表中。
以下是Python代码实现:
```python
import pandas as pd
import numpy as np
import random
# 读取数据
data = pd.read_csv('car_profiles.csv')
# 随机抽样
random_sample = data.sample(frac=0.3, replace=False)
random_sample.to_excel('samples.xlsx', sheet_name='随机抽样')
# 系统抽样
n = 40
k = 8
systematic_sample = data.iloc[np.arange(0, n, n//k)]
systematic_sample.to_excel('samples.xlsx', sheet_name='系统抽样')
# 分层抽样
strata = data.groupby('车重')
strata_sample = pd.DataFrame()
for group_name, group_data in strata:
if group_name == '中':
stratum_sample = group_data.sample(n=9, replace=False)
elif group_name == '轻':
stratum_sample = group_data.sample(n=3, replace=False)
elif group_name == '重':
stratum_sample = group_data.sample(n=2, replace=False)
strata_sample = strata_sample.append(stratum_sample)
strata_sample.to_excel('samples.xlsx', sheet_name='分层抽样')
# 整群抽样
cluster1 = data[data['里程'] == '高']
cluster2 = data[data['里程'] == '中']
cluster3 = data[data['里程'] == '低']
clusters = [cluster1, cluster2, cluster3]
cluster_sample = random.sample(clusters, 2)
cluster_sample = pd.concat(cluster_sample)
cluster_sample.to_excel('samples.xlsx', sheet_name='整群抽样')
```
以上代码实现了四种抽样方法:随机抽样、系统抽样、分层抽样和整群抽样,并将结果保存到名为“samples.xlsx”的Excel文件中的不同工作表中。
阅读全文