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

使用sklearn中的StratifiedKFold()方法进行数据集的分层交叉验证

发布时间:2024-01-01 18:52:07

在机器学习任务中,为了准确评估模型的性能,常常需要进行交叉验证。在交叉验证过程中,我们将数据集分为训练集和测试集,并多次重复这个过程来获取更稳定的结果。StratifiedKFold是sklearn中的一个可以用来进行分层交叉验证的方法。

首先,让我们从导入必要的库开始:

from sklearn.model_selection import StratifiedKFold

接下来,我们创建一个假想的数据集来说明StratifiedKFold的用法。数据集由100个样本组成,特征为X,目标变量为y。我们将使用Scikit-learn自带的鸢尾花数据集:

from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target

在进行分层交叉验证之前,我们可以看一下目标变量y的分布。我们可以使用numpy的unique函数来计算y的 值和对应的数量:

import numpy as np
unique_values, counts = np.unique(y, return_counts=True)
print(unique_values, counts)

得到的输出如下所示:

[0 1 2] [50 50 50]

这表示目标变量y有3个 值,每个值对应的数量为50。这是一个完美平衡的多分类问题。

现在,我们可以创建一个StratifiedKFold的实例,并指定分成几折。在这个例子中,我们将创建3折交叉验证:

n_splits = 3
stratified_kfold = StratifiedKFold(n_splits=n_splits)

之后,我们可以使用split方法来获取每个fold的训练集和测试集的索引:

for train_index, test_index in stratified_kfold.split(X, y):
    print("Train:", train_index, "Test:", test_index)

运行上述代码,我们将看到每个fold的训练集和测试集的索引打印出来。每个fold中的样本都是根据目标变量y的分布进行分层采样的。

接下来,我们可以在训练集上训练模型,然后在测试集上评估模型的性能。下面是一个使用Logistic回归模型的例子:

from sklearn.linear_model import LogisticRegression

accuracy_scores = []

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

    model = LogisticRegression()
    model.fit(X_train, y_train)
    
    accuracy = model.score(X_test, y_test)
    accuracy_scores.append(accuracy)

average_accuracy = np.mean(accuracy_scores)
print("Average Accuracy:", average_accuracy)

在每个fold上训练模型后,我们计算模型在测试集上的准确率,并将准确率保存在accuracy_scores列表中。最后,我们计算所有fold的准确率的平均值,作为模型的性能指标。

这就是如何使用StratifiedKFold进行分层交叉验证的例子。通过分层交叉验证,我们可以更可靠地评估模型的性能,在处理类别不平衡的数据集时尤为重要。