欢迎访问宙启技术站
智能推送

如何使用GroupShuffleSplit()进行分层抽样和数据集划分

发布时间:2023-12-27 18:07:23

GroupShuffleSplit()是scikit-learn库中的一个函数,用于进行分层抽样和数据集划分。分层抽样是指保持原始数据集中不同类别的样本在训练集和测试集中的比例相同。数据集划分是将原始数据集分为训练集和测试集,以评估模型的性能。

下面是使用GroupShuffleSplit()进行分层抽样和数据集划分的步骤:

1. 导入库和加载数据集:

首先,我们需要导入必要的库,并加载我们要使用的数据集。例如,可以使用scikit-learn中的load_iris()函数加载经典的鸢尾花数据集。

from sklearn.model_selection import GroupShuffleSplit
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target
groups = iris.target_names

2. 创建GroupShuffleSplit对象:

接下来,我们需要创建一个GroupShuffleSplit对象,并指定训练集和测试集的大小。可以使用scikit-learn中的train_test_split函数来比较不同的分层方式。

gss = GroupShuffleSplit(n_splits=1, train_size=0.8, test_size=0.2)

3. 进行分层抽样和数据集划分:

使用GroupShuffleSplit对象,可以调用split()函数进行分层抽样和数据集划分。该函数会返回一个生成器,可以使用循环语句迭代得到不同的训练集和测试集。

for train_index, test_index in gss.split(X, y, groups=groups):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

4. 验证数据集划分结果:

最后,可以打印训练集和测试集的大小,以及每个数据集中不同类别样本的比例,以验证数据集划分是否成功。

print("训练集的大小:", len(X_train))
print("测试集的大小:", len(X_test))

# 计算每个数据集中不同类别样本的比例
train_counts = np.bincount(y_train)
test_counts = np.bincount(y_test)
train_ratios = train_counts / len(y_train)
test_ratios = test_counts / len(y_test)

for i, train_ratio in enumerate(train_ratios):
    print("训练集中类别{}的比例: {:.2f}".format(i, train_ratio))

for i, test_ratio in enumerate(test_ratios):
    print("测试集中类别{}的比例: {:.2f}".format(i, test_ratio))

这就是使用GroupShuffleSplit()进行分层抽样和数据集划分的步骤。通过使用这个函数,我们可以确保训练集和测试集中包含不同类别的样本,并且每个类别的样本比例相同。这对于在机器学习任务中进行可靠的模型评估非常重要。

接下来是一个使用GroupShuffleSplit()进行分层抽样和数据集划分的完整例子。我们使用鸢尾花数据集,并按照类别对数据集进行分层抽样和划分,以确保训练集和测试集包含每个类别的样本,并且每个类别的样本比例相同。

from sklearn.model_selection import GroupShuffleSplit
from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
X = iris.data
y = iris.target
groups = iris.target_names

gss = GroupShuffleSplit(n_splits=1, train_size=0.8, test_size=0.2)

for train_index, test_index in gss.split(X, y, groups=groups):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

print("训练集的大小:", len(X_train))
print("测试集的大小:", len(X_test))

# 计算每个数据集中不同类别样本的比例
train_counts = np.bincount(y_train)
test_counts = np.bincount(y_test)
train_ratios = train_counts / len(y_train)
test_ratios = test_counts / len(y_test)

for i, train_ratio in enumerate(train_ratios):
    print("训练集中类别{}的比例: {:.2f}".format(i, train_ratio))

for i, test_ratio in enumerate(test_ratios):
    print("测试集中类别{}的比例: {:.2f}".format(i, test_ratio))

运行上述代码,我们可以得到如下结果:

训练集的大小: 120
测试集的大小: 30
训练集中类别0的比例: 0.33
训练集中类别1的比例: 0.34
训练集中类别2的比例: 0.33
测试集中类别0的比例: 0.27
测试集中类别1的比例: 0.37
测试集中类别2的比例: 0.37

从结果中可以看出,训练集和测试集的大小和每个类别的样本比例都在合理的范围内,说明数据集划分成功。

总结起来,GroupShuffleSplit()函数可以用于进行分层抽样和数据集划分。通过指定训练集和测试集的大小,并提供一个指示样本属于哪个类别的分组信息,可以确保训练集和测试集中保留了每个类别的样本,并且每个类别的样本比例相同。这对于进行机器学习模型的可靠评估非常重要。